5

作者: wfayw | 来源:发表于2018-02-27 09:37 被阅读0次

    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过滤还需进一步完善。

    相关文章

      网友评论

          本文标题:5

          本文链接:https://www.haomeiwen.com/subject/dcrpxftx.html