Как предотвратить SQL-инъекцию с динамическими именами таблиц? - PullRequest
19 голосов
/ 28 апреля 2011

У меня было это обсуждение с высокой репутацией PHP парень:

PDO здесь не используется.а также mysql_real_escape_string.очень низкое качество* В это

$layer = mysql_real_escape_string($_GET['layer']);
$query = "SELECT Category, COUNT(BUSNAME)
FROM `".$layer."` GROUP BY Category";

, учитывая, что код JavaScript отправляется на стороне клиента.

Ответы [ 3 ]

38 голосов
/ 28 апреля 2011

Ваш совет действительно неверен.

mysql_real_escape_string() не будет работать для динамических имен таблиц;он предназначен для экранирования строковых данных, ограниченных только кавычками .Это не ускользнет от обратного характера.Это небольшое, но важное различие.

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

PDO не обеспечивает санитарию для динамических имен таблиц, либо .

Вот почему хорошо не использовать динамические имена таблиц или, если нужно, сравнивать их со списком допустимых значений, например списком таблиц из команды SHOW TABLES.

Я тоже не совсем знал об этом, и, вероятно, был виновен в том, что повторял тот же плохой совет, пока мне здесь, на SO, не указал полковник Шрапнель.

5 голосов
/ 19 мая 2011

Для примера вот пример кода для исправления этой дыры.

$allowed_tables = array('table1', 'table2');
$clas = $_POST['clas'];
if (in_array($clas, $allowed_tables)) {
    $query = "SELECT * FROM `$clas`";
}
2 голосов
/ 28 апреля 2011

Чтобы ответить, как на самом деле исправить код:

'...FROM `' . str_replace('`', '``', $tableName) . '`...'

Это дублирует все обратные пометки в имени таблицы (так происходит экранирование в MySQL).

В одном я не уверен, является ли это «безопасным для кодирования» (как правильно его назвать?). Обычно рекомендуется mysql_real_escape_string вместо addslashes, потому что первый учитывает кодировку соединения MySQL. Может быть, эта проблема применима и здесь.

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