В этом вопросе есть ряд ложных предположений, которые необходимо устранить.
- Вы не должны никогда вводить предоставленные пользователем данные в запрос. Вы должны экранировать эти данные, и самый простой способ сделать это с помощью подготовленных операторов с использованием значений заполнителей . То есть ваш запрос выглядит как
INSERT INTO x (a,b) VALUES (?,?)
, а затем вы связываетесь с каждым заполнителем. Драйвер SQL позаботится обо всем остальном, вам не о чем беспокоиться. В качестве немедленного бонуса вы больше не будете тратить время на отслеживание простых синтаксических ошибок в ваших запросах, потому что их будет очень легко читать, а ошибки будут очевидны.
- Вы должны никогда отображать пользовательский контент без экранирования, соответствующего контексту, в котором он отображается. То есть для HTML вы используете экранирующие HTML-функции, такие как
htmlspecialchars
, чтобы избежать XSS (перекрестный сценариев) атак.
- Вы должны никогда предварительно экранировать содержимое при вставке в базу данных. Вы должны вставить как можно более сырой и нейтральный. Если вы предварительно экранировали HTML, вы рискуете дважды экранировать, что может привести к появлению таких вещей, как
&&
, если вы проскальзываете. Помните, что не все является HTML. Иногда это JSON. Иногда это CSV. Иногда это тема письма. У каждого есть свой особый метод побега.
- Если вы чувствуете, что находитесь здесь над головой, и вас легко обескуражить, потому что безопасность - сложная и многоплановая проблема , вам следует начать с известной надежной основы и строить оттуда, используя лучшие практики. Базового PHP недостаточно, вам нужна инфраструктура, такая как Laravel , Fat-Free Framework или любая популярная, проверенная, поддерживаемая сообществом инфраструктура, которая обеспечивает защиту от этих проблем вне коробка.
Если принять все это во внимание, вашей проблемы не будет.
При тестировании вашего кода неплохо иметь целую кучу заведомо оскорбительных фрагментов, которые вы можете скопировать и вставить в поля ввода для проверки на типичные ошибки.
Проверьте ваш HTML на выход, если при сбое весь экран становится красным:
<div style="position:absolute;top:0;left:0;right:0;bottom:0;background:red">Uh oh</div>
Тест на проблемы с внедрением SQL:
It's not so <strong>"Bad"</strong>!
Тест на поддержку UTF-8, как 3-байтовые "символы", так и 4-байтовые эмодзи:
Do you want to build a ☃? How about a ❄️☃️?
Я также создаю случайные строки длиной 255, 256, 1024 и 65535, чтобы посмотреть, что происходит с форматированием страницы при вставке длинных неразбитых строк букв. Многие страницы будут полностью взорваны, если такого рода тестирование не будет выполнено явно. В некоторых приложениях происходит сбой при длинном вводе из-за патологически некорректных регулярных выражений, или они не могут обнаружить содержимое большой длины перед вставкой и обнаруживают неожиданную ошибку усечения.
В фреймворках часто есть способы выражения ограничений в вашей форме и для аккуратной обработки любых ошибок проверки входных данных перед развертыванием с экраном «Ошибка SQL».