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