前两天,一位同事闲着没事在正开发的实习项目上做一个测试,发一个严重的但又基本没什么人注意到的bug。是这样测的:在页面查询条件输入框输入"/><tr></tr>"、"<td></td>",然后点击查询按钮,结果页面就严重变形。我试着在腾讯新闻搜索上也输入同样字符,直接就卡在那了,前进不了,也后退不了。这是什么原因呢?
我们推测是输入的"<tr></tr>",从数据库返回时被当作页面标签处理了。也就是说数据库中存放了"<tr></tr>"、“<td></td>”这种数据,未经过处理,直接输出到页面就可能导致页面严重变形。
一位同事提出解决方案:把每个${}表示的EL表达式放入<c:out value="${}" />。貌似,还真就不会出现了。经查资料,说是<c:out>有个escapeXml属性,该属性默认为true,即会转换特殊字符,如:< 会转化成<。
与另一同事讨论后,让我猛然想起,这种标签有时确实没必要存入数据库,在源头上就应该避免。当然,对于一些要输入如同书名等信息的,就该存入数据库了,存入时就该转型成><等字符。
请问,如果不需要往数据库存入<tr><td>等标签,应该用什么正则表达式校验,或者有没有别的校验方法?如果需要存入这些页面标签,有没有好一点的转型方法?
我们推测是输入的"<tr></tr>",从数据库返回时被当作页面标签处理了。也就是说数据库中存放了"<tr></tr>"、“<td></td>”这种数据,未经过处理,直接输出到页面就可能导致页面严重变形。
一位同事提出解决方案:把每个${}表示的EL表达式放入<c:out value="${}" />。貌似,还真就不会出现了。经查资料,说是<c:out>有个escapeXml属性,该属性默认为true,即会转换特殊字符,如:< 会转化成<。
与另一同事讨论后,让我猛然想起,这种标签有时确实没必要存入数据库,在源头上就应该避免。当然,对于一些要输入如同书名等信息的,就该存入数据库了,存入时就该转型成><等字符。
请问,如果不需要往数据库存入<tr><td>等标签,应该用什么正则表达式校验,或者有没有别的校验方法?如果需要存入这些页面标签,有没有好一点的转型方法?
解决方案 »
- spring和hibernate整合除了getHibernateTemplate()还能用什么
- javax.servlet.ServletException: Cannot get value for expression
- MyEclipse 设置webService的WSDL时,出现an error occurred while completing process -javalangreflectInvocation
- Spring中使用注解的方式如何实现"Inner Bean的机制"?
- 关于持久化
- webservice中文出现乱码
- ===配置文件部署策略的菜鸟问题,请高手指点===
- easy
- 请问,怎么样在用XML在前端保存数据???
- springboot启动报错,继承了ureport,请各位大佬帮我看看是什么问题
- 用Weblogic10部署ear,启动后报这个错误EA-000449,在线等!!
- Hibernate
就找你的输入里有没有<table><tr><td>的问题
js只能用来报错不能用来做验证,除非你只是开发安全性要求不高的东西。让浏览器禁掉javascript就可以了,甚至根本不用浏览器去访问一个URL。想避免网站被语句注入,还是老老实实的用服务器端验证吧