В общем нужно чтобы при входе на страницу проверялось с родного ли хоста пришёл посетитель на эту страницу. Использую strstr(), но работает некоректно: PHP: <?php #Адрес сайта $servname = "http://site.ru/"; #Получаю реферер $ref = "getenv('HTTP_REFERER')"; if(strstr($servname, '$ref')) {echo"Всё ок";} else {echo"Данные пришли с другого сайта";} ?> Может это из-за http:// или www?..... полночи сидел пытался сделать проверку используя и strstr() и strpos() и substr() ничего не получается....намучился, решил обратиться к вам И ещё один вопрос Нужно ли фильтровать get-запросы, например: PHP: <?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";} ?> ну и т.д.....так вот нужно фильтровать эти геты? потому что смотрел несколько движков, нигде не фильтруют их..
.:ENOT:., лучше поиск в реферере осуществлять по $_SERVER["HTTP_HOST"], но будь готов что реферер подделывается в два пинка... В данном случае геты фильтровать не нужно, т.к. ты с ними не работаешь (не evalишь, не сохраняешь в базе, не выводишь куда либо... Если юзер будет с ними химичить - максимум чего добьётся - пустрой страницы.
Тогда как лучше осуществить проверку? Короче вот в чём суть, пишу я движок (свой первый в жизни движок). Есть там форма входа, которая находится на нескольких страницах, скрипт входа соответственно login.php так вот мне нужно сделать проверку, действительно ли данные пришли с родного хоста или нет. Можно было бы конечно создать какой-нить файл типо login_form.php и инклудить его в те места где должна быть форма, но эт тоже не выход....или можно было создать форму входа прям в самом login.php но так не получится в данном случае, да и переделывать код не очень хочется. Вариант со скрытым полем в форме тоже не подходит С гетами всё понятно, спасибо, всем по плюсегам))
В общем проверку на реферер делай так (проверка по хосту): PHP: if (strstr($_SERVER["HTTP_REFERER"], $_SERVER["HTTP_HOST"]) === FALSE) die("Креведко?"); или так (проверка включая страницу): PHP: if (strstr($_SERVER["HTTP_REFERER"], "somehost.somedomain/somedir/somepage.php") === FALSE) die("Креведко?"); Но я ещё раз повторяюсь - это не панацея...
[x26]VOLAND Вот за это огромное спасибо, буду пользоваться groundhog Спасибо, буим значит так проверять.... Жалко что плюсеги не могу ещё раз поставить, но обещаю)) Просто хотел реализовать чтобы данные приходили с родного хоста, а если заголовки подделаны или с другого хоста пришли, чтобы не авторизовывал. Хотя может я уж слишком преувеличиваю, просто начитался книжек по безопасному php-кодингу и теперь фильтрую всё, даже то что в общем-то не надо фильтровать, поэтому и подумал что надо бы реализовать проверку входных данных. Движок делаю под свои нужны. поэтому не хочется чтоб дырявый как сито был, а всё фильтровалось и проверялось. да и по большей мере самому себе лучше будет в дальнейшем написании безопасных скриптов
.:enot:., золотое правило в веб-разработке - никаким данным, приходящим от пользователя доверять нельзя. Всё нужно перепроверять...
PHP: if (strstr($_SERVER["HTTP_REFERER"], $_SERVER["HTTP_HOST"]) === FALSE) die("Креведко?"); Я бы сделал так: PHP: if (strpos($_SERVER["HTTP_REFERER"], $_SERVER["HTTP_HOST"]) === FALSE) die("Креведко?"); В документации сказано, что strpos работает быстрее strstr, поэтому его использование предпочтительней