С родного ли хоста пришли данные...

Discussion in 'PHP' started by .:EnoT:., 22 Nov 2007.

  1. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    В общем нужно чтобы при входе на страницу проверялось с родного ли хоста пришёл посетитель на эту страницу.
    Использую 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";}
    ?>
    ну и т.д.....так вот нужно фильтровать эти геты? потому что смотрел несколько движков, нигде не фильтруют их..
     
  2. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,548
    Likes Received:
    1,397
    Reputations:
    612
    из-за ковычек.
    нет
     
  3. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    .:ENOT:., лучше поиск в реферере осуществлять по $_SERVER["HTTP_HOST"], но будь готов что реферер подделывается в два пинка...

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

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Тогда как лучше осуществить проверку?
    Короче вот в чём суть, пишу я движок (свой первый в жизни движок:)). Есть там форма входа, которая находится на нескольких страницах, скрипт входа соответственно login.php так вот мне нужно сделать проверку, действительно ли данные пришли с родного хоста или нет.
    Можно было бы конечно создать какой-нить файл типо login_form.php и инклудить его в те места где должна быть форма, но эт тоже не выход....или можно было создать форму входа прям в самом login.php но так не получится в данном случае, да и переделывать код не очень хочется.
    Вариант со скрытым полем в форме тоже не подходит

    С гетами всё понятно, спасибо, всем по плюсегам))
     
    #4 .:EnoT:., 22 Nov 2007
    Last edited: 22 Nov 2007
    1 person likes this.
  5. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    В общем проверку на реферер делай так (проверка по хосту):

    PHP:
    if (strstr($_SERVER["HTTP_REFERER"], $_SERVER["HTTP_HOST"]) === FALSE) die("Креведко?");
    или так (проверка включая страницу):

    PHP:
    if (strstr($_SERVER["HTTP_REFERER"], "somehost.somedomain/somedir/somepage.php") === FALSE) die("Креведко?");
    Но я ещё раз повторяюсь - это не панацея...
     
    2 people like this.
  6. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    [x26]VOLAND
    Вот за это огромное спасибо, буду пользоваться :)
    groundhog
    Спасибо, буим значит так проверять....

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

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

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    .:enot:., золотое правило в веб-разработке - никаким данным, приходящим от пользователя доверять нельзя. Всё нужно перепроверять...
     
  8. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    PHP:
    if (strstr($_SERVER["HTTP_REFERER"], $_SERVER["HTTP_HOST"]) === FALSE) die("Креведко?");
    Я бы сделал так:
    PHP:
    if (strpos($_SERVER["HTTP_REFERER"], $_SERVER["HTTP_HOST"]) === FALSE) die("Креведко?");
    В документации сказано, что strpos работает быстрее strstr, поэтому его использование предпочтительней
     
    2 people like this.