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()

будет выводить

&lt;custID&gt; &amp; &lt;invoice#&gt;

в поток.

Обратите внимание, что с помощью <%: а также 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 не защищает вас от межсайтовой рассылки

Другие вопросы по тегам