XSS漏洞 解决

转译参数


     将容易引起xss漏洞的半角字符直接替换成全角字符 

    public String xssEncode(String s)  
    {  
        if (s == null || s.isEmpty())  
        {  
            return s;  
        }  
          
        String result = stripXSS(s);  
        if (null != result)  
        {  
            result = escape(result);  
        }  
          
        return result;  
    }  
      
    private String stripXSS(String value)   
    {  
                if (value != null)   
                {  
                    // NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to  
                    // avoid encoded attacks.  
                    // value = ESAPI.encoder().canonicalize(value);  
                    // Avoid null characters  
                    value = value.replaceAll("", "");  
                    // Avoid anything between script tags  
                    Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                    // Avoid anything in a src='...' type of expression  
                    scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                    scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                    // Remove any lonesome </script> tag  
                    scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                    // Remove any lonesome <script ...> tag  
                    scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                    // Avoid eval(...) expressions  
                    scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                    // Avoid expression(...) expressions  
                    scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                    // Avoid javascript:... expressions  
                    scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                    // Avoid vbscript:... expressions  
                    scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                    // Avoid onload= expressions  
                    scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                      
                    scriptPattern = Pattern.compile("<iframe>(.*?)</iframe>", Pattern.CASE_INSENSITIVE);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                      
                    scriptPattern = Pattern.compile("</iframe>", Pattern.CASE_INSENSITIVE);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                    // Remove any lonesome <script ...> tag  
                    scriptPattern = Pattern.compile("<iframe(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                    value = scriptPattern.matcher(value).replaceAll("");  
                }  
                return value;  
        } 
### 解决Spring Boot中XSS漏洞的方法 #### 防御措施概述 避免XSS攻击最有效的方式是对用户输入的数据进行转义,再将其存入数据库。当数据在视图层用于渲染HTML页面时,经过转义处理的文字不会作为JavaScript被执行,从而可以抵御XSS攻击[^3]。 #### 导入必要的依赖库 为了增强应用程序的安全性,建议引入专门针对安全性的库来帮助预防潜在的威胁。对于基于Maven构建工具管理的Spring Boot项目而言,可以在`pom.xml`文件内加入如下配置: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- OWASP Java HTML Sanitizer --> <dependency> <groupId>com.googlecode.owasp-java-html-sanitizer</groupId> <artifactId>owasp-java-html-sanitizer</artifactId> <version>20211018.2</version> </dependency> ``` 上述代码片段展示了如何添加OWASP提供的Java HTML清理器至项目的依赖列表之中,该组件能够有效地过滤掉有害标签和属性,确保只允许特定范围内的标记存在。 #### 对用户提交的内容实施严格的验证与净化策略 除了简单的字符替换外,更推荐采用白名单机制对所有来自客户端的信息进行全面审查;即仅接受已知无害且必需的部分,其余一律丢弃或拒绝接收。具体实现方式取决于业务逻辑需求以及所使用的模板引擎类型(Thymeleaf/JSP等),下面给出一段利用Apache Commons Lang中的StringEscapeUtils类来进行基本编码转换的例子: ```java import org.apache.commons.lang3.StringEscapeUtils; // 假设input是从HTTP请求参数获取到的一串字符串形式的数据 public String sanitizeInput(String input){ return StringEscapeUtils.escapeHtml4(input); } ``` 这段示例函数会把传入的任意文本序列转化为符合HTML标准的安全版本,其中任何特殊符号都会被替换成对应的实体表示法,比如 `<` 变成 `<`, `>` 成为 `>` 等等。 #### 设置响应头以增加额外防护层次 通过调整服务器端发出的HTTP头部信息也能起到辅助作用,例如启用Content Security Policy (CSP),它能精确控制哪些资源是可以信任并加载执行的,极大地降低了遭受反射型或存储型XSS侵害的风险程度。可在全局配置文件application.properties里指定相应选项: ```properties server.servlet.session.cookie.http-only=true security.headers.frame-options=DENY management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always # CSP policy example server.error.whitelabel.enabled=false server.servlet.context-path=/secure-app # Add this line to enforce strict CSP rules server.servlet.jsp.init-parameters.default-csp-directive="default-src 'self'; script-src 'self' https://apis.google.com;" ``` 以上设置不仅强化了Cookie安全性、阻止点击劫持尝试,还定义了一套较为严谨的内容安全方针,限制外部脚本加载路径仅为当前域本身加上谷歌API服务地址[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值