CSRF(Cross-site request forgery,跨站请求伪造),是通过伪造请求,冒充用户在站内进行操作
比如,点击发帖后会进行如下GET请求
http://example.com/bbs/create_post.php?title=标题&content=内容
那么,如果我们模拟了请求的链接,那么只要有用户点击了这个链接,他就会在不知情的情况下发布了这一帖子,那么删贴,发邮件等等都可以进行伪造
http://example.com/bbs/create_post.php?title=攻击&content=哈哈
如何防范 CSRF 攻击
- CSRF 攻击之所以能够成功:是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证
- 所以解决办法是:在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中
- 验证 HTTP Referer 字段
- 关键操作只接受POST请求,因为GET请求的参数携带在URL中,很容易进行模拟,而POST请求的参数在http body中
- 验证码,每次操作都需要用户进行互动,从而简单有效的防御了CSRF攻击,但是验证码太多,也会影响用户体验
- 可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端来验证这个 token
- 可以在 HTTP 头中自定义的属性里加入一个随机产生的 token,通过XMLHttpRequest,可以给所有请求加上这个token,通过XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中
注意:过滤用户输入的内容不能阻挡 CSRF,我们需要做的是过滤请求的来源
XSS(Cross Site Scripting,跨站脚本攻击),是注入攻击的一种,特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径
例如:发布评论,提交含有 JavaScript 的内容文本,如果服务器端没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本,或者是一些未授权的操作
while (true) { alert("你关不掉我~"); }
在输入框中输入document.cookie
,可以直接获得cookie
中的内容,所以,在重要的cookie
参数中加入httpOnly
属性
XSS 是实现 CSRF 的诸多途径中的一条,一般习惯上把通过 XSS 来实现的 CSRF 称为 XSRF
如何防御 XSS 攻击
理论上,所有可输入的地方没有对输入数据进行处理的话,都会存在XSS漏洞,防御 XSS 攻击最简单直接的方法,就是过滤用户的输入
可以直接对用户的输入进行 HTML escape
<script>window.location.href=”http://www.baidu.com”;</script>
经过 escape 之后,就不能执行了
<script>window.location.href="http://www.baidu.com"</script>
参考文章推荐
总结 XSS 与 CSRF 两种跨站攻击