Я не могу больше согласиться с Матти Вирккуненом или с тем, что, по моему мнению, подразумевается в ответе Матти, поэтому позвольте мне сказать это громко и ясно: ничего"удалит весь вредоносный код". Вы никогда не можете знать, как данные будут использоваться в других частях приложения или в будущем. Вы можете «очистить» его для SQL, но вы не должны помещать в SQL ничего неэкранированного. Вы можете «очистить» его для HTML, но вы никогда не должны включать какие-либо данные, не экранированные в HTML. Вы можете «очистить» его для включения в параметр awk в сценарии оболочки, но ... вы поняли.
Даже проблема остановки неразрешима, тем более злонамеренные намерения любого данного кода или данных. Любые методы ввода «очистки» бесполезны в долгосрочной перспективе. Что необходимо, так это правильное экранирование данных. Всегда. Поэтому, если вы хотите включить что-либо в запрос SQL, включите его как данные , а не как код. Если вы хотите напечатать имя пользователя в записи блога, включите его как текст , а не как HTML. Никто никогда не пострадает, увидев комментарий от "Mr. alert ('XSS'); ", если имя пользователя закодировано в HTML или динамически добавлено в DOM как текстовый узел.
Все инструменты автоматической очистки - это не что иное, как волшебная пыль, добавляемая в вашу программу для обеспечения ее безопасности. Они говорят: «Здесь - мы сделали все ваши данные кошерными, чтобы вы могли теперь использовать их небезопасно и не беспокоиться о границах данных!» Это только приводит к ложному чувству безопасности. Мы, как разработчики, должны взять на себя ответственность за вывод наших данных и никогда не предполагать, что все отлично, потому что у нас есть инструмент, который делает все наши данные «безопасными», что бы это ни значило на входе.