Выполнение mysql_real_escape_string для флажков, переключателей или раскрывающихся меню?

Можно ли как-нибудь сделать инъекцию sql для флажков, переключателей или раскрывающихся меню (например, страна, год рождения)?

Кроме того, гипотетически, если кто-то введет имя своего кота в текстовое поле, достаточно ли будет выполнить следующую строку кода, прежде чем я вставлю их в таблицу mysql?

$catsName = preg_replace('/[^a-z]/i', '', $_POST['yourCat']);

Или мне бы к этому дополнительно?

$catsName = mysql_real_escape_string($_POST['yourCat']);

4 ответа

Решение

Радиокнопки, флажки и т. Д. Имеют значение в HTML-коде, которое может быть легко изменено с помощью firebug(есть много других подобных инструментов). Так что, лучше, если вы очистите все входные данные, которые дает пользователь.

А что касается второго вопроса, mysql_real_escape_string достаточно. Не нужно делать preg_replace

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

Объявление 2) Всегда использует функции драйверов вашей СУБД для экранирования и привязки параметров.

Всегда предполагайте, что клиент злой гений и умнее вас.

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

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

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

Итак, если вы используете флажок следующим образом...

if ($_POST['checkbox'] == 'on') { $val = 1; } else { $ val = 0; }
mysql_query("UPDATE table SET checkbox=$val");

ты в безопасности. С другой стороны, если вы решили сохранить полученное от пользователя значение и сравнить его...

mysql_query("UPDATE table SET checkbox={$_POST['checkbox']}")
...
if ($row['checkbox'] == 'on') { /* enable something */ }   

тогда "все ваши данные будут принадлежать хакерам":)

Что касается второго вопроса, preg может быть достаточно в этом конкретном случае, но если вы измените регулярное выражение или измените его неправильно, оно может стать недостаточным. Рекомендуется всегда избегать данных, передаваемых в базу данных, чтобы такие ошибки не делали ваш код уязвимым для SQL-инъекций.

Другие вопросы по тегам