CSRF(Cross-site request forgery),跨站请求伪造
亦称为:one click attack/session riding,缩写为:CSRF/XSRF。
CSRF,首先要获取站点用户登录信息,然后冒充正常用户登录,进行破坏活动,受害方为正常用户和站点。
攻击类型:显示攻击 / 隐式攻击
注意:用户网站是否存在脚本注入的漏洞,并不影响 CSRF 攻击,通过使用第三方存在安全隐患的网站同样可以完成 CSRF 攻击。
csrf攻击无法完全防范,只能提高攻击的门槛。方法比如:
改良站内 API 的设计
对于发布帖子这一类创建资源的操作,应该只接受 POST 请求,而 GET 请求应该只浏览而不改变服务器端资源。最理想的做法是使用restful风格的 API 设计,GET、POST、PUT、DELETE 四种方法对应资源的读取、创建、更新、删除操作。现在的浏览器基本不支持在表单中使用 PUT 和 DELETE 请求方法,我们可以使用 ajax 提交请求,也可以使用隐藏域指定请求方法,然后用 POST 模拟 PUT 和 DELETE。
这样,不同的资源操作区分的非常清楚,集中处理非 GET 类型的请求即可。
- 检测http的头信息refer
- 验证码
- CSRF token,请求令牌
Token 使用原则
Token要足够随机————只有这样才算不可预测
Token是一次性的,即每次请求成功后要更新Token————这样可以增加攻击难度,增加预测难度
Token要注意保密性————敏感操作使用post,防止Token出现在URL中
在表单中加入隐藏域,提交Token,然后在后端进行验证Token是否正确,注意,在验证后,Token就应该被销毁
CSRF 主流防御方式是在后端生成表单的时候生成一串随机 token ,内置到表单成为一个字段,同时,将此串 token 置入 session 中。每次表单提交到后端时都会检查这两个值是否一致,以此来判断此次表单提交是否是可信的。提交过一次之后,如果这个页面没有生成 CSRF token ,那么 token 将会被清空,如果有新的需求,那么 token 会被更新。
Alas, the final solution is using CSRF tokens. How do CSRF tokens work?
Server sends the client a token.
Client submits a form with the token.
The server rejects the request if the token is invalid
与XSS的联系和区别:
联系
CSRF可以利用XSS实现更有用的攻击。
XSS是跨站脚本,是实现CSRF的一种方式,是在站点的输入域执行脚本攻击,那么站点就需要对输入域的字段进行过滤。区别
CSRF不是XSS的子类,他们的本质问题不一样。XSS本质是服务端对输入过滤不严而后输出的时候将客户端的脚本再输出。
CSRF是服务端对用户的身份认证不严格(cookie等),使得攻击者冒充用户达到攻击目的。
防御CSRF的前提是防御XSS
最后:做好防御,前提是清楚要保护的对象,是那些直接产生数据变化的服务,而对于GET操作来说,则不需要,POST,UPDATE,DELETE操作等需要进行防御。