Часть проблемы здесь в том, что вы хотите разрешить определенные виды HTML, верно? Ссылки к примеру. Но вам нужно очистить только те теги HTML, которые могут содержать атаки XSS, такие как теги сценария или даже атрибуты обработчика событий или атрибут href или другой атрибут, начинающийся с «javascript:». И поэтому полный ответ на ваш вопрос должен быть чем-то более сложным, чем «заменить специальные символы», потому что это не разрешит ссылки.
Предотвращение внедрения SQL может зависеть от выбора платформы. Моя предпочтительная веб-платформа имеет встроенный синтаксис для параметризации запросов, который в основном предотвращает SQL-инъекцию (называется cfqueryparam). Если вы используете PHP и MySQL, есть аналогичная встроенная функция mysql_escape (). (Я не уверен, что функция PHP технически создает параметризованный запрос, но до сих пор она хорошо работала для предотвращения попыток внедрения sql-инъекций, поскольку я видел некоторые из них, которые были безопасно сохранены в БД.)
Что касается защиты XSS, я использовал регулярные выражения для очистки ввода по этой причине, но с тех пор отошел от этого метода из-за сложности, связанной с разрешением таких вещей, как ссылки, и удалением опасного кода. В качестве альтернативы я перешел на XSLT. Опять же, способ выполнения XSL-преобразования может зависеть от вашей платформы. Я недавно написал статью для ColdFusion Developer Journal о том, как это сделать, которая включает в себя шаблонный XSL-лист , который вы можете использовать, и показывает, как заставить его работать с CF, используя встроенная функция XmlTransform ().
Причина, по которой я решил перейти на XSLT для этого, в два раза.
Во-первых, проверка правильности введенного XML-кода исключает возможность атаки XSS с использованием определенных приемов конкатенации строк.
Во-вторых, тогда проще манипулировать пакетом XHTML с помощью селекторов XSL и XPath, чем с помощью регулярных выражений, поскольку они специально предназначены для работы со структурированным XML-документом, по сравнению с регулярными выражениями, которые были разработаны для необработанных манипуляций со строками. Так что это намного чище и проще, я менее склонен совершать ошибки, и если я обнаружу, что сделал ошибку, ее легче исправить.
Также, когда я тестировал их, я обнаружил, что редакторы WYSIWYG, такие как CKEditor (он удалил F), сохраняют правильно сформированный XML, поэтому вам не придется беспокоиться об этом как о потенциальной проблеме.