Я знаю, что уже существует много вопросов по этой теме, однако ни один из них, на мой взгляд, не отвечает конкретно на мой вопрос.
Я создал простую функцию PHP, которая проверяет все введенные пользователем данные. Учитывая характер приложения, которое я разрабатываю, редко требуется использование каких-либо символов, кроме цифр и букв. Иногда запятые (,), дефисы (-), амперсанды (&) и одинарные кавычки (‘). Моя функция PHP гарантирует, что весь ввод содержит только эти символы, а затем добавляет одну обратную косую черту перед каждым экземпляром одного из этих символов.
Я предполагаю, что, если я гарантирую, что весь ввод передается через эту функцию перед использованием в запросе MySQLi, я защищен от внедрения SQL и не нуждаюсь в использовании подготовленных операторов, параметризованных запросов и т. Д., Касающихся только безопасности.
Я прав?
д-р нет
Есть много векторов атаки и много разных видов SQL-инъекция там Например, используйте неправильный метод из класса MySQLi, и вы будете открыты для многих атак.
Просто даже не думайте о создании своих собственных вещей, вы потерпите неудачу, вы сильно потерпите неудачу. Следуйте лучшим практикам и сосредоточьтесь на других частях, становясь самым удивительным программистом, которого когда-либо видел этот мир.
На последнем замечании, подготовленные заявления предлагают вам много преимуществ. Хотя кеширование запросов, как упомянуто @Zanon, к сожалению, не является одним из них, если вы используете MySQL (это было бы, например, с PostgreSQL). Но это зависит от документации используемого вами программного обеспечения (и его точных версий).
Из нашего обсуждения в комментариях видно, что основная причина, по которой вы хотите избежать параметризованных запросов, заключается в том, что вы не можете получить mysqli_stmt_get_result()
работает под MAMP, поскольку для него требуется собственный драйвер mysqlnd.
Фактически, это не имеет никакого отношения к вашей способности использовать параметризованные запросы или подготовленные операторы. Это расширение обычного метода извлечения связанных результатов из подготовленных операторов вместо старых (но все еще стандартных и отлично поддерживаемых) mysqli_stmt_bind_result()
, который будет работать без mysqlnd.
Пожалуйста, используйте параметризованные запросы. Если вы также хотите использовать подготовленные операторы со связанными переменными результата без драйвера mysqlnd, используйте mysqli_stmt_bind_result()
вместо mysqli_stmt_get_result()
,
Если у вас есть какие-либо проблемы с использованием параметризованных запросов, пожалуйста, опубликуйте новый вопрос с полным, минимальным примером кода, с которым у вас проблемы.