У меня есть веб-сайт, посвященный развлечениям. Итак, я решил использовать новый метод для предотвращения атаки XSS. Я создал следующий список слов
alert(, javascript, <script>,<script,vbscript,<layer>, <layer,scriptalert,HTTP-EQUIV,mocha:,<object>,<object, AllowScriptAccess,text/javascript,<link>, <link,<?php, <?import,
Я думал, что, поскольку мой сайт связан с развлечениями, поэтому я не ожидаю от обычного пользователя (кроме вредоносного пользователя) использовать такие слова в своем комментарии. Итак, я решил удалить все указанные выше запятые слова из строки, отправленной пользователем. Мне нужен твой совет. Не нужно ли мне после этого использовать инструменты htmlpurifier?
Примечание. Я не использую htmlspecialchars (), потому что он также преобразует теги, созданные из моего Rich Text Editor (CKEditor), поэтому отформатированный пользователь не будет удален.
Использование черного списка – плохая идея, так как это просто обойти. Например, вы проверяете и предположительно удаляете <script>
. Чтобы обойти это, злоумышленник может ввести:
<scri<script>pt>
ваш код вычеркнет средний <script>
оставив внешний <script>
неповрежденным и сохраненным на странице.
Если вам нужно вводить HTML, а ваши пользователи этого не делают, запретите им вводить HTML. Вам нужен отдельный метод, доступный только вам, для ввода статей с HTML.
Почему бы просто не сделать функцию, которая возвращает изменения htmlspecialchars()
сделанные для определенных тегов, которые вы хотите получить, например <b><i><a>
т. Д.?
Этот подход неправильно понимает, что проблема с HTML-инъекцией, и совершенно неэффективна.
Есть много и много способов разместить скрипты в HTML, чем приведенный выше список, и множество способов избежать фильтра с помощью экранированных форм. Вы никогда не поймаете все потенциальные «вредные» конструкции с таким наивным чередованием черных списков, и если вы попробуете, вы будете неудобны для пользователей с подлинными комментариями. (например, запрет на использование слов, начинающихся с …)
Правильный способ предотвращения XSS-инъекции XSS:
используйте htmlspecialchars()
при выводе контента, который должен быть нормальным текстом (который является подавляющим большинством контента);
если вам нужно разрешить пользовательскую HTML-разметку, введите белый список безвредных тегов и атрибутов, которые вы хотите разрешить, и применяйте это с помощью HTMLPurifier или другой подобной библиотеки.
Это стандартная и хорошо понятная часть написания веб-приложения, и ее не сложно реализовать.
Взломы, чтобы обойти ваш список в сторону, всегда лучше использовать белый список, чем черный список.
В этом случае у вас уже будет четкий список тегов, которые вы хотите поддерживать, поэтому используйте только теги белого типа, такие как <em>
, <b>
и т. Д., Используя некоторый очиститель HTML.
вы можете попробовать
htmlentities ()
echo htmlentities("<b>test word</b>"); ouput: <b>test word</b>
strip_tags ()
echo strip_tags("<b>test word</b>"); ouput: test word
mysql_real_escape_string ()
или попробуйте простую функцию
function clean_string($str) { if (!get_magic_quotes_gpc()) { $str = addslashes($str); } $str = strip_tags(htmlspecialchars($str)); return $str; }