tomcat 防xss 的一种实现

本文介绍了使用Servlet过滤器来防御XSS攻击的方法,重点在于如何在Filter中获取并处理POST请求的内容。通过创建HttpServletRequestWrapper的子类FormDataXssRequest,并在XssFilter中替换非法字符,实现了对POST请求数据的过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的解决方法, 通过Servlet 过滤器 过滤请求

关键在于是如何在Filter取到post里的内容

通过继承javax.servlet.http.HttpServletRequestWrapper;类替换post里的非法字符

1:FormDataXssRequest类

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * 防xss,替换request
 * Created by keygod on 2016/3/10.
 */
public class FormDataXssRequest extends HttpServletRequestWrapper {
    /**
     * Constructs a request object wrapping the given request.
     *
     * @param request
     * @throws IllegalArgumentException if the request is null
     */
    public FormDataXssRequest(HttpServletRequest request) {
        super(request);
    }
    //替换非法字符
    private String clean(String s){
        s=s.replaceAll("<","&lt;").replaceAll("script","").replaceAll("eval\\((.*)\\)","");
        return s;
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if(values==null){
            return null;
        }
        int count = values.length;
        String[] encodedValues = new String[count];
        for(int i= 0;i<count;i++){
            encodedValues[i] = clean(values[i]);

        }
        return encodedValues;
    }

}

2:XssFilter

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by keygod on 2016/12/21.
 */
public class XssFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    //替换了request
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        String currentURL = req.getRequestURI();//截取当前文件名用于比较
        String head = req.getHeader("Content-Type");

        if(currentURL.contains(".jsp")||currentURL.contains(".do")||currentURL.equals("/")){
            System.out.println(head);
            if(head!=null){
                if(!head.contains("application/x-www-form-urlencoded")){//payload
                //文件上传
//                    chain.doFilter(new PayloadXssRequest(req),res);

                    chain.doFilter(req,res);
                }else {//form data

                    chain.doFilter(new FormDataXssRequest(req),res);
//                    chain.doFilter(req,res);
                }
            }else {
                chain.doFilter(req,res);
            }
        }else {
            chain.doFilter(req,res);
        }

    }

    @Override
    public void destroy() {

    }
}
### 如何在 Tomcat 8.5 中添加默认的 XSS 护 HTTP 响应头 为了增强 Web 应用的安全性,在 Tomcat 8.5 上可以通过配置来添加默认的跨站脚本攻击 (XSS) 护 HTTP 响应头。具体操作方式如下: #### 修改 `web.xml` 文件以启用安全头部设置 可以在全局范围内的 `$CATALINA_BASE/conf/web.xml` 或者特定应用程序下的 `WEB-INF/web.xml` 文件中加入过滤器定义,用于向所有的HTTP响应附加必要的安全头部。 ```xml <filter> <filter-name>httpHeaderSecurity</filter-name> <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class> <!-- 开启 XSS 屏蔽 --> <init-param> <param-name>xssProtectionEnabled</param-name> <param-value>true</param-value> </init-param> <!-- 设置 XSS 安全模式 --> <init-param> <param-name>xssProtectionModeBlock</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>httpHeaderSecurity</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这段 XML 片段会激活内置于 Tomcat 的 HttpHeaderSecurityFilter 并开启针对 XSS 攻击的保护措施[^1]。 另外一种方法是直接编辑服务器级别的配置文件 `$CATALINA_HOME/conf/server.xml` 来实现相同的效果: ```xml <Host ... > ... <!-- 启动 XSS Filter --> <Valve className="org.apache.catalina.valves.XssPreventionValve"/> ... </Host> ``` 此 Valve 将自动为所有经过它的请求添加适当的 HTTP 头部信息,从而提供额外的一层御机制对抗潜在的 XSS 漏洞利用尝试[^2]。 值得注意的是,除了上述两种途径外,还可以考虑采用更细粒度的方式——即通过编程手段动态地控制这些头部信息的应用场景以及具体内容。这通常涉及到编写自定义 Servlet 过滤器或其他形式的服务端逻辑处理单元。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值