Как я могу удалить вредоносный HTML (XXS и т. Д.) Из контента? - PullRequest
3 голосов
/ 22 января 2011

У меня есть форма отправки контента, которая содержит несколько полей для ввода, все из которых, при отправке, вводятся непосредственно в базу данных. Когда этот контент запрашивается, он печатается.

Я понял, что это проблема безопасности.

Как я могу удалить только вредоносный HTML (XSS), но разрешить форматирование тегов (b, i и т. Д.)?

Ответы [ 6 ]

2 голосов
/ 23 января 2011

@ pst правильно ... вам нужно явно разрешить определенные теги . Но проблема в том, что ввод может быть повсюду, поэтому вам нужно использовать библиотеку, такую ​​как HTML Tidy (ссылка на Source Forge Project) , чтобы получить место, где вы можете DOMDocument :: loadHTML очищенный документ.

Вы должны использовать HTML Tidy, чтобы очистить ввод и перевести его в состояние жалобы, чтобы затем вы могли явно разрешить определенные теги . Все остальное должно быть удалено из вашего очищенного контента перед его постоянным хранением. (ПРИМЕЧАНИЕ: по соображениям производительности не храните большие двоичные объекты в вашей базе данных, сохраняйте их в своей файловой системе и связывайте с ними путь к файлу в безопасном месте - месте, которое отсутствует в корневом веб-каталоге).

Удачи.

1 голос
/ 22 января 2011

Сначала запустите htmlspecialchars на входе, а затем отмените его для разрешенных тегов (например, замените &lt;b&gt; на <b>).

0 голосов
/ 22 января 2011

Есть несколько способов справиться с этим.

Прежде всего, давайте проясним: сделать это безопасным способом, это не может быть сделано в javascript, только на стороне сервера - использование javascript для безопасного обеспечения очистки входных данных обречено на провал

  1. Кодирование символов, составляющих html, при выводе пользовательских данных

Когда сгенерированные пользователем данные выводятся на вашу веб-страницу, измените несколько символов, чтобы сделать их безопасными. А именно символы <, > и & должны быть изменены на &lt;, &gt; и &amp; соответственно.

Это лучший способ сделать это, если пользователю разрешено редактировать текст, поскольку вы фактически не изменяете текст в хранилище, и вы можете позволить пользователю изменять неизмененный текст с помощью textarea

  1. Кодирование символов, составляющих html, при сохранении пользовательских данных

Сделайте то же самое, что и выше, но сделайте это, прежде чем сохранять данные в вашей базе данных.

Это повышает производительность, поскольку вам не нужно кодировать его каждый раз, когда вы выводите его, но это не позволит вашим пользователям редактировать неизмененный текст, что может быть серьезным недостатком, в зависимости от того, что вы создаете

  1. Обрезать символы перед выводом или сохранением

Удалять символы < и > перед выводом или хранением - на мой взгляд, это не очень хорошее решение, поскольку это ненужное изменение пользовательского ввода, но некоторые люди предпочитают его.

0 голосов
/ 22 января 2011

Я думаю, что кодирование ввода поможет ...

Для PHP я считаю, что это:

htmlspecialchars
0 голосов
/ 22 января 2011

Строго определите, какие «невинные» HTML-теги вы собираетесь разрешить - например, <strong> или <em>.Затем запустите регулярное выражение, чтобы принять только те, которые вы хотите, отклоняя все остальные.

0 голосов
/ 22 января 2011

Используйте mysql_stripslashes (), htmlspecialchars () и urldecode (), для целочисленных значений вы, вероятно, можете просто использовать int typecast.

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