#ruby-on-rails #ruby-on-rails-3 #embed
#ruby-on-rails #ruby-on-rails-3 #Внедрить
Вопрос:
Мое приложение позволяет пользователям встраивать видео с популярных сайтов, таких как YouTube и т.д. У меня есть text_area_field для принятия кода встраивания в виде строки и сохранения в базе данных. Я выполняю некоторую базовую проверку с помощью регулярного выражения для фильтрации определенных частей кода для встраивания. Пример кода для встраивания с YouTube:
<iframe width="560" height="315" src="http://www.youtube.com/embed/INx7B2yyD0g" frameborder="0" allowfullscreen></iframe>
Когда я показываю видео обратно пользователю, я делаю это, на мой взгляд
<%= user.content.html_safe %>
Что я хотел бы знать, так это следующее:
1. Безопасно ли вызывать html_safe для данных, отправленных пользователем, какие еще варианты у меня есть
2. Является ли хранение кода встраивания в виде строки хорошей практикой
3. Есть ли какие-либо лазейки для пользователей, чтобы отправлять плохие сценарии
4. Что можно сделать по-другому, чтобы предотвратить такие атаки
спасибо
Ответ №1:
Вы могли бы пойти по пути использования чего-то вроде sanitize gem с пользовательским белым списком. Но поскольку ему пришлось бы принимать такие вещи, как <iframes>
это может быть сложно.
Вероятно, самым безопасным вариантом было бы использовать анализатор HTML, такой как nokogiri, для анализа конкретных необходимых значений и вставки их в свой собственный шаблон для каждого сервиса.
Для вашего примера кода для встраивания:
<iframe width="560" height="315" src="http://www.youtube.com/embed/INx7B2yyD0g" frameborder="0" allowfullscreen></iframe>
Вам просто нужно захватить что-то вроде:
{:with => 560, :height => 315, :youtube_id => 'INx7B2yyD0g'}
Это определенно больше работы, поскольку вам понадобятся разные анализаторы и шаблоны для каждого поддерживаемого вами видеосервиса. Но это самый безопасный способ, который я могу придумать, чтобы избежать вредоносного внедрения HTML.
Комментарии:
1. спасибо, я думал в духе nokogiri, но подумал, что может быть другой способ.