SQL-инъекция без подготовленных операторов или параметризованных запросов

Я знаю, что уже существует много вопросов по этой теме, однако ни один из них, на мой взгляд, не отвечает конкретно на мой вопрос.

Я создал простую функцию PHP, которая проверяет все введенные пользователем данные. Учитывая характер приложения, которое я разрабатываю, редко требуется использование каких-либо символов, кроме цифр и букв. Иногда запятые (,), дефисы (-), амперсанды (&) и одинарные кавычки (‘). Моя функция PHP гарантирует, что весь ввод содержит только эти символы, а затем добавляет одну обратную косую черту перед каждым экземпляром одного из этих символов.

Я предполагаю, что, если я гарантирую, что весь ввод передается через эту функцию перед использованием в запросе MySQLi, я защищен от внедрения SQL и не нуждаюсь в использовании подготовленных операторов, параметризованных запросов и т. Д., Касающихся только безопасности.

Я прав?

0

Решение

д-р нет

Есть много векторов атаки и много разных видов SQL-инъекция там Например, используйте неправильный метод из класса MySQLi, и вы будете открыты для многих атак.

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

На последнем замечании, подготовленные заявления предлагают вам много преимуществ. Хотя кеширование запросов, как упомянуто @Zanon, к сожалению, не является одним из них, если вы используете MySQL (это было бы, например, с PostgreSQL). Но это зависит от документации используемого вами программного обеспечения (и его точных версий).

3

Другие решения

Из нашего обсуждения в комментариях видно, что основная причина, по которой вы хотите избежать параметризованных запросов, заключается в том, что вы не можете получить mysqli_stmt_get_result() работает под MAMP, поскольку для него требуется собственный драйвер mysqlnd.

Фактически, это не имеет никакого отношения к вашей способности использовать параметризованные запросы или подготовленные операторы. Это расширение обычного метода извлечения связанных результатов из подготовленных операторов вместо старых (но все еще стандартных и отлично поддерживаемых) mysqli_stmt_bind_result(), который будет работать без mysqlnd.

Пожалуйста, используйте параметризованные запросы. Если вы также хотите использовать подготовленные операторы со связанными переменными результата без драйвера mysqlnd, используйте mysqli_stmt_bind_result() вместо mysqli_stmt_get_result(),

Если у вас есть какие-либо проблемы с использованием параметризованных запросов, пожалуйста, опубликуйте новый вопрос с полным, минимальным примером кода, с которым у вас проблемы.

0

По вопросам рекламы [email protected]