Intereting Posts
Отдельные слова, разделенные пробелами в строке file_get_contents (): php_network_getaddresses: getaddrinfo не удалось: имя или услуга неизвестны Почему браузер пытается загрузить файл сценария php? Избегайте перезагрузки страницы при отправке формы с помощью ajax с laravel данные с кодовым сигналом с запросом «Не удалось получить доступ к файлу:» в функции PHPmail Завершить набор результатов перед вставкой данных в БД Использовать функцию фронтальной стороны со стороны администратора Настройка проекта symfony для нескольких доменов Как перезаписать класс из компонента безопасности? Строка исключений JSON не может быть преобразована в JSONObject. Внедрение Facebook Credits – приложение не отвечает (ошибка синтаксического анализа signed_request при обратном вызове) Поиск строки или части строки в PHP Кнопка голосования в стиле Reddit Я продолжаю получать сообщение об ошибке на нашем сайте. Предупреждение: mysqli_real_escape_string () ожидает ровно 2 параметра, 1 задано в …

Новый способ предотвращения атак XSS

У меня есть веб-сайт, посвященный развлечениям. Итак, я решил использовать новый метод для предотвращения атаки 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; }