我被告知在我的一些银行旧.asp页面中找到Cross Site Scripting(XSS)的修复程序。
我做了一些关于这个问题的研究,但我找不到问题的答案。这是我第一次听说XSS和第一次看ASP时(尽管页面上只有HTML),我现在已经没有进入网页设计大约两年了,所以我非常生疏。
例如,我有这个表格
<form method="POST" id="CH" name="CH" action="http://some_url/some.asp">
<input type="hidden" name="srv" value="1" ID="srv"/>
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%" align="center">
<TR valign="top">
<TR>
<TD align="center">Input something here
<input name="input_something" type="text" class="field-no-fit" maxlength="12" value="">
</TD>
</TR>
</TR>
</TABLE>
</form>
如果我手动输入URL(包含此表单)为
http://this_url/this.asp?1=%22%3E%3Cscript%3Ealert%28HelloWorld%29%3C/script%3E%3Cimg%20alt=%22%22%20src=%22
页面将加载,然后它将抛出一个javascript警报并显示错误图像。
我的目标是在打开页面时停止运行脚本。 我阅读了有关Server.HTMLEncode但无法找到使用它来阻止脚本在页面加载时运行的方法。
提前致谢!
编辑:如果我用以下内容替换输入值,我是否能够(至少部分地)解决它: “&lt;%= Server.HTMLEncode(Request(”input_something“))%&gt;”
我无法测试它,因为目前我无法访问IE6,所有其他浏览器(包括IE&gt; 6版本)都避免了错误(已在安全选项卡中禁用了XSS Filter,但它不起作用)
答案 0 :(得分:3)
我认为这与浏览器无关?
你显然直接在你的页面上写了一个查询字符串参数的内容,如下所示:
<%=Request.QueryString("1")%>
这很糟糕。
正如您已经发现的那样,您应该使用
server.htmlencode( Request.QueryString("1") )
在您的页面上的任何地方,您可以直接在页面上编写用户输入。
应该做的伎俩
答案 1 :(得分:0)
(我对ASP知之甚少)您可以通过启用ASP请求验证来轻松解决问题。与任何行为更改一样,其他页面上的一些内容可能会中断(尽管这会令人惊讶),因此请先测试更改。请参阅http://msdn.microsoft.com/en-us/library/bb355989.aspx
中的第1步您的服务器正在填写页面上的所有标签,包括隐藏的&#34; srv&#34;输入,来自URL参数,不对HTML标记进行过滤,然后将其粘贴到页面中。您可以限制此表单仅响应POST,而不是GET方法,那么您的示例攻击将无效。这可能是最简单,最无害的修复方法。
最后,看看你是否可以为用于跟踪HTTPOnly会话的cookie设置cookie属性。
您可以使用的所有可能措施的详细阅读时间为http://msdn.microsoft.com/en-us/library/ms998274.aspx