C# 试图通过文本框插入脚本

C# 试图通过文本框插入脚本,c#,asp.net,webforms,xss,C#,Asp.net,Webforms,Xss,我制作了一个ASP.NET(FW3.5)网站,想检查它是否有漏洞 我接受来自文本框的输入并将其保存在数据库中,然后在以后的另一个页面上动态显示 如果我尝试输入…,或任何带有的内容,我的global.asax会捕获异常,我会收到消息一个潜在危险的请求。从客户端检测到表单值(TextBox1=” 自闭症 )。 然后我试着这样做:<script>$(window.load(function(){alert('hello');})</script>这是以相同的方式插入数据库的,但在页面上

我制作了一个ASP.NET(FW3.5)网站,想检查它是否有漏洞

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

如果我尝试输入
,或任何带有
的内容,我的global.asax会捕获异常,我会收到消息
一个潜在危险的请求。从客户端检测到表单值(TextBox1=”
自闭症
)。

然后我试着这样做:
<script>$(window.load(function(){alert('hello');})</script>
这是以相同的方式插入数据库的,但在页面上呈现为
$(窗口).load(函数(){alert('hello');})

但是,我没有收到警报框。脚本按页面上的原样打印。呈现的HTML是:

加载(函数(){alert('hello');})

我的问题是,为什么这个脚本没有执行?我的意思是,这是一件伟大的事情,因为我正在阅读有关跨端脚本攻击的文章,并希望使我的网站安全,这就是它现在的表现,但我不明白为什么它不是,因为我真的没有编写任何代码来阻止这种攻击


提前感谢。

ASP.NET Webforms在默认情况下已启用,这就是为什么会出现异常。当您输入它以避免请求验证时,它被解释为,而不是被解释为javascript

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


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

很可能是将其呈现为
<script>$加载(函数(){alert('hello');})</script>
它是显示已解码的浏览器。您是如何查看页面的源代码的?据我所知……Javascript块尚未加载。这就是它没有触发警报的原因。@FloydPink使用Chrome调试器工具。。您可以使用旧的右键单击和查看源代码来检查它是如何显示的吗?正如我提到的那样d仍然以HTML编码的形式呈现。@FloydPink
&;ltscript&;gt$(window.load(function(){alert('dot this work?');});&;lt/script&;gt
你是对的,它正在进行HTML编码。我没有在任何地方禁用请求验证。而且,既然HTML实体不会被解释为HTML,为什么我需要对其进行HTML编码?我的意思是我知道这是为了防止脚本,但既然在输入数据时已经对其进行了处理,那么我的网站如何容易受到攻击我需要通过HTML编码处理页面上的输出?我知道您没有禁用请求验证。我的意思是,当您输入
<script>$
时,您实际上是自己对其进行HTML编码,这意味着请求验证没有将其标记为危险。如果禁用请求验证,您必须确保不管怎样,tml encode.Html编码是一种很好的做法,因为它可以确保数据来自您的数据库(或任何地方)只显示数据,并且它不可能被无意地解释为HTML或JavaScript。例如,如果你从一个文件中加载数据,而这些文件不经过请求验证-这可能成为另一个攻击向量。或者,如果你允许输入数学等式,比如“aokay,我想我现在明白了。谢谢。任何关于我可以在哪里阅读更多关于web攻击的信息以及如何阻止它们的建议都会非常有用。OWASP前十名是一个很好的起点: