Хитрость не в том, чтобы манипулировать пользовательским вводом. Вам следует проверить / отклонить ввод данных пользователем (пример: пользователь загружает 10 ГБ данных или пользователь запускает элемент div, но не завершает его), но не изменяйте его. Он никуда не денется и не заразит кого-либо, сидя в базе данных.
Когда вы отображаете страницу пользователю, то есть когда вы манипулируете данными. Как вы и сказали, избегайте символов: <для <, & amp для & и & quot для “. </p>
Я недавно программировал для этого, и я использовал XML-парсер (luaexpat). В вашем случае у вас есть PHP с библиотекой парсера XML.
Запустите пользовательский ввод HTML через анализатор XML. Если появляются какие-либо неавторизованные элементы, вы можете либо экранировать их (<) на выходе, либо выдать ошибку вместо содержимого. Также хорошо убедиться, что содержимое имеет допустимый XML, чтобы пользователь не мог испортить оставшуюся часть страницы, не закрывая элемент. </p>
Другая идея - хранить «идентификаторы версий» типов записей. Если вы решите добавить дополнительные функции / атрибуты или переключиться на другую кодировку (например, BBCose), напишите заметку в базу данных, чтобы было легче декодировать записи. Это еще одна причина, по которой вам НЕ следует изменять ввод пользователя, а вывод пользователя, если вы начинаете с запрета изображений, а потом решаете разрешить его.
Также атрибуты белого списка тоже. Не позволяйте кому-либо помещать JavaScript в атрибуты (такие как <div onclick=“MaliciousCode();”>
)
Обязательно обратите внимание на атаки с использованием SQL-инъекций и HTML-инъекций.