htmltextwriter и межсайтовый скриптинг
Просто быстрый вопрос, который меня попросили пройти через приложение vb и исправить все места, где может происходить межсайтовый скриптинг. Я изменил <% = на <%: и везде, где они собирали html в коде, и вставил строку, я изменил на server.htmlencode или server.urlencode соответственно. Мой вопрос иногда они используют htmlwriter. Я предполагаю, что если они используют htmlwriter, мне не нужно беспокоиться о межсайтовом скриптинге, так как писатель будет автоматически кодировать любые строки. Это верно?
2 ответа
Да, он защищает вас от XSS при записи в документ HTML, однако HtmlTextWriter.WriteEncodedText
метод должен быть использован.
' Assign a value to a string variable,
' encode it, and write it to a page.
colHeads = "<custID> & <invoice#>"
writer.WriteEncodedText(colHeads)
writer.WriteBreak()
будет выводить
<custID> & <invoice#>
в поток.
Обратите внимание, что с помощью <%:
а также WriteEncodedText
подходят только для вывода в контекст HTML. Они не должны использоваться при выводе в JavaScript:
<script>
var myVariable = '<%: thisIsWrong %>';
</script>
В данном контексте HttpUtility.JavaScriptStringEncode
следует использовать (с <%= %>
скобки для предотвращения неправильного кодирования HTML тоже). Эта функция также правильно кодирует специальные символы, поэтому, если </script>
должен был отображаться в теге сценария при попытке закрыть тег сценария HTML, готовый для атаки XSS, он должен отображаться как:
\u003c/script\u003e
которая является правильной кодировкой для JavaScript, чтобы понять его как </script>
, но без браузера, интерпретирующего его как буквальный закрывающий тег сценария. Некоторые наивно написанные процедуры кодирования JavaScript не будут конвертировать это, потому что последовательность не содержит \
, "
или же '
персонажи. Я просто подумал, что упомяну некоторые нюансы, которые мешают XSS другим людям найти этот пост.
Если вы не уверены, что закрывающие теги скрипта не отображаются, то возможна атака, подобная этой.
</script><script>alert(1)</script>
который отображает в браузере как
<script type="text/javascript">
alert('</script><script>alert(1)</script>');
</script>
и браузер будет интерпретировать тег сценария, заканчивающийся на alert('</script>
и просто выполните то, что в новом теге сценария.
С JavaScriptStringEncode
Функция это безопасно, так как она отображается как:
<script type="text/javascript">
alert('\u003c/script\u003e\u003cscript\u003ealert(1)\u003c/script\u003e');
</script>
который не содержит </script>
для браузера, чтобы интерпретировать.
Только что попробовал, к сожалению, это не защищает вас от межсайтового скриптинга Я сделал страницу aspx и в коде я положил
protected void Page_Load(object sender, EventArgs e)
{
StringWriter stringWriter = new StringWriter();
using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter)) {
writer.RenderBeginTag(HtmlTextWriterTag.Label);
writer.Write(
" < script > alert('.Net and the Terrible, Horrible, No Good, Very Bad Script');</ script > ");
writer.RenderEndTag();
}
Response.Write(stringWriter);
}
Я запустил страницу, и появилось предупреждение javascript, поэтому я думаю, что htmltextwriter не защищает вас от межсайтовой рассылки