好的。我正在处理一个用 VBScript 编写的经典 ASP 应用程序。我正在尝试过滤可能通过编码的查询字符串出现的 XSS。我有一个简单的 XSS 消除功能 [getUserInput]。这会查找诸如 /' .... 之类的特殊字符,并用空格替换它们。这很好用。但是,当我输入通过 Server.URLEncode (VBScript) 或转义 (Javascript) 编码的内容时,显然我上面的过滤器不起作用。我想知道为防止这种 Unicode 转换输入使我的页面容易受到 XSS 攻击的推荐解决方案。复现步骤:<%Response.Write getUserInput(Request("txt1")) + "<br/>"Response.Write Server.URLEncode(getUserInput(Request("txt1"))) + "<br/>"'the below line is where I am trying to decode and echo the inputResponse.Write URLDecode2((getUserInput(Request("txt1")))) + "<br/>"Response.Write "<br/>"%><html>Try any of the below two encoded strings in the input box and hit the button. </br></br>alert('hi') </br>%3Cscript%3Ealert%28%27hi%27%29%3C%2Fscript%3E <br/>alert(document.cookie) </br>%3Cscript%3Ealert%28document.cookie%29%3C%2Fscript%3E <br/></br><form method="get" name="form1" id="form1" action="#" onSubmit="CallOnLoad()"> <input type='text' name='txt1' id='txt1' /> <button name='btn' type='submit' id='btn'>Hitme</button></form></html><%function getUserInput(input)dim newStringnewString=inputnewString = replace(newString,"--","")newString = replace(newString,";","") newString = replace(newString,chr(34),"'") newString = replace(newString,"'","") newString = replace(newString,"=","=") newString = replace(newString,"(","[") newString = replace(newString,")","]") newString = replace(newString,"'","''") newString = replace(newString,"<","[") newString = replace(newString,">","]") newString = replace(newString,"/*","/") newString = replace(newString,"*/","/") getUserInput = newStringend function%><%'URLDecode2 - source code from http://www.motobit.com/tips/detpg_URLDecode/Function URLDecode2(ByVal What) Dim Pos, pPos What = Replace(What, "+", " ") on error resume Next Dim Stream: Set Stream = CreateObject("ADODB.Stream") If err = 0 Then on error goto 0 Stream.Type = 2 'String Stream.Open Pos = InStr(1, What, "%") pPos = 1 Do While Pos > 0 Stream.WriteText Mid(What, pPos, Pos - pPos) + _ Chr(CLng("&H" & Mid(What, Pos + 1, 2))) pPos = Pos + 3 Pos = InStr(pPos, What, "%") Loop Stream.WriteText Mid(What, pPos) Stream.Position = 0 URLDecode2 = Stream.ReadText Stream.Close Else 'URL decode using string concentation on error goto 0 Pos = InStr(1, What, "%") Do While Pos>0 What = Left(What, Pos-1) + _ Chr(Clng("&H" & Mid(What, Pos+1, 2))) + _ Mid(What, Pos+3) Pos = InStr(Pos+1, What, "%") Loop URLDecode2 = What End IfEnd Function%>我需要在 IIS 7.5/Win 2008 R2 上托管该应用程序。请简单/优雅的建议? How To: Prevent Cross-Site Scripting in ASP.NET 是一篇不错的文章,但在我处理 Classic ASP 时,它并不适合我的场景。谢谢。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 I am trying to filter possible XSS这在很大程度上是在浪费时间。这种类型的 XSS 是一个输出阶段的问题,是由于将数据插入 HTML 而没有对其进行 HTML 转义造成的。尽管被误导的“反 XSS”工具和功能做了很多努力,但这个问题根本无法通过输入阶段的过滤来解决。在输入时,不知道数据将在哪里结束,哪些数据需要进行 HTML 转义(而不是注入(inject)到 SQL 或 JavaScript 等其他文本上下文中),以及在数据结束之前将对这些数据进行哪些处理在页面上 - 在您的示例中,您使用 URL 解码来演示这一点,但它可以是任何东西。要纠正由 < 和 & 引起的问题,您需要记住在注入(inject)输出页面的每个字符串上调用 Server.HTMLEncode,以便它们分别转换为 < 和 &。这是安全的,并且还允许用户随意使用任何角色,而其中一些角色不会消失。 (想象一下,在删除所有 < 的情况下尝试将此消息发布到 SO!)这样您就不必担心 < 的编码版本,因为当您将它们放在页面上时,您已经对它们进行了解码,并且可以应用正确的编码形式,即 HTML 转义。这与 Unicode 没有任何关系。页面中可以包含非 ASCII 字符而不会出现任何问题;只有 < 、 & 和在属性值中用作分隔符的引号字符,在注入(inject) HTML 时会带来任何危险。曾经存在过长 UTF-8 序列的问题,其中 < 可能会被走私到无效的顶级位集字节序列中,这些字节将通过 HTML 编码保持不变。然后 IE(和 Opera)会将其视为真正的 < 。如果您正在使用具有 native 字节字符串而不是 Unicode 的语言使用 UTF-8,那么过滤超长仍然是一个好主意,但这并不是以前的必要性,因为所有当前主要浏览器都正确对待超长,作为非功能性无效序列。使用正确的 HTML 转义,您的示例可能如下所示(省略未更改的 URLDecode2 函数):<p> <%= Server.HTMLEncode( Request("txt1") ) %> <br/> <%= Server.HTMLEncode( URLDecode2(Request("txt1")) ) %></p><p> Try any of the below two encoded strings in the input box and hit the button.</p><ul> <li><script>alert('hi')</script></li> <li>%3Cscript%3Ealert%28%27hi%27%29%3C%2Fscript%3E</li> <li><script>alert(document.cookie)</script></li> <li>%3Cscript%3Ealert%28document.cookie%29%3C%2Fscript%3E<li></ul><form method="get" action="this.asp"> <input type="text" name="txt1" value="<%= Server.HTMLEncode( Request("txt1") ) %>"/> <input type="submit" value="Hitme"/></form>(在 ASP.NET 4.0 中,有一个方便的 <%: 快捷方式可以为您执行 <%= Server.HTMLEncode;不幸的是,在 Classic ASP 中并非如此。)关于unicode - 在经典 ASP 中过滤编码的 XSS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7598783/ (adsbygoogle = window.adsbygoogle || []).push({}); 10-10 06:55