针对 跨站访问 CSRF漏洞,简单的解决方案

CSRF跨站漏洞,是通过  别的站点,间接访问 有漏洞的网址,依然可以造成数据的访问。

(转载)

1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。



解决方案,加过滤器,判断浏览器 request请求  header  中的Referer  的url是否是  可放行url


package com.chinalife.amp.manage.utils;

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;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


/***
 * 检查url请求是否正确,,防止出现csrf漏洞
 * @author think
 *
 */



//@Component
public class FilterUrlIsOk implements Filter {
	
	private final Logger logger = LoggerFactory.getLogger(FilterUrlIsOk.class);
	
	@Autowired
    FilterUrlConfig f;

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		logger.info("初始化filter过滤器");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//验证是否是可信url地址
		HttpServletRequest re=(HttpServletRequest)request;
		
		String[] urls=f.getUrls();
		
		//使用Referer判断内容
		Boolean refIsOk=false;
		
		//获取referer  
		String referer=re.getHeader("Referer");
		
		//判断是否是可信地址
		if(referer !=null) {
			
			for(int i=0;i<urls.length;i++) {
				
				refIsOk=referer.startsWith(urls[i]);
				break;
			}
		}
		
		//通过判断referer方式
		if(refIsOk) {
			//放行
			chain.doFilter(request, response);
			
		}else {
			//跳转至错误界面
			logger.info("不识别的请求地址:");
			request.getRequestDispatcher("error").forward(request, response);
		}
		
		
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		logger.info("filter过滤器已经销毁");
	}
	
	
	
}


package com.chinalife.amp.manage.utils;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@ConfigurationProperties(prefix="filter")
@Component
@PropertySource("classpath:application.properties")
public class FilterUrlConfig {
	
		private String[] urls;

		public String[] getUrls() {
			return urls;
		}

		public void setUrls(String[] urls) {
			this.urls = urls;
		}
		
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值