Выполнение 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-инъекций.