0

我创建了一个 ASP.NET (fw 3.5) 站点并想检查它是否易受攻击。

我接受来自文本框的输入并将其保存在数据库中,然后稍后将其动态显示在另一个页面上。

如果我尝试输入<script>...</script>或任何与<>相关的内容,我的 global.asax 会捕获异常并收到消息A potentially dangerous Request.Form value was detected from the client (TextBox1="<b> asd</b> ").

然后我尝试了这个:&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 编写任何代码来阻止此类攻击。

提前致谢。

4

1 回答 1

2

默认情况下,ASP.NET Webforms 启用了请求验证,这就是您收到异常的原因。当您输入它以避免请求验证时,它会被解释为html 实体,而不会被解释为 javascript。

换句话说,html 实体是一种转义 html 标签的方式,以便您可以呈现 html 保留字符,而不会将它们解释为 html。(类似于换行符的“\n”等)

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

于 2013-02-05T06:08:53.877 回答