Как безопасно разрешить встраивание контента? - PullRequest
2 голосов
/ 10 февраля 2009

У меня есть веб-сайт (вроде социальной сети), который я написал сам. Я разрешаю участникам отправлять комментарии друг другу. В комментарии; я беру комментарий и затем вызываю эту строку перед сохранением в дб ..

$com = htmlentities($com);

Когда я хочу показать это; Я называю этот кусок кода ..

$com = html_entity_decode($com);

Это хорошо работает большую часть времени. Это позволяет пользователям копировать / вставлять код вставки YouTube / Imeem и отправлять друг другу видео и песни. Это также позволяет им загружать изображения в фотобакет и копировать / вставлять код встраивания для отправки комментариев к фотографиям.

Проблема, с которой я столкнулся, заключается в том, что некоторые люди в основном вставляют туда также код javascript, который, как правило, делает такие неприятные вещи, как открывание окон предупреждений, изменение местоположения веб-страницы и тому подобное ... Я пытаюсь найти хороший решение этой проблемы раз и навсегда .. Как другие сайты допускают такую ​​функциональность?

Спасибо за ваш отзыв

Ответы [ 5 ]

8 голосов
/ 11 февраля 2009

Первое: htmlentities или просто htmlspecialchars должны использоваться для экранирования строк, встроенных в HTML. Вы не должны использовать его для экранирования строки при вставке их в запрос SQL - используйте mysql_real_escape_string (для MySql) или еще лучше - используйте подготовленные операторы , которые имеют связанные параметры , Убедитесь, что magic_quotes выключены или отключены, если вы вручную экранируете строки.

Второе: вы не убираете струны, когда снова их извлекаете. Например. нет mysql_real_unescape_string. И вам также не следует использовать stripslashes - если вы обнаружите, что вам нужно, то, возможно, у вас включены magic_quotes - вместо этого отключите их и исправьте данные в базе данных, прежде чем продолжить.

В-третьих: то, что вы делаете с html_entity_decode, полностью аннулирует предполагаемое использование htmlentities. Прямо сейчас у вас нет абсолютно никакой защиты от злонамеренного пользователя, внедряющего код в ваш сайт (вы уязвимы для межсайтовых сценариев или XSS). Строки, которые вы встраиваете в контекст HTML, должны быть экранированы с помощью htmlspecialchars (или htmlentities). Если у вас есть для встраивания HTML-кода в вашу страницу, вам сначала нужно пропустить его через чистящее средство. strip_tags делает это - в теории - но на практике это очень неадекватно. Лучшее решение, о котором я знаю, это HtmlPurifier . Однако, что бы вы ни делали, всегда есть риск, что случайный пользователь сможет вставить код на ваш сайт. Если это вообще возможно, попытайтесь спроектировать свое приложение так, чтобы оно не требовалось.

3 голосов
/ 10 февраля 2009

Я очень надеюсь, что вы очищаете данные перед отправкой в ​​базу данных. Похоже, вы - главная цель для атаки SQl . Я знаю, что это не ваш вопрос, но это то, о чем вам нужно знать.

1 голос
/ 10 февраля 2009

Да, это проблема. Многие сайты решают эту проблему, разрешая только собственную разметку в пользовательских полях.

Но если вы действительно хотите разрешить HTML, вам нужно очистить все теги "script". Я считаю, что есть библиотеки, которые делают это. Но этого должно быть достаточно для предотвращения выполнения JS в коде, введенном пользователем.

0 голосов
/ 10 февраля 2009

Возможно, вы захотите рассмотреть Zend Filter , он предлагает намного больше, чем strip_tags, и вам не нужно включать весь Zend Framework, чтобы использовать его.

0 голосов
/ 10 февраля 2009

Вот как Stackoverflow делает это, я думаю, на RefacterMyCode .

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