Способ остановить все SQL-инъекции в одной функции? - PullRequest
0 голосов
/ 02 ноября 2011

Учитывая 1000-секундные запросы mysql в строковом формате, может ли быть способ проанализировать и удалить любые SQL-инъекции из этих строк перед выполнением запроса?

Одна идея, которую я имел, состояла в том, чтобы проверить строку на наличие общих слов /фразы, которые используются в SQL-инъекции, которые никогда не используются в приложении, выполняющем запросы.Если найдено, не запускайте запрос и не предупреждайте администраторов.

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

mySQL поощряет использование mysql_real_escape_string для очистки запросов.

Экранирует специальные символы в строке unescaped_string, принимая во внимание текущий набор символов соединения, чтобы можно было безопасно разместить его в mysql_query ().Если необходимо вставить двоичные данные, необходимо использовать эту функцию.

mysql_real_escape_string () вызывает библиотечную функцию MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \ x00, \ n, \ r, \, ',"и \ x1a.

Эта функция должна всегда (за небольшим исключением) использоваться для обеспечения безопасности данных перед отправкой запроса в MySQL.

PS: Вот хороший ответ наaddslashes / mysql_real_escape_string дискуссия: http://www.sitepoint.com/forums/showthread.php?337881-addslashes()-vs-mysql_real_escape_string()...the-final-debate&s=7cabb6e5fd909f2c787d47cd01471dfb&p=2439889&viewfull=1#post2439889

1 голос
/ 02 ноября 2011

одна идея, которую я имел, состояла в том, чтобы проверить строку на наличие общих слов / фраз, которые используются в внедрении SQL, которые никогда не используются в приложении, выполняющем запросы.Если найдено, не запускайте запрос и не предупреждайте администраторов.

Чрезвычайно плохая идея.

Решение состоит в том, чтобы использовать PDO: http://php.net/manual/en/ref.pdo-mysql.php

и передать все $ переменные с использованием параметров.
Если вам нужно использовать динамический SQL,убедитесь, что вы проверили введенные данные в белый список.
См. этот вопрос о том, как безопасно это сделать: Как предотвратить внедрение SQL с динамическими именами таблиц?

Теперь вы сохранены.

Если вы не можете использовать PDO, используйте mysql_real_escape_string().
Вот пример:

$var = mysql_real_escape_string($_POST['unsafe_value']);
$query = "SELECT * FROM user WHERE username = '$var' ";
// The quotes are vital, without them         ^    ^  
//you will may get syntax errors and mysql_real.... will not protect you!

Вы можете использовать это только для параметров , а не для таблицы,столбец, имена базы данных или конструкции SQL, также не забывайте всегда заключать в кавычки '$vars'.
Для всех значений, кроме значений, вы должны использовать белый список.
Обратите внимание, что addslashes не работает и не должен использоваться!
Для целочисленных значений вы можете использовать intval (), но я советую против этого: это не экономит время, затрудняет чтение вашего кода и нарушает правило всегда использовать mysql_real_escape_string().

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