前两天,一位同事闲着没事在正开发的实习项目上做一个测试,发一个严重的但又基本没什么人注意到的bug。是这样测的:在页面查询条件输入框输入"/><tr></tr>"、"<td></td>",然后点击查询按钮,结果页面就严重变形。我试着在腾讯新闻搜索上也输入同样字符,直接就卡在那了,前进不了,也后退不了。这是什么原因呢?
       我们推测是输入的"<tr></tr>",从数据库返回时被当作页面标签处理了。也就是说数据库中存放了"<tr></tr>"、“<td></td>”这种数据,未经过处理,直接输出到页面就可能导致页面严重变形。
       一位同事提出解决方案:把每个${}表示的EL表达式放入<c:out value="${}" />。貌似,还真就不会出现了。经查资料,说是<c:out>有个escapeXml属性,该属性默认为true,即会转换特殊字符,如:< 会转化成&lt。
       与另一同事讨论后,让我猛然想起,这种标签有时确实没必要存入数据库,在源头上就应该避免。当然,对于一些要输入如同书名等信息的,就该存入数据库了,存入时就该转型成&gt;&lt;等字符。
       请问,如果不需要往数据库存入<tr><td>等标签,应该用什么正则表达式校验,或者有没有别的校验方法?如果需要存入这些页面标签,有没有好一点的转型方法?

解决方案 »

  1.   

    一位同事提出解决方案:把每个${}表示的EL表达式放入<c:out value="${}" />。貌似,还真就不会出现了。经查资料,说是<c:out>有个escapeXml属性,该属性默认为true,即会转换特殊字符,如:< 会转化成&lt。一般会采用这种方式。
      

  2.   

    这个应该不叫BUG
    就找你的输入里有没有<table><tr><td>的问题
      

  3.   

       我用 struts2 标签, 没事 。
      

  4.   


    js只能用来报错不能用来做验证,除非你只是开发安全性要求不高的东西。让浏览器禁掉javascript就可以了,甚至根本不用浏览器去访问一个URL。想避免网站被语句注入,还是老老实实的用服务器端验证吧
      

  5.   

    呵呵,我也遇到过,不过我们是内网项目,用的人,连什么是域名,什么是URL都不懂,不予解决,哈哈。
      

  6.   

    对呀,在源头上怎么判断?因为不只是<tr><td>,还可能有别的
      

  7.   

    源头??源头你怎么能阻止啊?除非使用ajax异步传输进来··提示用户非法输入··除了Ajax可以自己写过滤器啊··