У меня есть приложение, которое принимает данные через запрос POST. Я использую эти данные для вставки новой строки в базу данных. Я знаю, что использование mysql_real_escape_string()
(плюс удаление% и _) – это путь для строк, но как насчет целых значений? Прямо сейчас, я использую функцию PHP intval()
на них.
Однако я хотел убедиться, что intval()
абсолютно безопасен. Я не вижу способа атакующего, который предварительно формирует атаку SQL-инъекций, когда переменные запускаются через intval()
сначала (так как он всегда возвращает целое число), но я хотел убедиться, что это относится к людям, у которых больше опыта Затем я.
Благодарю.
Да, intval()
безопасен. Невозможно выполнить SQL-инъекцию, когда параметр преобразуется в целое число, потому что (очевидно) формат целого не позволяет помещать в него ключевые слова SQL (или кавычки или что-то еще).
Самый простой способ предотвратить SQL-инъекцию – всегда использовать подготовленные данные. Используйте библиотеки mysqli или еще лучше ORM, такие как доктрина и т. Д.
Затем ваши запросы будут выглядеть примерно так:
$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 будет фактическое целое число, которое вполне безопасно для обработки.
Подготовленная заявка – лучший способ справиться с SQL-инъекцией. или использовать PDO в противном случае, intval лучше, чем is_numeric