解决sql注入和xss漏洞

WebMvcConfig.java

registry.addInterceptor(new SqlInjectInterceptor()).addPathPatterns("/**");

 SqlInjectInterceptor.java

@Component
public class SqlInjectInterceptor implements HandlerInterceptor{

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
        
        //按登录用户选择性使用拦截器
        Session session = SecurityUtils.getSubject().getSession();
        User user = (User) session.getAttribute(Constant.LOGIN_USER);
        //测试
        /*if(user==null || (user.getId()!= 2841 && user.getId()!= 2847)){
            return true;
        }*/
        //线上
        if(user==null || (user.getId()!= 3410 && user.getId()!= 3533)){
            return true;
        }
        
        //sql注入拦截
        Enumeration<String> names = request.getParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            String[] values = request.getParameterValues(name);
            for(String value: values){
                //sql注入直接拦截
                if(judgeSQLInject(value.toLowerCase())){
                    response.reset();
                    response.setContentType("application/json;charset=UTF-8");
                    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
                    response.setHeader("Access-Control-Allow-Credentials", "true");
                    PrintWriter pw = response.getWriter();
                    Map<String, Object> errorMap = new HashMap();
                    errorMap.put("status", 0);
                    Map<String, Object> statusInfo = new HashMap();
                    statusInfo.put("global", "参数含有非法攻击字符,已禁止继续访问!");
                    errorMap.put("statusInfo", statusInfo);
                    pw.write(JSON.toJSONString(errorMap));
                    pw.flush();
                    pw.close();
                    return false;
                }
                //跨站xss清理
                clearXss(value);
            }
        }
        return true;
    }

    /**
     * 判断参数是否含有攻击串
     * @param value
     * @return
     */
    public boolean judgeSQLInject(String value){
        if(value == null || "".equals(value)){
            return false;
        }
        //String xssStr = "and|or|select|update|delete|drop|truncate|%20|=|-|--|;|'|%|#|+|,|//|/| |\\|!=|(|)";
        String xssStr = "and|select|update|delete|drop|truncate|%20|=|--|;|'|%|#|+|//|/| |\\|!=|(|)";
        String[] xssArr = xssStr.split("\\|");
        for(int i=0;i<xssArr.length;i++){
            if(value.indexOf(xssArr[i])>-1){
                return true;
            }
        }
        return false;
    }

    /**
     * 处理跨站xss字符转义
     *
     * @param value
     * @return
     */
    private String clearXss(String value) {
        if (value == null || "".equals(value)) {
            return value;
        }
        value = value.replaceAll("<", "<").replaceAll(">", ">");
        value = value.replaceAll("\\(", "(").replace("\\)", ")");
        value = value.replaceAll("'", "'");
        value = value.replaceAll("eval\\((.*)\\)", "");
        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']",
                "\"\"");
        value = value.replace("script", "");
        return value;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL注入XSS漏洞是Web开发中常见的安全问题,下面我分别介绍如何防护这两种漏洞。 ## SQL注入防护 ### 1. 使用预编译语句 预编译语句可以将SQL语句和参数分开处理,从而避免了SQL注入攻击。在使用预编译语句时,首先需要定义SQL语句的模板,然后将参数绑定到模板中。 例如,使用Java语言的JDBC连接数据库时,可以使用PreparedStatement对象来实现预编译语句: ```java String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, username); statement.setString(2, password); ResultSet resultSet = statement.executeQuery(); ``` 上面的代码中,使用问号占位符代替了具体的参数值,然后通过setString方法将参数绑定到了PreparedStatement对象中,最后执行executeQuery方法执行查询操作。 ### 2. 过滤输入参数 在编写SQL语句时,需要对用户输入进行过滤,以确保输入的数据合法。一般来说,可以使用正则表达式来过滤用户输入,例如,限制用户名只能由数字和字母组成: ```java String username = request.getParameter("username"); if (!username.matches("^[a-zA-Z0-9]+$")) { // 返回错误信息 } ``` ### 3. 使用ORM框架 ORM框架(Object-Relational Mapping)可以将Java对象映射到数据库中的表,从而避免了手动编写SQL语句的过程。ORM框架通常会自动处理SQL注入攻击,因为它们使用预编译语句或者其他安全的方式来处理数据库操作。 ## XSS漏洞防护 ### 1. 过滤输出内容 在输出内容到Web页面时,需要对用户输入进行过滤,以确保输出的数据安全。一般来说,可以使用HTML编码来过滤用户输入,例如,将所有的<、>、&、'、"符号转换为HTML实体: ```java String username = request.getParameter("username"); out.print("Hello, " + StringEscapeUtils.escapeHtml(username) + "!"); ``` 上面的代码中,使用了Apache Commons Lang库中的StringEscapeUtils.escapeHtml方法来将用户输入进行HTML编码。 ### 2. 使用CSP策略 CSP(Content Security Policy)是一种Web安全策略,它可以限制Web页面中加载的资源,从而避免XSS攻击。CSP策略可以设置在HTTP响应头中,例如: ``` Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; ``` 上面的代码中,default-src表示默认的资源加载来源只能是当前域名,script-src表示脚本只能从当前域名和内联脚本中加载。这样一来,即使攻击者注入了恶意脚本,也无法在页面中执行。 ### 3. 使用HTTPOnly和Secure标记 在使用cookie时,可以设置HTTPOnly和Secure标记来避免XSS攻击。HTTPOnly标记可以防止JavaScript获取cookie的值,Secure标记可以确保cookie只能通过HTTPS协议传输。例如: ```java Cookie cookie = new Cookie("username", "Alice"); cookie.setHttpOnly(true); cookie.setSecure(true); response.addCookie(cookie); ``` 上面的代码中,设置了HTTPOnly和Secure标记后,即使攻击者注入了恶意脚本,也无法获取到cookie的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值