В приложении, над которым я работаю, на стороне клиента создается представление на основе некоторых записей в базе данных. Сначала я генерирую 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();
};
Все работает так, но я не думаю, что это чисто.
Есть предложения?