Является ли угрозой безопасности разрешение следующих элементов HTML (например, кода, пре)?

Я использую следующий плагин: https://github.com/jhollingworth/bootstrap-wysihtml5/

Вот как я очищаю свой ввод/вывод в своем приложении Rails:

post.rb:

  protected

  def clean_input
    self.content = sanitize(self.content, :tags => %w(b i u br p span blockquote pre code), :attributes => %w(id class style))
  end

сообщения/show.html.rb:

  <p><%= sanitize @post.content, :tags => %w(b i u p span br blockquote pre code), :attributes => %w(id class style) %></p>

Этот синтаксический анализатор правил для wysihtml5 (конечно, редактор разрешает такие теги, как b, i и т. д. по умолчанию):

общая/editor_toolbar:

  parserRules: {
      classes: {
        "ruby": 1,
        "variable": 1,
        "string": 1
      },
      tags: {
        span: {},
        code: {},
        pre: {}
      }
    },

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

  <pre class="ruby">
   <code>
    <span class="variable">
    $(</span><span class="string">'.wysihtml5'</span>).wysihtml5({<span class=
    "string">'stylesheets'</span>: false});
   </code>
  </pre>

(Пользователь может переключаться между визуальным и HTML-представлением)

Надеюсь, это не глупый вопрос (я не очень разбираюсь в безопасности), но это относительно безопасно или опасно? Если да, то как это предотвратить?


person alexchenco    schedule 09.12.2012    source источник


Ответы (1)


Я действительно не знаю о Ruby, но в PHP вы можете разрешать такие теги, и из того, что я экспериментировал, это НЕ безопасно... Причина в том, что атрибуты в этих авторизованных теги не дезинфицируются, поэтому любой пользователь может ввести очень мягкий и безобидный тег <span></span>, добавив к нему следующее:

<span onmouseover="hack_the_whole_fucking_website();">contenthere</span>

Таким образом, JavaScript будет выполняться, когда пользователь наведет на него указатель мыши! Оттуда, я думаю, взломанный может украсть файлы cookie пользователя + украсть файл cookie сеанса + захватить сеансы пользователей +, возможно, захватить сеанс администратора, а затем взорвать ваш сайт. Это открытая дверь для хакеров.

Решение, которое я использую для этого, — теги BBcode. Они являются своего рода «заменителями» существующих тегов HTML. Некоторые примеры :

  • <i> = [i]
  • <img src="#"> = [img=#]
  • <a href="#">text</a> = [url=#]text[/url]
  • ...

Вывод редактора должен быть в этом формате, чтобы вы могли запустить сценарий очистки, который правильно удалит все настоящие HTML-теги. А затем, когда приходит время выводить эти данные пользователю, вы заменяете эти замещающие теги настоящим HTML-тегом, используя некоторые регулярные выражения. :)

person WiMantis    schedule 09.12.2012
comment
Я думаю, что эта строка: :attributes => %w(id class style) сообщает приложению, что это единственные разрешенные атрибуты HTML. Так что onmouseover не допустят. - person alexchenco; 09.12.2012
comment
О, я не смотрел, если это на самом деле правда, Ruby лучше, чем PHP в этом вопросе, лол. И, может быть, он, наконец, безопасен, но... лично говоря, я все еще чувствовал бы себя небезопасно, имея пользовательский HTML в моей базе данных, поэтому я бы все еще используйте теги BBcode, просто чтобы быть уверенным :) - person WiMantis; 09.12.2012
comment
Та же проблема с BBCode: [img=javascript:…]. Проверка не останавливается на уровне HTML. - person Gumbo; 09.12.2012
comment
Абсолютно верно, но это можно легко отфильтровать с помощью регулярных выражений, обнаружив эту javascript: начальную часть части URL. - person WiMantis; 09.12.2012