跨站点请求伪造

摘要:
IBM appscan扫描漏洞--跨站点请求伪造appscan修订建议:如果要避免CSRF攻击,每个请求都应包含唯一标识符,这是攻击者无法猜测的参数。服务器必须检查此参数是否符合会话cookie。如果没有,请求将被丢弃。这防止了攻击者设计看似有效的请求。受害者登录后,攻击者的页面将自动通过ajax向受攻击网站的关键业务发送带有请求的法律会话信息。然后,在服务器端获取此参数,并将其与实际sessionId进行比较。如果不同,则该请求被视为伪造。

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

appscan修订建议:

如果要避免 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()%>">

免责声明:文章转载自《跨站点请求伪造》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ArcGIS 网络分析[1.2] 利用1.1的线shp创建网络数据集/并简单试验最佳路径解决 FileZilla_Server 因路径错误导致的无法启动问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

【NS-3学习】ns3-模拟基础:关键概念,日志,命令行参数

前言本博客首先介绍了模拟过程中使用的一些关键概念,然后介绍了有助于调试模拟脚本的常见技术:日志、命令行参数。Ns-3不是一个特殊的互联网模拟器,而是一个网络模拟器。在ns-3的仿真环境中,节点可以连接到表示数据交换通道的对象。这里,基本通信子网的抽象概念被称为信道,由C++中的channel类描述。在ns-3中,网络设备的抽象概念相当于硬件设备和软件驱动程序...

用python调用caffe时出错:AttributeError: 'module' object has no attribute 'bool_'

下面给出了一个解决方案,即重命名冲突的io文件:numpyと PyCaffe公司が io。年が 竞争す る よ で す$ pythonclassify。py--raw_scale255~/caffe/101_ObjectCategories/airaires/image_0001.jpg../result.npyTraceback:文件“classif.py...

MySQL 字段类型占用空间

MySQL支持多种列类型:数值类型、日期/时间类型和字符串(字符)类型。)1或2个字节,取决于枚举值的个数SET(‘value1’,’value2’,…)1、2、3、4或者8个字节,取决于set成员的数目上表的M只是为了说明占用空间大小,在实际创建表中char、varchar,20指的是字符而不是字节;那么字符和字节的转换要看字符集,utf-8下,1字符=3...

001_Three.js中的跨域问题

】当请求的资源和请求脚本不在同一域中时,将发生跨域。有关详细信息,请参见链接。这是一个需要进一步考虑的问题。它是一个装载机。它加载本地资源。为什么要跨域请求?...

FTPClient

(iReplyCode==331||iReplyCode==230)){CloseSocketConnect();thrownewIOException(strReply.Substring(4));}if(iReplyCode!=230){SendCommand("PASS"+strRemotePass);if(!=null){SendCommand("Q...

docker默认网段和主机网段冲突解决

一、docker默认网卡docker0172.17.0.0可能会与主机冲突,这时候需要修改docker默认分配的网段1、修改/etc/docker/daemon.json文件,加入以下代码{"default-address-pools":[{"base":"172.100.0.0/16","size":24}]}其中上面的172.100.0.0/16是自定义...