我制作了一个ASP.NET(fw 3.5)网站,想检查它是否容易受到攻击。
我接受来自文本框的输入并将其保存在数据库中,然后动态地将其显示在另一页上。
如果我尝试输入<script>...</script>
或任何包含<
和>
的内容,我的global.asax会捕获异常并收到消息A potentially dangerous Request.Form value was detected from the client (TextBox1="<b>
asd</b>
").
< / p>
然后我尝试了这个:<script>$(window).load(function(){alert('hello');});</script>
并以相同的方式插入数据库,但在页面上呈现为<script>$(window).load(function(){alert('hello');});</script>
。
<td style="font-size: 16px;" colspan="2"><script>$(window).load(function(){alert('hello');});</script></td>
我的问题是,为什么这个脚本没有执行?我的意思是,这是一件很棒的事情,因为我正在阅读关于跨版脚本攻击并希望使我的网站安全,这就是它现在的表现,但我不明白为什么它不像我真正的避风港' t编码任何东西来阻止这种攻击。
提前致谢。
答案 0 :(得分:2)
默认情况下,ASP.NET Webforms已启用Request Validation,这就是您获得异常的原因。当您输入它以避免请求验证时,它将被解释为html entities,它不会被解释为javascript。
换句话说,html实体是一种转义html标签的方法,这样你就可以渲染html保留字符,而不会将它们解释为html。 (类似于换行符的“\ n”等)
默认情况下,许多WebForms控件自动对Html进行文本值编码,这也可以防止xss,但是如果禁用请求验证,则必须确保数据库中的数据在输出到浏览器之前进行了html编码(无论如何都是好习惯。)