在Grails项目中发现,Grails框架居然“不能”防止form表单的注入,感觉很是奇怪,然后查找原因发现,在GSP页面中获取从服务器传来的数据,有2种写法:
1.${fieldValue(bean: user, field: "name")};
2.${user.name}
最开始完全没有注意这两种有什么不同,不过通过这次测试发现,这两种的确有一点不同,对于输入框输入”<input type=”text” name=”user”/>“的信息,也就是注入,会发现存储到数据库中也是上面字符串,并没有进行转码,然而从数据库读取这个数据解析到HTML的时候,会发现GSP中写法不一样解析就不一样。
对于1的情况而言,GSP会把特殊字符转义了,既是把上面的字符串转义成:
<input type=”text” name=”user”/>
对于2的情况而言,不会转义,会原原本本的输出,<input type=”text” name=”user”/>,继而出现一个输入框。
但是可以使用${user.name.encodeAsHTML()}解决转义问题。
总结:就目前而言,我倾向于用第二种写法,简洁一点。