保姆级教学 XSS攻击的过滤器

对于XSS攻击,一种有效的防范措施是重写过滤器的方式来过滤一些有潜在风险的过滤器。

    过滤策略:把特殊字符转为HTML实体编码,
    这样存在数据库里较安全
    返回给前端时会被js解析为正常字符,不影响查看

eg:比如我处后端的处理字符串的操作有一个是:

str = str.replaceAll("\\?", "?");

这里以百度网盘为例,当前比如网页是:

http://pan.baidu.com/disk/main?from=oldversion#/brand

我想要进入别人的网盘

那么当我改导航时,http://pan.baidu.com/disk/main?from=***

此时,传入的request(也就是后端的str字符串)会把?替换成?然后命令就失效了。

如果在前端显示的话,?恰好能在前端显示出来"?",所以这是一种可能的方法解决XSS攻击的过滤器,我们直接上代码。

需要新建两个类

首先新建一个类XSSFilter;



import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;


public class XSSFilter implements Filter {

    @Override

    public void destroy() {


    }

    @Override

    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)

            throws IOException, ServletException {


        arg2.doFilter(new XSSRequestWrapper((HttpServletRequest) arg0), arg1);

    }

    @Override

    public void init(FilterConfig arg0) throws ServletException {

// TODO Auto-generated method stub

    }

}

在新建一个类XSSRequestWrapper;



import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.regex.Pattern;


public class XSSRequestWrapper extends HttpServletRequestWrapper {

    public XSSRequestWrapper(HttpServletRequest servletRequest){
        super(servletRequest);
    }

    @Override
    public String getHeader(String name){
        return super.getHeader(name);
    }

    @Override
    public String getParameter(String name){
        String value = super.getParameter(name);
        return xssEncode(value);
    }

    //对以FormData形式提交,Content-Type:application/x-www-from-urlencoded参数过滤
    @Override
    public String[] getParameterValues(String name){
        String[] values=super.getParameterValues(name);
        if(values==null){
            return null;
        }
        int count=values.length;
        String[] encodeValues=new String[count];
        for(int i=0;i<count;i++){
            encodeValues[i]=xssEncode(values[i]);
        }
        return encodeValues;
    }

    /*过滤策略:把特殊字符转为HTML实体编码,
     *这样存在数据库里较安全
     *返回给前端时会被js解析为正常字符,不影响查看*/
    public static String xssEncode(String str){
        if(str == null || str.isEmpty()){
            return str;
        }
        str = str.replaceAll(";", "&#59;");
        str = str.replaceAll("<", "&#60;").replaceAll(">", "&#62;");
        str = str.replaceAll("\\(", "&#40;").replaceAll("\\)", "&#41;");
        str = str.replaceAll("'", "&#39;").replaceAll("\"", "&#34;");
        str = str.replaceAll("\\$", "&#36;");
        str = str.replaceAll("%", "&#37;");
        str = str.replaceAll("\\/", "&#47;").replaceAll("\\\\", "&#92;");
        str = str.replaceAll(":", "&#58;");
        str = str.replaceAll("\\?", "&#63;").replaceAll("@", "&#64;");
        str = str.replaceAll("\\^", "&#94;");
        return str;
    }
}

那么接下来就是最后一步了,那就是配置啦。

我们需要在web.xml里加入如下的配置信息

    <filter>
        <filter-name>XSSFilter</filter-name>
        <filter-class>Protect.XSSFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>XSSFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

那么我们的整个项目就有过滤器了哦,快去试试吧!

如果有错误请指正。

如果觉得不错给作者一个免费的的点赞吧。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星星也倦了/

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值