XSS(跨站脚本攻击)漏洞

公司的安全部门检测出来,我们的页面有xss漏洞,链接后带上alert,页面会弹出alert

https://www.**.html?starType=%22/%3E%3Csvg/οnlοad=alert(1022)%3E

安全部门推荐过滤特殊字符来解决,我们此处通过encoderequest参数来解决

为了避免不同方法都要去html转码, 我们新建一个拦截器来处理。

 

一、新建interceptor

package com.*

import java.io.IOException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.util.HtmlUtils;

public class XssInterceptor extends HandlerInterceptorAdapter {

    // private final static Log log = LogFactory.getLog(XssInterceptor.class);

    private boolean             enabled                     = true;      // 默认为启用
    private final static String DEFAULT_JSONP_CALLBACK_NAME = "callback"; // jsonp默认回调函数名

    @Override
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws IOException, MalformedURLException {
        if (!enabled) { // 禁用后直接返回
            return true;
        }
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }

        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        
        // 获取页面提交到action前参数
        Map map = request.getParameterMap();
        
        // jsonp回调函数名是否已处理
        boolean isJsonpCallbackHandled = false;
        if (method.isAnnotationPresent(ResponseBody.class)) {
            isJsonpCallbackHandled = true;
            
            String[] args = (String[]) map.get(DEFAULT_JSONP_CALLBACK_NAME);
            if(null != args){
                for (int i = 0; i < args.length; i++) {
                    args[i] = HtmlUtils.htmlEscape(args[i]);
                }
                request.setAttribute(DEFAULT_JSONP_CALLBACK_NAME, args);
            }
        }

        if (!method.isAnnotationPresent(XssCheck.class)) {
            return true;
        }

        if (map != null && !map.isEmpty()) {
            Set<String> keys = map.keySet();
            Iterator<String> it = keys.iterator();
            while (it.hasNext()) {
                String key = it.next();

                // 该参数已经处理
                if (isJsonpCallbackHandled && DEFAULT_JSONP_CALLBACK_NAME.equals(key)) {
                    continue;
                }

                Object t = map.get(key);
                if (t instanceof String) {// 给String转码
                    if (t != null) {
                        t = HtmlUtils.htmlEscape((String)t);
                    }
                }
                if (t instanceof String[]) {// 给String数组转码
                    if (t != null) {
                        String[] args = (String[]) t;
                        String[] tmp = (String[]) t;
                        for (int i = 0; i < args.length; i++) {
                            args[i] = HtmlUtils.htmlEscape(tmp[i]);// 转码类
                        }
                        t = args;
                    }
                }
                request.setAttribute(key, t);
            }
        }
        
        return true;
    }
}

二、为了防止有的方法不需要做xss漏洞处理,我们新加一个注解,添加了此注解的方法才走此拦截器逻辑

package com.*;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface XssCheck {
    boolean value() default true;
}

三、controller方法里添加注解

@RequestMapping(value = "/test/{id}.html")
	@JProfiler(jKey = UmpConstant.WARE_SKU_CONTROLLER, jAppName = UmpConstant.APP_NAME, mState = { JProEnum.TP, JProEnum.FunctionError })
	public @XssCheck ModelAndView test( HttpServletResponse response, HttpServletRequest request) {
........
}

四、xml配置

 <mvc:interceptors>
		<bean class="com.*.XssInterceptor"/>
</mvc:interceptors>

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
跨站脚本攻击(Cross-Site Scripting,XSS)是一种常见的网络安全漏洞,攻击者利用这个漏洞向网站中注入恶意代码,并在用户浏览器上执行。这种攻击通常发生在存在输入输出的网页应用程序中。 XSS攻击主要分为三种类型: 1. 存储型XSS:攻击者将恶意代码存储在目标网站的数据库中,当其他用户访问该网站时,恶意代码被返回并在用户浏览器中执行。 2. 反射型XSS:攻击者构造一个包含恶意代码的URL,并将其发送给目标用户。用户点击链接后,恶意代码从URL中获取并在用户浏览器上执行。 3. DOM-based XSS:攻击者通过修改网页的DOM结构来执行恶意代码,不需要向服务器发送请求。这种类型的XSS攻击主要基于客户端脚本和DOM文档对象模型。 为了防止XSS攻击,开发人员可以采取以下几种措施: 1. 输入验证和过滤:对用户输入的数据进行验证和过滤,确保不允许包含恶意代码。 2. 输出编码:在将数据输出到网页上时,使用适当的编码方式(如HTML实体编码或JavaScript转义)来防止恶意代码的执行。 3. 使用安全的API:避免使用不安全的API,特别是将用户输入作为参数的API。例如,使用textContent替代innerHTML可以防止XSS攻击。 4. 设置HTTP头部:通过设置X-XSS-Protection和Content-Security-Policy头部,可以进一步加强网站的安全性。 请注意,这只是一些常见的防御措施,具体的应对措施还需要根据实际情况和开发框架来确定。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值