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

0

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

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

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

Я прав?

  • 1
    Можем ли мы спросить, почему вы хотите избежать параметризованных запросов?
  • 0
    Параметризованные запросы имеют еще одно преимущество: ядро базы данных может оптимизировать и кэшировать план запросов, когда один и тот же запрос используется много раз, что повышает производительность. Почему бы не использовать их? У вас больше работы и вы рискуете самим с небезопасным решением.
Показать ещё 6 комментариев
Теги:
validation
mysqli
prepared-statement
parameterized-query

2 ответа

3

tl; dr NO

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

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

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

0

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

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

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

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

  • 0
    Еще раз спасибо, но моя проблема с использованием mysqli_stmt_bind_result () заключается в том, что вы не можете выполнить другой запрос в цикле while, используя mysqli_stmt_fetch () для получения результатов с помощью этого метода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню