Json.encode специальные символы \ u003c MVC3 - PullRequest
8 голосов
/ 23 февраля 2012

У меня есть приложение JavaScript, где я использую шаблоны на стороне клиента (underscore.js, Backbone.js).

Данные для начальной загрузки страницы привязаны к странице следующим образом (.cshtml Razor-файл):

<div id="model">@Json.Encode(Model)</div>

Движок бритвы выполняет экранирование, поэтому, если Model равен

new { Title = "<script>alert('XSS');</script>" }

, на выходе мы получим:

<div id="model">{&quot;Title&quot;:&quot;\u003cscript\u003ealert(\u0027XSS\u0027)\u003c/script\u003e&quot;}</div>

Какие после "parse "операция:

var data = JSON.parse($("#model").html());

у нас есть данные объекта с полем "Title" точно "<script>alert('XSS');</script>"!

Когда это идет к шаблону подчеркивания, он предупреждает.

Каким-то образом \u003c- подобные символы обрабатываются как правильные символы "<".

Как мне экранировать символы "<" в &lt; и &gt; из БД (если они каким-то образом туда попали)?

Может быть, я могу настроить Json.Encode сериализацию для экранирования этих символов?Может быть, я могу установить Entity Framework, который я использую, для автоматического экранирования этих символов абсолютно постоянно при получении данных из БД?

Ответы [ 3 ]

2 голосов
/ 14 июня 2012

\ u003c и аналогичные коды идеально подходят для JS. При желании вы можете запутать целые файлы JS, используя этот синтаксис. По сути, вы видите escape-символ \, u для юникода, а затем четырехзначный шестнадцатеричный код, который относится к символу.

http://javascript.about.com/library/blunicode.htm

\ u003c - как вы уже заметили, это <символ. </p>

Одним из подходов к «исправлению» этого на стороне MVC было бы написать RegEx, который ищет шаблон \ u - и затем захватывает следующие 4 символа. Затем вы можете расшифровать их в фактические символы Юникода и запустить полученный текст с помощью ваших алгоритмов предотвращения XSS.

Как вы отметили в своем вопросе - просто поиск "<" не поможет. Вы также не можете просто искать «\ u003cscript» - потому что это предполагает, что потенциальный хакер просто не закодировал в кодировке unicode все слово тега «script». Более безопасный подход состоит в том, чтобы убрать все эти виды кодов и затем очистить ваш HTML в виде обычного текста. </p>

Между прочим, вам может быть легче заметить, что это одна из распространенных (и, следовательно, пока мало решенных) проблем в профилактике XSS. Так что вы не одиноки в поиске лучшего решения ...

Вы можете проверить следующие библиотеки, чтобы помочь в фактической очистке HTML:

http://wpl.codeplex.com/ (попытка Microsoft найти решение - хотя очень плохая обратная связь с пользователем) https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project_.NET (Частный проект, предназначенный для выполнения многих подобных профилактических работ. Мне трудно его использовать, и он плохо реализован в .NET)

И то, и другое - хорошие ссылки.

1 голос
/ 23 февраля 2012

Вам необходимо закодировать вашу строку как HTML, прежде чем предоставлять ее Underscore.

«Экранирование HTML в шаблонах Underscore.js» объясняет, как это сделать.

0 голосов
/ 23 февраля 2012

Если вы хотите писать незакодированный контент, вам нужно использовать Html.Raw () помощник:

@Html.Raw(Json.Encode(Model))

Редактировать:

Я думаю, возможноЯ не понимаю, в чем твоя проблема.Например, в тестовом контроллере у меня есть следующее

ViewBag.Test = new { Title = "<script>alert('XSS');</script>" };

В связанном виде:

   <script type="text/javascript">
        var test = @Html.Raw(Json.Encode(ViewBag.Test));
        console.log(test.Title);
        document.write(test.Title);
    </script>

, который в свою очередь выводит на консоль:

<script>alert('XSS');</script>

И открывает предупреждение.

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