SQL-инъекция IP-адреса - PullRequest
       31

SQL-инъекция IP-адреса

13 голосов
/ 07 января 2010

Возможно ли пользователю подделать результат, возвращаемый из $_SERVER['REMOTE_ADDR'] в PHP, чтобы он теоретически мог использовать SQL-инъекцию в базу данных?

Это немного глупо, но я все еще достаточно новичок в PHP, и я хочу знать, можно ли это сделать, нужно ли мне очищать входные данные базы данных, когда оператор SELECT выбирает из IPадреса возвращены с $_SERVER['REMOTE_ADDR'].Итак, если бы я хотел использовать что-то вроде $query = "SELECT * FROM users WHERE IP='" . $_SERVER['REMOTE_ADDR'] . "'";, была бы какая-то опасность для меня?

Опять же, возможно, это вопрос "nooby", но я чувствую, что его нужно задать.

Спасибо

Ответы [ 8 ]

16 голосов
/ 07 января 2010

Это натянуто и маловероятно, но я бы не сказал, что это невозможно.Итак ....

В любом случае использовать параметризованные запросы.

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

10 голосов
/ 07 января 2010

Вы не можете полагаться на то, что REMOTE_ADDR является истинным ... это может быть неправильный адрес из-за анонимных прокси или какого-то другого трюка. Вы можете полагаться на то, что он всегда является IP-адресом, поэтому внедрение SQL по этому пути невозможно.

Внизу стека, он был преобразован из адреса источника в пакетах, устанавливающих TCP-соединение с вашим сервером. Это означает, что а) это должен быть IP-адрес и б) он должен перенаправить обратно к клиенту, чтобы соединение вообще произошло.

6 голосов
/ 07 января 2010

Я думаю, что единственный способ подделать $_SERVER['REMOTE_ADDR'] - это создать IP-пакет с поддельным IP-адресом (потому что он установлен сервером, а не клиентом), и в этом случае ответы будут перенаправлены обратно на фальшивый адрес. Если вас беспокоят атаки с использованием инъекций, я думаю, что вы в порядке, поскольку в полях адреса в IP-пакетах есть место только для адресов.

5 голосов
/ 07 января 2010

Всегда дезинфицировать все внешние входы - используйте mysql_real_escape_string или, что еще лучше, подготовленные операторы

2 голосов
/ 07 января 2010

Вы можете использовать функции фильтрации данных PHP.

filter_var () с FILTER_VALIDATE_IP будет проверять удаленный IP. Если удаленный IP-адрес действителен, используйте его в SQL.

РЕДАКТИРОВАТЬ: filter_input () с INPUT_SERVER является еще одним вариантом;)

http://www.php.net/manual/en/book.filter.php

http://www.php.net/manual/en/filter.filters.validate.php

http://www.php.net/manual/en/function.filter-var.php

http://www.php.net/manual/en/function.filter-input.php

Надеюсь, это поможет,

Семена

1 голос
/ 07 января 2010

Для эффективности и безопасности вы можете хранить и работать с IP-адресами в виде целых в вашей базе данных.

Простой способ хранения IP-адресов - использовать поле varchar в вашей БД. Однако другой способ представления IP-адресов - это целое число. Преобразование предоставленного IP-адреса таким образом обезврежит его, а также повысит эффективность хранения и запросов. Хранение INT занимает меньше места в БД и работает лучше для индексации, и я считаю, что кеширование запросов.

Проверьте ip2long и long2ip для преобразования функций PHP, и inet_aton и inet_ntoa для этого в MySQL.

Итак, процесс может идти как

$user_ip=ip2long($_SERVER['REMOTE_ADDR']);
if(!$user_ip){ //returned false due to odd input
   echo 'wtf, yo';
   }
else{
   //do your query
   }

Вы также можете очистить IP-адрес и сохранить его в первоначальной точечной четырехугольной форме, комбинируя два

$user_ip=long2ip(ip2long($_SERVER['REMOTE_ADDR']));
1 голос
/ 07 января 2010

REMOTE_ADDR не отправляется клиентом, он устанавливается сервером. Хотя технически возможно подделать IP-адрес на сетевом уровне, злоумышленник должен работать вслепую. Самое сложное - угадать порядковый номер . (Кстати, под Coldfusion это другая история .)

Как уже говорили другие, используйте подготовленные операторы, и вам не нужно беспокоиться о внедрении SQL-кода (хотя возможны другие типы атак внедрения).

1 голос
/ 07 января 2010

Я всегда помещал этот код во все свои проекты (некоторая начальная очистка ввода), чтобы предотвратить что-то неприятное с использованием поддельных IP-адресов. Я не уверен, что они все равно могут подделать REMOTE_ADDR.

function validate_ip($ip) {
    // Try IPv4 First, as its the most used method right now
    if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
        // Oops... try v6
        if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
            return false; // Sorry...
        }
        else {
            return true;
        }
    }
    else {
        return true;
    }
}
if(!isset($_SERVER['REMOTE_ADDR'])) # wtf?
    die("Could not find your IP Address...");
else {
    if(validate_ip($_SERVER["REMOTE_ADDR"]))
        die("Could not validate your IP Address...");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...