REMOTE_ADDR и HTTP_X_FORWARDED_FOR

Тема в разделе "PHP", создана пользователем yeaahhh, 7 авг 2011.

Модераторы: latteo
  1. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Ребят, сегодня на сайте произошло ЧП. От нескольких пользователей произошла небольшая рассылка "плохих" сообщений. Смотрю в БД - все показатели пользователей (ip и т.п.) являются реальными ip этих пользователей. Т.е. как будто реально они сделали рассылку. Но они всячески отрицают это.
    Вопрос: можно ли как-то подделать ip?
    IP определяется через:
    PHP:
    $ip=getenv("HTTP_X_FORWARDED_FOR");
    if (empty(
    $ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR"); }
    Или же может быть такое, что несколько пользователей сидят на одном и том же ip?
    И что значат вот такие записи после доабвления $ip в БД:
    178.123.61.101, 80.239.242.207.
    Прям руки опускаются от неизвестности..(
     
  2. PHPCod3r

    PHPCod3r

    Регистр.:
    7 июн 2010
    Сообщения:
    261
    Симпатии:
    25
    Загаловки типа HTTP_блабла изменяются элементарно в любом хттп дебагере, ну или в файрфоксе через этот плугин

    Перейти по ссылке
    установите еще и этот плугин
    Перейти по ссылке
    и убедитесь сами


    Так что я советую погрепать все скрипты на вхождения типа HTTP_
    и посмотреть куда дальше попадают эти данные, потому что если в базу то там и до иньекции не далеко....
     
  3. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Извиняюсь, не могли бы вы поподробнее о "погрепать все скрипты на вхождения типа HTTP_".. Немного не понял..
     
  4. Maza

    Maza

    Регистр.:
    3 июл 2007
    Сообщения:
    255
    Симпатии:
    118
    Команда на unix системе grep.Или preg_grep для php. Ищет записи в соответствии с регулярным выражением. Или ещё можно preg_match_all воспользоваться.
     
  5. -=Xardas=-

    -=Xardas=-

    Регистр.:
    17 сен 2008
    Сообщения:
    250
    Симпатии:
    58
    причем тут эта хрень? Лишь бы посты понабирать?

    он имеет ввиду что не нужно опускатся до такого идиотизма, и проверять IP таким образом, если у вас мания того что кто то ходит через прокси, и ломает ваш сайтик, создайте дополнительное поле в базе, в которое записывайте значение HTTP_X_FORWARDED_FOR и т.п. подобных заголовков, которые можно легко подделать.

    Есть аксиома - все данные присланые от пользователя нельзя считать достоверными, кроме тех, которые невозможно подделать в силу технических причин. А вы так просто берете и доверяете присланным данным, а потом удивляетесь, почему они не достоверны?
     
  6. DrakonHaSh

    DrakonHaSh

    Регистр.:
    29 июн 2010
    Сообщения:
    358
    Симпатии:
    122
    ip подделать, в общем случае, нельзя. А вот в заголовок запроса HTTP_X_FORWARDED_FOR можно вставить вообще все, что угодно.
    если ip у вас определяется лишь в одном приведенном вами месте, то измените его на:
    PHP:
    $ip=getenv("REMOTE_ADDR");
    $ipFF=getenv("HTTP_X_FORWARDED_FOR");
    if (!empty(
    $ipFF) && $ipFF!='unknown'

      
    //  если вам вообще нужно сохранять этот HTTP_X_FORWARDED_FOR
      
    $ip.= ' , HTTP_X_FORWARDED_FOR=[ '.$ipFF.' ]';
    }
    кстати, вполне возможно на вашем сайте нашли активную xss, послали фейковые письма/ссылки вашим юзерам и теперь, когда они открывают эти письма/ссылки, от их имени может идти спам.
     
  7. PHPCod3r

    PHPCod3r

    Регистр.:
    7 июн 2010
    Сообщения:
    261
    Симпатии:
    25

    Под никсы можно и в консоле командой grep, но это требует неких
    навыков, и я думаю будет для новичка сложновато, а под винду
    есть такая утилита
    Перейти по ссылке
    Алгоритм такой сначало находите те места в коде, которые содержат
    данные полученные из хедеров, например что то такое
    $_SERVER['HTTP_ACCEPT_LANGUAGE']
    $_SERVER['HTTP_HOST']
    $_SERVER['HTTP_REFERER']
    $_SERVER['HTTP_X_FORWARDED_FOR']
    (В эти переменные пользователь, может засунуть все что угодно)
    потом смотрите, как ваш скрипт оперирует с этими данными..
    Ну и дальше делаете выводы....

    Если данные из заголовков не вильтруются, то может быть все что
    угодно, от подмены IP в HTTP_X_FORWARDED_FOR, до SQL иньекции(такие иньекции на багтракках описаны можете поискать)



    А проверить IP имхо лучше так $_SERVER['REMOTE_ADDR']
    это вроде через модифай хедерс в файрфоксе не подделать

    Да еще можно логировать не только IP но и юзер агенты, ну и если
    есть подозрение по поводу пользователей, сравните юзер агенты...