前记
web应用基于webx3框架,前端页面用velocity。在日常环境部署时,安全检测结果有css漏洞,并给出了解决方案。
1. XSS是什么?
XSS是 CrossSite Scripting的缩写,中文名称为跨站脚本攻击。
2. 如何实现XSS?
XSS是攻击者在Response中加入恶意脚本,脚本会在浏览器中执行,导致用户重要信息泄露。例如在服务器端的Screen java类里添加:
Code_1: context.put("css","<script> alert(\"My FirstJavaScript\");</script>");
那么浏览器就会执行这段js脚本, 弹出一个alert对话框
3. 如何防止XSS?
Webx3.0框架对XSS攻击有很好的解决方案。在webx*.xml配置文件里,默认情况下对所有htm文件进行转义,只有在noescape里配置的不转义。 例如
<plugins>
<vm-plugins:escape-supportdefaultEscape="html">
<vm-plugins:noescape>
<vm-plugins:if-matches pattern="^control\." />
<vm-plugins:if-matches pattern="^screen_placeholder" />
<vm-plugins:if-matches pattern="^stringEscapeUtil\.escape"/>
<vm-plugins:if-matchespattern="^csrfToken\.(get)?hiddenField" />
</vm-plugins:noescape>
</vm-plugins:escape-support>
</plugins>
由于Code_1 没有使用noescape,那么就会被webx3.0框架的防止XSS攻击处理,客户端得到的内容为:
Code_2: <script>alert("My First JavaScript");</script>
说明:<是<的转义符号,>是>的转义符
总结: Code_2不会被脚本引擎执行,因此CSS威胁解除。 浏览器的渲染引擎会把Code_2渲染为文字<script> alert("My FirstJavaScript");</script>
防止XSS攻击的手段为:凡是到VM页面中的内容都会执行HTML escape转义处理,因此<script>将转义为<script>。然而浏览器中脚本引擎只会执行<script>中的 内容,对<script>中的内容置若罔闻,从而避免CSS攻击。<script>只会被html解释器翻译为<script>在页面中显示。
4. 如何避免转义?
如果这段脚本不是有害脚本,不希望被转义该如何做呢?
将不希望被转义的内容放置在宏#noescape()..#end中即可,例如#noescape()$css#end,在加载页面时alert("My First JavaScript");就会被执行。或者根据noescape的配置放置在$stringEscapeUtil(ingonreTxt)
5. XSS攻击过程
图片来自这里