Небезопасный HTML - PullRequest
       5

Небезопасный HTML

2 голосов
/ 10 июля 2009

Я создаю простое веб-приложение для форума. Я хочу разрешить пользователям включать html в свои сообщения, но хотел бы прекратить любые межсайтовые сценарии. Моя текущая стратегия заключается в том, чтобы не разрешать какие-либо теги «script», разрешать только атрибуты «style» и «href» для любого тега и не позволять значениям «href» начинаться с «javascript:». Я что-то упускаю?

ОБНОВЛЕНИЕ : я решил эту проблему с помощью "белого списка" html-элементов. Когда недопустимые элементы найдены, я удаляю тег, но оставляю внутренний html. Это решает проблему людей, копирующих и вставляющих из документа MS Word. Я также изучил antisamy.net , но столкнулся с некоторыми проблемами, связанными с обработкой атрибутов стиля на отрезках (т. Е. Их удалением). Если мне удастся это решить, я могу переключиться на это решение.

Ответы [ 6 ]

11 голосов
/ 10 июля 2009

Вы должны следовать подходу StackOverflow и другим сайтам и использовать белый список для тегов и атрибутов. Похоже, вы используете белый список для атрибутов, и это хорошо. Вы должны сделать это и для элементов, чтобы люди не крали вещи в такой форме, как iframe, meta, frameset и т. Д. (Ни один из которых вы не упомянули).

7 голосов
/ 10 июля 2009

Убедитесь, что вы удалили iframe, object, embed. Там довольно много на самом деле.

Возможно, что будет лучше, если вместо этого разрешить Уценка ?

2 голосов
/ 10 июля 2009

Я бы посмотрел на удаление любых onclick или действительно on[anything] тегов. Может быть проще создать список того, что разрешено, вместо черного списка.

1 голос
/ 10 июля 2009

A белый список - самое безопасное решение.

Вы упомянули в комментарии о вставке из Word. Не рассчитывайте на знание всех HTML-элементов Word, он часто возвращается с таким дерьмом, как <o:p> для абзацев (которые обычно работают так, как ожидается в Internet Explorer). Вы можете найти большинство из них, но это могут быть опасные теги, например, тег <o:script> или что-то в этом роде.

Кстати, HTML-тегов на самом деле не так много. Вам поможет индекс W3.org .

0 голосов
/ 10 июля 2009

Если вы используете PHP, вы можете удалить все, кроме элементов, которые хотите разрешить, с помощью strip_tags

strip_tags(string,allow)

Это выдаст:

<?php
echo strip_tags("Hello <b><i>world!</i></b>","<b>");
?> 

Привет мир!

Вы должны использовать этот подход с:

mysql_real_escape_string();
htmlentities();
0 голосов
/ 10 июля 2009

О чем вы говорите:

style='background-image:url("my-site-which-inserts-something-that-will make-you-look-bad")'

И не полностью связано: убедитесь, что если вы разрешите людям загружать файлы на сайты (images / txt / что угодно), то они будут обслуживаться с другого доменного имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...