web安全之跨站请求伪造

CSRF(Cross-site request forgery),中文名称:跨站请求伪造.

因为这个不是用户真正想发出的请求,这就是所谓的请求伪造;因为这些请求也是可以从第三方网站提交的,所以前缀跨站二字。

CSRF发生的场景如下图所示:

用户登录访问了一个受信任的站点,

在用户还没有退出登录的时候,打开另外一个tab页,访问了网站B。

在B网站中,有CSRF攻击代码访问网站A。

发生的原因是,网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个

标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站会带上这个cookie。

1.登录受信任网站A,并在本地生成Cookie。

2.在不登出A的情况下,访问危险网站B。

你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。

是的,确实如此,但你不能保证以下情况不会发生:

1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。

2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。

(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于

退出登录/结束会话了)如记住密码功能等。

3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

下面来看一个代码实例,在网站A发布了下面的代码

用户login,然后可以在input.jsp提交数据,提交的数据被dataupdate.jsp更新到后台。

dataupdate.jsp会检查用户是否登录,如果没有登录会跳到login.jsp要求用户登录。

[html] view plaincopy

login.jsp

name

pwd

input.jsp

dataupdate.jsp

表面上看起来好像没有问题。

假设我们有另外一个网站B,它有一个网页文件如下

如果在用户登录访问网站A的同时访问了网站B,访问者在网站A的数据就会被假冒更新。

可以在后台看到有如下的输出:add a comment: fromcsrf

[html] view plaincopy

use a img element to send a get request

这里网站A违反了HTTP规范,使用GET请求更新资源。那是不是用post请求就不会发生CSRF呢?

结果是同样会发生。可以通过构造javascript构造form提交,如下面的代码

[html] view plaincopy

防止方法:

1,利用referer判断,

但是用户有可能设置浏览器使其在发送请求时不提供 Referer,这样的用户也将不能访问网站。

2,在请求中添加 token 并验证

关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中,

可以在服务器端生成一个随机码,然后放在form的hidden元素中,form提交的时候在服务器端检查。

沈阳性病医院哪家好:http://yyk.39.net/sy/zhuanke/fc844.html

沈阳性病医院:http://yiyuan.120ask.com/syxb/

你可能感兴趣的:(web安全之跨站请求伪造)