比如这样的HTML代码:
<div class="seachInput"> <form method="get" action="so.aspx"> <input type="text" class="txtSeach" id="w" name="w" /> <input type="submit" class="btnSearch" value="找一下" /> </form> </div>
当用户在文本框中输入:<canvas>
提交时自动转换为:<canvas>
后来想到的一个方法是添加一个onsubmit事件处理函数:
function onSearchSubmit(id) { document.getElementById(id).value = Encoder.htmlEncode(document.getElementById(id).value); }
第一种方法:用ajax提交。
第二中方法:你在页面aspx文件头的Page中加入 ValidateRequest="false",亦或在Web.config文件<system.web>节点下面加入这样一句: <pages validateRequest="false"/>。(ValidateRequest的默认值是True)
第三种方法:在文本框上附加一个obblur事件,这个事件的主要作用是检查文本框的值,如果有"<",就进行escape下,然后提交。
第四种方法:在表单提交前,监控onSubmit方法,将数据进行escape
大哥你现在才发现啊,这就是我说的第四种方法
很奇怪你这个问题。
在提交的时候,FORM的SUBMIT行为会自动的进行处理,而且到了服务器端的时候,你只要简单的把这个值取出来(REQUEST.QUERYSTRING),值的内容就会是用户填写的原始内容的。
尖括号会带来XSS威胁,从安全角度考虑,Web服务器不允许提交的数据中包含尖括号。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body> <form action="HTMLPage1.htm" method="get"> <input name="text" type="text" /> <input type=submit value="submit" /> </form> </body> </html>
这个代码,我输入<Canvas>后提交,在URL里显示成:
http://localhost:2565/HTMLPage1.htm?text=%3Ccanvas%3E
这个是由FORM提交行为自动进行编码的。
至于POST方式的提交的话,处理过程应该也是一样的。
@笨笨蜗牛:
可是,IIS会先把 %3Ccanvas%3E 解码为 <Canvas>,然后进行检测,并提示:
A potentially dangerous Request.QueryString value was detected from the client (w="<canvas>").
针对IIS的这个问题,我专门写过一篇博客:
躲不过也要躲:让encodeURIComponent过的尖括号躲过ASP.NET的误拦截
保存时,先对数据进行HTML编码不就可以了
Server.HtmlEncode("<canvas>");
提交时就被IIS拦截了,根本到不了ASP.NET程序
对于已经意识到XSS的程序员而言:
1:应该允许用户的正常提交行为,包括提交<号,因为本来就是正常行为,不应该干扰用户的正常输入。
2:有能力发动xss的,绕过客户端验证是件很容易的事(修改html或直接发数据包),因此客户端防是不太实际的事情。
3:避免XSS的处理方法,原则上应该是在服务端处理,包括:
A:入库前的处理。
B:显示到页面时的处理。
C:针对xss最常见的cookie处理,特殊加密处理,让cookie在切换环境时即时失效。