Защита от XSS в выходных данных escape_javascript () в Rails - PullRequest
3 голосов
/ 08 января 2012

В приложении, над которым я работаю, на стороне клиента создается представление на основе некоторых записей в базе данных. Сначала я генерирую JSON записей, сохраняю их в переменной на своей странице, затем использую JS для построения интерфейса.

Проблема заключается в том, что записи содержат сгенерированные пользователем поля, и поэтому приложение восприимчиво к XSS. Если вы позволите JSON пройти через escape_html (не вызывая html_safe), он испортит кавычки.

Чтобы получить код. В моей модели:

Class Foo
  # ...
  def describe_for_view
    [{:title => "hello", :content => "<script>I.Am.Evil()</script>"}]
  end
end

Где-то на мой взгляд:

<script>
  var describedForView = $.parseJSON("<%= escape_javascript(@foo.describe_for_view.to_json).html_safe %>");
</script>

Тогда в моем JavaScript:

$("body").append("title: " + describedForView[0].title + ", content: " + describedForView[0].content);

Что я сейчас делаю, так это то, что я обертываю доступ к сгенерированным пользователем полям с помощью вызова $.sanitize, как определено:

$.sanitize = function(str) {
  return $("<div/>").text(str).html();
};

Все работает так, но я не думаю, что это чисто.

Есть предложения?

1 Ответ

1 голос
/ 08 января 2012

Rails 3 имеет встроенный SanitizeHelper , который использует подход белого списка.Я бы либо вызвал его для пользовательских данных перед сохранением в базе данных, либо в вашем вызове escape_javascript:

escape_javascript(sanitize(some_stuff.to_json))

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