请点击此处输入图片描述
${}取值会给网站带来许多麻烦,强烈建议利用<c:out>标签取代${}取值。如果你没意识赴任别让我们来一个例子,看看${}会给你带来什么麻烦。
在表单中输入了 【 ‘> 】的特字符
取值结果
从结果上可以看出EL表达式没能再表单中正常显示,可能很多读者已经反应过来了,由于我们设置的name值中的【 '> 】会导致input框提前结束。以至于表单的构造被打乱了。而 标签的取值却没有问题,我们打开浏览器源码查看一下
浏览器源码模式查看
原来 标签转义了输出变量中会导致浏览器迷惑的字符,把这些有问题的字符转化为HTML字符实体码(character-entity code);这样就能避免用户在提交了一些故意无意为之的分外字符时引起表单的缺点。
这样的缺点到底有没有人会犯呢?当然新人肯定有时候会不把稳这个,我是说中小型网站。
这是在美食杰网站上发布菜谱时,在主料一栏中填入\"大众> 保存后在打开的效果,当然咯人家是PHP做的没有 我不会PHP关键不在措辞,我只想解释一下这个问题嘛。
美食杰编辑界面截图
如果这个网站大家以为有点牵强的话,我还是找个用java写的网站来说吧。这个是保重网,我在名字中输入\公众>后的结果。保重网该当是Java做的。
保重网资料编辑界面截图
从这2个网站中我们不难创造实在还是有很多网站没有把稳这个细节的。以是小伙伴们快点检讨检讨你们公司的代码是否存在这样的问题把,有的话快点改了。
我这样找漏洞不知道保重网和美食杰如果知道了会不会找我麻烦、如果你们不喜好联系我,我给你们上马赛克。
好吧言归正传,实在利用c:out 标签不只是HTML转义的问题能够得到办理,这种字符转换还能预防跨站脚本攻击。如果不转换分外字符的话我可以在文本框中输入
<script>window.location.href=\"大众xxx.xx.com\公众</script>
这样用户只要一打开这个页面就会直接连接到其他网站,以是我们不得不防。
当然利用cout是不是能够办理所有的问题,我以为有点悬,还是要根据情形来做对应的处理,但是利用<c:out>总是比没利用好嘛。不过<c:out>在利用的时候要把稳一个问题,不是所有的地方都可以直策应用的。比如说要显示html的地方,如果一篇文章的详情,或者一个商品的详细描述,这样本来便是富文本的内容不能直策应用<c:out>会导致内容无法查看。
<c:out >标签有一个可选属性 escapeXml 这个属性默认是true启用转义,你可以设置为false关闭它。
说了这么多如果你还是坚持利用${}来输出变量值的话也不是没有办法办理这个问题,可以利用fn函数中的escapeXml方法来转义字符,利用办法如下
<%@ taglib prefix=\"大众fn\公众 uri=\"大众http://java.sun.com/jsp/jstl/functions\"大众 %>
<input value=\"大众${fn:escapeXml(name) }\"大众 >
到底利用<c:out>还是利用fn:escapeXml()函数来转化分外字符,实在取决于你的个人喜好,我还是比较喜好<c:out>标签,相对而言在利用上大略一点,也随意马虎记住, 而且<c:out>标签还有一个功能,便是在取值为null的情形下能够指定默认值,这个是fn:escapeXml()函数所没有的,供应默认值在某些情形下回带来很多方便,这也是我选择<c:out>的一个缘故原由。