JSP页面c:out输出设计
设计概述:XSS攻击后最终的体现是在前端,直接暴露给用户,抓住前端代码处理环节是XSS最后的防护,由于以上我们做了大量的XSS处理杜绝源头,因此页面纯粹是增强设计。
应用场景设计:对controller的方法层直接返回页面,使用request.setAttribute,modelandview请求数据场景
c:out的作用域只能是Jsp,含Jsp的HTML部分、Javascript、css部分都是有效的,但是单独JS文件、CSS文件是无效引入。
步骤1:页面引入jstl c标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
步骤2:页面使用如下方式对el表示式处理;
<c:out value=”${groupName}” />
步骤3:注意事项
1)、<c:foreach> items引用的循环对象不要使用c:out输出;
2)、控件的属性值使用c:out时要么是双引号在外,单引号在内,反之亦然;
Js文件处理设计
设计概述:我们中台部分应用场景设计提交表单->回写表单的数据不是实时从数据库获取,需要F5二次刷新才可以取到已处理XSS的数据,初次回写造成XSS的攻击假象,因此针对这种场景又苦恼无法使用c:out,因此我们在Js里定义了一个页面简单转义的函数。
步骤1:定义html-util.js工具脚本类,增加如下代码
var HtmlUtil = {
htmlEncodeByRegExp : function(str) {
var s = "";
if (str.length == 0)
return "";
s = str.replace(/&/g, "&");
s = s.replace(/</g, "<");
s = s.replace(/>/g, ">");
s = s.replace(/ /g, " ");
s = s.replace(/'/g, "'");
s = s.replace(/"/g, """);
return s;
},
htmlDecodeByRegExp : function(str) {
var s = "";
if (str.length == 0)
return "";
s = str.replace(/&/g, "&");
s = s.replace(/</g, "<");
s = s.replace(/>/g, ">");
s = s.replace(/ /g, " ");
s = s.replace(/'/g, "'");
s = s.replace(/"/g, """);
return s;
}
};
步骤2:调用示例
var name = HtmlUtil.htmlEncodeByRegExp($("#name").val());
FAQ
如何避免重复转义?
答:由于我们最终字符串层都是统一调用spring-web的HtmlUtils类处理,不管是数据涉及编辑多次重复转义问题、还是Jackson输出前转义都需先还原原字符,然后再转义一次即可达合法输出。
如下代码:
HtmlUtils.htmlEscape(HtmlUtils.htmlUnescape(value));
哪些范围不能使用c:out输出?
答:富文本区域不能用c:out输出,如果硬要c:out请设置escapeXml=”false”
还有哪些地方需要完善?
答:具体系统具体分析,比如数据字典的正则表达式,应该特殊处理,然后涉及富文本的应该走富文本过滤,富文本XSS过滤还需进一步完善。
网友评论