2016-09-03 3 views
-1

У меня есть чат-сайт, и я хочу знать, безопасен ли он XSS. Позвольте мне объяснить, что такое мой метод.Является ли мой метод полностью безопасным для xss

Я использую этот JQuery код для добавления новых сообщений в экране, которые поступающие от Ajax запроса:

$("#message").prepend(req.msg); 

Я знаю, что уязвима, но сообщения на БД кодируются. Поэтому, когда я отправить это сообщение полезной нагрузки:

<text>TEST</test> 

Он хранится на базе данных кодируются:

&lt;text&gt;TEST&lt;/test&gt; 

Я знаю, что сценарий, который в обход .htmlentities() функцию в this ответ. Коротко:

<input value=<%= HtmlEncode(somevar) %> id=textbox> 

Если мы посылаем a onclick=alert(document.cookie) вход в этот HTML код, он будет:

<input value=a onclick=alert(document.cookie) id=textbox> 

Таким образом, в этом случае кодирования < > ; & символы не могут спасти нас. Но я не писал свой код, как это, поэтому я думаю, что я защищен от этой уязвимости. Мой сервер отвечает на JSON как это:

..."msg" : "<tr><td><b>user:<\b> &lt;text&gt;TEST&lt;/test&gt;<\td><\tr>",... 

И я прямо .prepend() в "MSG" данные в страницу. Я думаю, что это полностью безопасно. Хакер должен использовать < > ; & символов для XSS. Я также кодирую \ как \\. Но, может быть, я что-то упустил. Это полностью безопасно?

+1

Я бы не сохранил HTML-экранированные данные в базе данных, я бы просто вставлял их на страницу, используя текстовый синтаксический анализатор вместо парсера HTML. И я бы обернул все значения атрибутов в кавычки и скрыл кавычки во вставленном контенте. – Oriol

+0

Прошу прощения, но что вы «вставляете» в страницу? Вы предлагаете хранить сообщения без сохранения, а затем избегать их во время выполнения перед печатью? Что-то меняет? – Unhappy

+0

Например, '$ (" # message "). Prepend (document.createTextNode (req.msg));' будет добавлять текстовый узел вместо разбора 'req.msg' как HTML. – Oriol

ответ

1

Нет. Это не так. Способ передачи данных позволяет кому-то вводить неэкранированные HTML-теги. Говорят, что кто-то разместил эту полезную нагрузку:

\u003cscript\u003ealert(1)\u003c/script\u003e 

Это будет введен в базу данных как есть, потому что нет ничего для htmlencode бежать. Однако, когда она помещается в формате JSON, и сказал JSON является разобран, он становится этим:

<script>alert(1)</script> 

и выполняет вредоносный код. Лучшим решением было бы кодирование необработанных данных для JSON, а затем использовать механизм механизма спуска HTML с клиентской стороны.

С выходом на стороне сервера \ в JSON, я думаю, что это полностью безопасно.

+0

Ты что-то пропустил. Я кодирую «\» в «\\». Таким образом, данные на сервере «\\ u003cscript \\ u003ealert (1) \\ u003c/script \\ u003e'. – Unhappy

+0

Вы никогда не говорили об этом. – RamenChef

Смежные вопросы