跨站点请求伪造
2015-10-08 13:54
274 查看
appscan修订建议:
如果要避免 CSRF 攻击,每个请求都应该包含唯一标识,它是攻击者所无法猜测的参数。 建议的选项之一是添加取自会话 cookie
的会话标识,使它成为一个参数。服务器必须检查这个参数是否符合会话 cookie,若不符合,便废弃请求。 攻击者无法猜测这个参数的原因是应用于 cookie
的“同源策略”,因此,攻击者无法伪造一个虚假的请求,让服务器误以为真。 攻击者难以猜测且无法访问的任何秘密(也就是无法从其他域访问),都可用来替换会话标识。
这可以防止攻击者设计看似有效的请求。
比较容易想到的有下面两种思路:
方案一:每个请求都带上一个由服务器生成的随机参数。然后在服务器端和对该参数,如果和下发的随机数不同,则可以认为有人在伪造请求。因为攻击者无法知道他本次攻击的http请求需要带什么样的随机数才是有效的。
方案二:跨域伪造之所以能成功,主要决定因素是攻击者的页面和稍候被打开的目标页面共享session信息。受害者登录后,攻击者的页面通过ajax向被攻击网站的关键业务发起的请求便自动带上了合法的session信息。但是,根据javascript的同源策略可知,挂有A域名的窗口,不能获取挂有B域名窗口中的任何信息,不管B是如何被打开的。据此,我们可以在客户端的每个要保护的业务链接上增加一个参数sessionId,这个参数可以通过js从cookie中获得。然后,在服务器端获取此参数,并同真正的sessionId做对比,如果不同,则认为请求是伪造的。因为攻击者的窗口无法从被攻击网站的窗口中取得这个sessionId。
方案二的实现: 定义一个过滤器, 对页面传递过来的sessionid和实际sessionid进行比较, 相同则通过
1. 定义过滤器
2. 请求时增加sessionid参数
如果要避免 CSRF 攻击,每个请求都应该包含唯一标识,它是攻击者所无法猜测的参数。 建议的选项之一是添加取自会话 cookie
的会话标识,使它成为一个参数。服务器必须检查这个参数是否符合会话 cookie,若不符合,便废弃请求。 攻击者无法猜测这个参数的原因是应用于 cookie
的“同源策略”,因此,攻击者无法伪造一个虚假的请求,让服务器误以为真。 攻击者难以猜测且无法访问的任何秘密(也就是无法从其他域访问),都可用来替换会话标识。
这可以防止攻击者设计看似有效的请求。
比较容易想到的有下面两种思路:
方案一:每个请求都带上一个由服务器生成的随机参数。然后在服务器端和对该参数,如果和下发的随机数不同,则可以认为有人在伪造请求。因为攻击者无法知道他本次攻击的http请求需要带什么样的随机数才是有效的。
方案二:跨域伪造之所以能成功,主要决定因素是攻击者的页面和稍候被打开的目标页面共享session信息。受害者登录后,攻击者的页面通过ajax向被攻击网站的关键业务发起的请求便自动带上了合法的session信息。但是,根据javascript的同源策略可知,挂有A域名的窗口,不能获取挂有B域名窗口中的任何信息,不管B是如何被打开的。据此,我们可以在客户端的每个要保护的业务链接上增加一个参数sessionId,这个参数可以通过js从cookie中获得。然后,在服务器端获取此参数,并同真正的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()%>">
相关文章推荐
- 【扣丁学堂】谁说企业没人要老程序员
- ZOJ-3633-Alice's present
- js控制5秒后页面自动跳转
- angular.js基础—服务(service)及其调用
- 论c程序员转java学习
- 简单理解js面向对象工厂方式
- 转 GRE -- ME 似乎有件事,一直等待着我去做,努力去做。
- 手机号码归属地接口开发文档及调用实例
- 如何导入support_V4包中源码
- iOS退出键盘方法
- 嵌入式C语言中的Doxygen注释模板
- /persistence.cpp:5008: error: (-2) The node does not represent a user object (unknown type?) in func
- mac grep: /usr/include/php/main/php.h: No such file or directory
- Windows 10 windows update失败,无法更新补丁
- likely() and unlikely()
- SQl格式化日期时间
- 网络连接评分机制之NetworkFactory(原)
- bzoj-2797 Squarks
- bnuoj 24250 Binary Operations (概率DP)
- Forbidden You don't have permission to access / on this server.解决方法