PDA

Просмотр полной версии : С родного ли хоста пришли данные...


.:EnoT:.
22.11.2007, 15:08
В общем нужно чтобы при входе на страницу проверялось с родного ли хоста пришёл посетитель на эту страницу.
Использую strstr(), но работает некоректно:

<?php
#Адрес сайта
$servname = "http://site.ru/";
#Получаю реферер
$ref = "getenv('HTTP_REFERER')";
if(strstr($servname, '$ref'))
{echo"Всё ок";}
else
{echo"Данные пришли с другого сайта";}
?>

Может это из-за http:// или www?..... полночи сидел пытался сделать проверку используя и strstr() и strpos() и substr() ничего не получается....намучился, решил обратиться к вам :)

И ещё один вопрос
Нужно ли фильтровать get-запросы, например:
<?php
if($_GET['do'] == null or empty($_GET['do']))
{echo"Это страница test.php";}
elseif($_GET['do'] == 'preved')
{echo"Это страница test.php?do=preved";}
elseif($_GET['do'] == 'krevedko')
{echo"Это страница test.php?do=krevedko";}
?>
ну и т.д.....так вот нужно фильтровать эти геты? потому что смотрел несколько движков, нигде не фильтруют их..

GreenBear
22.11.2007, 15:20
Может это из-за http:// или www?.
из-за ковычек.
ак вот нужно фильтровать эти геты?
нет

groundhog
22.11.2007, 15:33
.:ENOT:., лучше поиск в реферере осуществлять по $_SERVER["HTTP_HOST"], но будь готов что реферер подделывается в два пинка...

В данном случае геты фильтровать не нужно, т.к. ты с ними не работаешь (не evalишь, не сохраняешь в базе, не выводишь куда либо... Если юзер будет с ними химичить - максимум чего добьётся - пустрой страницы.

.:EnoT:.
22.11.2007, 16:15
.:ENOT:., лучше поиск в реферере осуществлять по $_SERVER["HTTP_HOST"], но будь готов что реферер подделывается в два пинка...
Тогда как лучше осуществить проверку?
Короче вот в чём суть, пишу я движок (свой первый в жизни движок:)). Есть там форма входа, которая находится на нескольких страницах, скрипт входа соответственно login.php так вот мне нужно сделать проверку, действительно ли данные пришли с родного хоста или нет.
Можно было бы конечно создать какой-нить файл типо login_form.php и инклудить его в те места где должна быть форма, но эт тоже не выход....или можно было создать форму входа прям в самом login.php но так не получится в данном случае, да и переделывать код не очень хочется.
Вариант со скрытым полем в форме тоже не подходит

С гетами всё понятно, спасибо, всем по плюсегам))

groundhog
22.11.2007, 16:38
В общем проверку на реферер делай так (проверка по хосту):

if (strstr($_SERVER["HTTP_REFERER"], $_SERVER["HTTP_HOST"]) === FALSE) die("Креведко?");

или так (проверка включая страницу):

if (strstr($_SERVER["HTTP_REFERER"], "somehost.somedomain/somedir/somepage.php") === FALSE) die("Креведко?");

Но я ещё раз повторяюсь - это не панацея...

.:EnoT:.
22.11.2007, 16:57
[x26]VOLAND
Вот за это огромное спасибо, буду пользоваться :)
groundhog
Спасибо, буим значит так проверять....

Жалко что плюсеги не могу ещё раз поставить, но обещаю))

А зачем тебе вообще это?
Просто хотел реализовать чтобы данные приходили с родного хоста, а если заголовки подделаны или с другого хоста пришли, чтобы не авторизовывал. Хотя может я уж слишком преувеличиваю, просто начитался книжек по безопасному php-кодингу и теперь фильтрую всё, даже то что в общем-то не надо фильтровать, поэтому и подумал что надо бы реализовать проверку входных данных. Движок делаю под свои нужны. поэтому не хочется чтоб дырявый как сито был, а всё фильтровалось и проверялось. да и по большей мере самому себе лучше будет в дальнейшем написании безопасных скриптов:)

groundhog
22.11.2007, 17:07
.:enot:., золотое правило в веб-разработке - никаким данным, приходящим от пользователя доверять нельзя. Всё нужно перепроверять...

[Raz0r]
22.11.2007, 22:50
if (strstr($_SERVER["HTTP_REFERER"], $_SERVER["HTTP_HOST"]) === FALSE) die("Креведко?");
Я бы сделал так:

if (strpos($_SERVER["HTTP_REFERER"], $_SERVER["HTTP_HOST"]) === FALSE) die("Креведко?");

В документации сказано, что strpos работает быстрее strstr, поэтому его использование предпочтительней