У меня есть приложение, которое берет данные через запрос POST. Я использую эти данные для вставки новой строки в базу данных. Я знаю то использование mysql_real_escape_string()
(плюс удаление % и _), путь состоит в том, чтобы пойти для строк, но что относительно целочисленных значений? Прямо сейчас я использую функцию PHP intval()
на них.
Однако я хотел удостовериться это intval()
совершенно безопасно. Я не вижу способ взломщика, формующего атаку с использованием кода на SQL, когда переменные пробегаются intval()
сначала (так как это всегда возвращает целое число), но я хотел удостовериться дело обстоит так от людей, которые имеют больше опыта, чем я.
Спасибо.
Да, intval ()
безопасен. Нет абсолютно никакого способа выполнить SQL-инъекцию, когда параметр преобразован в целое число, потому что (очевидно) формат целого числа не позволяет помещать в него ключевые слова SQL (или кавычки, или что-то еще).
Подготовленное состояние - лучший способ справиться с внедрением sql. или используйте PDO в противном случае intval лучше, чем is_numeric
Самый простой способ предотвратить SQL-инъекции - всегда использовать подготовленные утверждения. Используйте библиотеки mysqli или, еще лучше, ORM, такие как doctrine и т.д.
Тогда ваши запросы станут чем-то вроде:
$stmt = $db->prep_stmt("select * from .... where userid = ? and username = ?");
/* Binding 2 parameters. */
$stmt->bind_param("is", $userid, $username);
$userid = 15;
$username = "don";
/* Executing the statement */
$stmt->execute( ) or die ("Could not execute statement");
Я всегда делаю
$var = (int)$_POST['var'];
чтобы убедиться, что $var обрабатывается как целое число при любых обстоятельствах, и никогда больше не смотрю на $_POST['var']. Если посмотреть руководство, то intval() делает точно так же.
Каким бы путем вы ни пошли, в дальнейшем $var будет настоящим целым числом, с которым вполне безопасно работать.