试图通过文本框插入脚本

时间:2013-02-05 05:50:23

标签: c# asp.net webforms xss

我制作了一个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>

然后我尝试了这个:&ltscript&gt$(window).load(function(){alert('hello');});&lt/script&gt并以相同的方式插入数据库,但在页面上呈现为<script>$(window).load(function(){alert('hello');});</script>

但是,我不会得到警告框。脚本将在页面上打印出来。呈现的HTML是:

<td style="font-size: 16px;" colspan="2"><script>$(window).load(function(){alert('hello');});</script></td>

我的问题是,为什么这个脚本没有执行?我的意思是,这是一件很棒的事情,因为我正在阅读关于跨版脚本攻击并希望使我的网站安全,这就是它现在的表现,但我不明白为什么它不像我真正的避风港' t编码任何东西来阻止这种攻击。

提前致谢。

1 个答案:

答案 0 :(得分:2)

默认情况下,ASP.NET Webforms已启用Request Validation,这就是您获得异常的原因。当您输入它以避免请求验证时,它将被解释为html entities,它不会被解释为javascript。

换句话说,html实体是一种转义html标签的方法,这样你就可以渲染html保留字符,而不会将它们解释为html。 (类似于换行符的“\ n”等)

默认情况下,许多WebForms控件自动对Html进行文本值编码,这也可以防止xss,但是如果禁用请求验证,则必须确保数据库中的数据在输出到浏览器之前进行了html编码(无论如何都是好习惯。)