Как защитить от MySQL инъекции "select select" - PullRequest
0 голосов
/ 23 июня 2011

Простой вопрос: как я могу защитить, чтобы, когда пользователь вводит «union select» в поле и затем отправляет его в качестве параметра в запрос, mysql не выдаст ошибку.

Должен ли я просто проверить, вводится ли "union select" или существуют также другие ключевые слова, которые могут привести к ошибке mysql?

Вот функция защиты SQL, которую я сейчас использую:

function sql_protect(&$n){ 
  $n=stripslashes($n);
  $n=mysql_real_escape_string($n);
  $dntwant = array("\'","\\", "/","\"",")","(","<",">","\\r\\n",";","*","%");
  $n = str_replace($dntwant,"", $n);
}

В запросе есть что-то похожее:

where column1 like '%$user_input%'

Ответы [ 2 ]

4 голосов
/ 23 июня 2011

Вам нужно две вещи

Либо используйте PDO, проверка не требуется. PDO все делает.

Или используйте:

$var = mysql_real_escape_string($_POST['var']);
$query = "SELECT * FROM test WHERE var = '$var' ";
//                                       ^    ^  These single quotes are vital!!

Это все, что вам нужно сделать, забыть о полосках и str_replace.

Если вы хотите использовать динамические имена баз данных / таблиц / столбцов или хотите ввести числа для предложения limit, будьте предупреждены 1012 * mysql_real_escape_string не будет работать. Также не будет PDO.
Ничто не сработает, кроме проверки входных данных, которые вы собираетесь внедрить, в предварительно утвержденный белый список.

См. Этот вопрос о том, как это сделать: Как предотвратить внедрение SQL с динамическими именами таблиц?

0 голосов
/ 23 июня 2011

Попробуйте подготовить и выполнить запрос:

$stmt = $db->prepare("SELECT * FROM test WHERE column1 LIKE ?");
$stmt->execute(array("%{$user_input}%"));
...