Я обнаружил, что использование получателей реального имени и фамилии в теле - это надежный способ получить фильтр спама.
Это растяжка, и маловероятно, но я бы не зашел так далеко, чтобы сказать, что это невозможно. So....
Все равно используйте параметризованные запросы.
Даже если вы никогда не будете атакованы через поле IP-адреса, вы все равно получите дополнительное преимущество более быстрых запросов через кэширование.
.Вы можете использовать функции фильтрации данных PHP.
filter_var() с функцией FILTER_VALIDATE_IP проверит удаленный IP. Если удаленный IP действителен, используйте его в SQL.
EDIT: 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
Надеюсь, это поможет,
Симеон
.Всегда дезинфицируйте все внешние входы - используйте mysql_real_escape_string
, а еще лучше подготовленные заявления
Я думаю, что единственным способом для кого-то подделать $_SERVER['REMOTE_ADDR']
будет создание IP-пакета с фальшивым IP-адресом (потому что он устанавливается сервером, а не клиентом), и в этом случае ответы будут перенаправляться обратно на фальшивый адрес. Если вас беспокоят инъекционные атаки, я думаю, что вы в порядке, потому что поля адресов в IP-пакетах имеют место только для адресов.
REMOTE_ADDR посылается не клиентом, а сервером. Хотя технически возможно подделать IP-адрес на сетевом уровне, атакующий должен работать вслепую. Самое хитрое - это угадать номер последовательности . (В разделе Coldfusion, кстати, это другая история .)
Как уже говорили другие, используйте подготовленные операторы, и вам не нужно беспокоиться о SQL инъекции (хотя возможны и другие типы атак на инъекции).
.Я всегда добавляю этот код во все свои проекты (какая-то начальная дезинфекция входных данных), чтобы предотвратить неприятную ситуацию с фальшивыми 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...");
}
Для эффективности и безопасности вы можете захотеть хранить и работать с IP-адресами как с инъекциями в вашей базе данных.
Простой способ хранения IP-адресов - использование поля варратора в вашей БД. Однако, другой способ представления 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']));
Вы не можете полагаться на истинность REMOTE_ADDR ... это может быть неправильный адрес из-за анонимности прокси-серверов или подобного трюка. Вы можете полагаться на то, что он всегда будет IP-адресом, поэтому SQL-инъекция по этому пути невозможна.
Внизу стека, он был преобразован из исходного адреса пакетов, устанавливающих TCP-соединение с вашим сервером. Это означает, что а) это должен быть IP-адрес и б) он должен возвращаться к клиенту, чтобы соединение вообще произошло.