Внедрение SQL IP-адреса

Я обнаружил, что использование получателей реального имени и фамилии в теле - это надежный способ получить фильтр спама.

13
задан Cyclone 7 January 2010 в 04:07
поделиться

8 ответов

Это растяжка, и маловероятно, но я бы не зашел так далеко, чтобы сказать, что это невозможно. So....

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

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

.
16
ответ дан 1 December 2019 в 18:06
поделиться

Вы можете использовать функции фильтрации данных 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

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

Симеон

.
2
ответ дан 1 December 2019 в 18:06
поделиться

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

5
ответ дан 1 December 2019 в 18:06
поделиться

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

.
6
ответ дан 1 December 2019 в 18:06
поделиться

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

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

.
1
ответ дан 1 December 2019 в 18:06
поделиться

Я всегда добавляю этот код во все свои проекты (какая-то начальная дезинфекция входных данных), чтобы предотвратить неприятную ситуацию с фальшивыми 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...");
}
1
ответ дан 1 December 2019 в 18:06
поделиться

Для эффективности и безопасности вы можете захотеть хранить и работать с 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']));
1
ответ дан 1 December 2019 в 18:06
поделиться

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

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

11
ответ дан 1 December 2019 в 18:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: