跨站点请求伪造

 

跨站点请求伪造

url: http://www.cnblogs.com/jimor/p/3417998.html

posted on 2013-11-11 15:35 jinjinwang

 

IBM appscan扫描漏洞--跨站点请求伪造

 

appscan修订建议:

 

如果要避免 CSRF攻击,每个请求都应该包含唯一标识,它是攻击者所无法猜测的参数。建议的选项之一是添加取自会话 cookie

的会话标识,使它成为一个参数。服务器必须检查这个参数是否符合会话 cookie,若不符合,便废弃请求。攻击者无法猜测这个参数的原因是应用于 cookie

的“同源策略”,因此,攻击者无法伪造一个虚假的请求,让服务器误以为真。攻击者难以猜测且无法访问的任何秘密(也就是无法从其他域访问),都可用来替换会话标识。

这可以防止攻击者设计看似有效的请求。

 

比较容易想到的有下面两种思路:

 

方案一:每个请求都带上一个由服务器生成的随机参数。然后在服务器端和对该参数,如果和下发的随机数不同,则可以认为有人在伪造请求。因为攻击者无法知道他本次攻击的http请求需要带什么样的随机数才是有效的。

方案二:跨域伪造之所以能成功,主要决定因素是攻击者的页面和稍候被打开的目标页面共享session信息。受害者登录后,攻击者的页面通过ajax向被攻击网站的关键业务发起的请求便自动带上了合法的session信息。但是,根据javascript的同源策略可知,挂有A域名的窗口,不能获取挂有B域名窗口中的任何信息,不管B是如何被打开的。据此,我们可以在客户端的每个要保护的业务链接上增加一个参数sessionId,这个参数可以通过jscookie中获得。然后,在服务器端获取此参数,并同真正的sessionId做对比,如果不同,则认为请求是伪造的。因为攻击者的窗口无法从被攻击网站的窗口中取得这个sessionId

 

方案二的实现:定义一个过滤器, 对页面传递过来的sessionid和实际sessionid进行比较,相同则通过

 

1. 定义过滤器

 

 

<filter>

        <filter-name>SessionFilter</filter-name>

        <filter-class>com.xxx.common.security.auth.SessionFilter</filter-class>

    </filter>

    <filter-mapping>

        <filter-name>SessionFilter</filter-name>

        <url-pattern>/login.do</url-pattern>

    </filter-mapping>

 

 

@Override

    public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletrequest;

        HttpServletResponse response = (HttpServletResponse) servletresponse;

        String clientSessionId = servletrequest.getParameter("ssid");

        String serverSessionId = request.getSession().getId();

        if (serverSessionId.equals(clientSessionId)) {

            filterchain.doFilter(request, response);

        } else {

            response.sendRedirect("/common/dataError");

        }

    }

 

2. 请求时增加sessionid参数

 

<input type=hidden id="ssid" name="ssid" value="<%=request.getSession().getId()%>">

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值