Csrf Xss 总结·对比
CSRF 是什么
CSRF(Cross-site request forgery):跨站请求伪造。也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
CSRF 可以做什么?
你这可以这么理解 CSRF 攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF 能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账。… 造成的问题包括:个人隐私露以及财产安全。
CSRF 的攻击原理
用户是网站 A 的注册用户,且登录进去,于是网站 A 就给用户下发 cookie。 从上图可以看出,要完成一次 CSRF 攻击,受害者必须满足两个必要的条件:
- (1)登录受信任网站 A,并在本地生成 Cookie。(如果用户没有登录网站 A,那么网站 B 在诱导的时候,请求网站 A 的 api 接口时,会提示你登录)
- (2)在不登出 A 的情况下,访问危险网站 B(其实是利用了网站 A 的漏洞)。
我们在讲 CSRF 时,一定要把上面的两点说清楚。 温馨提示一下,cookie 保证了用户可以处于登录状态,但网站 B 其实拿不到 cookie。
举个例子,前端事假你,微博网站有个 api 接口有漏洞,导致很多用户的粉丝暴增。
CSRF 如何防御
方法一、Token 验证:(用的最多)
- 服务器发送给客户端一个 token;
- 客户端提交的表单中带着这个 token。
- 如果这个 token 不合法,那么服务器拒绝这个请求。
示例:
// 生成随机数token
crutime := time.Now()
h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime, 10))
io.WriteString(h, "ganraomaxxxxxxxxx")
token := fmt.Sprintf("%x", h.Sum(nil))
方法二:隐藏令牌
把 token 隐藏在 http 的 head 头中。 方法二和方法一有点像,本质上没有太大区别,只是使用方式上有区别。
方法三、Referer 验证
Referer 指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截。
常见防御手段:CSRF
CSRF 工具的防御手段:
尽量使用 POST,限制 GET
添加验证码(验证码,强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制 CSRF 攻击)
验证 referer(HTTP Referer 是 header 的一部分,当浏览器向 web 服务器发送请求的时候,会带上 Referer,通过验证 Referer,可以判断请求的合法性,如果 Referer 是其他网站的话,就有可能是 CSRF 攻击,则拒> 绝该请求。)
使用 token(这个 Token 的值必须是随机的,不可预测的。由于 Token 的存在,攻击者无法再构造一个带有合法 Token 的请求实施 CSRF 攻击。另外使用 Token 时应注意 Token 的保密性,尽量把敏感操作由 GET 改为 POST,以 form 或 AJAX 形式提交,避免 Token 泄露)
XSS(Cross Site Scripting):跨域脚本攻击
核心是 注入 恶意代码
XSS 的攻击原理
XSS 攻击的核心原理是:不需要你做任何的登录认证,它会通过合法的操作(比如在 url 中输入、在评论框中输入),向你的页面注入脚本(可能是 js、hmtl 代码块等)。
最后导致的结果可能是:盗用 Cookie 破坏页面的正常结构,插入广告等恶意内容 D-doss 攻击 XSS 的攻击
预防 xss
- 验证所有输入数据,有效检测攻击——限制输入数据的类型,值,范围等等
- 个是对所有输出数据进行适当的处理——一般的 web 框架会进行自动转义,以防止任何已成功注入的脚本在浏览器端运行。
html 转义,就是将包含的 html 标签输出,而不被解释执行
比如,Django 会将如下字符自动转义:
< 会转换为<
> 会转换为>
' (单引号) 会转换为'
" (双引号)会转换为 "
& 会转换为 &
CSRF 和 XSS 的区别
- CSRF:需要用户先登录网站 A,获取 cookie。XSS:不需要登录。
- CSRF:是利用网站 A 本身的漏洞,去请求网站 A 的 api。XSS:是向网站 A 注入 JS 代码,然后执行 JS 里的代码,篡改网站 A 的内容。
- 原文作者:战神西红柿
- 原文链接:https://tomatoares.github.io/posts/web/csrf-xss/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。