新版博客SEO优化基本完成,新老博客内容正在整合中,保证每篇文章高质量。 SiteMap RSS Github
客户端与服务器鉴权详谈
嘉美伯爵   2019年7月24日 14:52   技术   http   163  

CRSF

这是较为传统的认证方式CSRF漏洞存在的关键,下面是CSRF问题的关键

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

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

在这里我们假设一种情况,用户访问了危险网站,并没有向服务器发出退出请求,这时危险网站在获取到浏览器的COOKIE后就可以携带发给服务器,此时服务器无法判断请求者身份,所以给其放行,而这时危险网站已经完成的转账操作。

# 危险网站请求
<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
# 服务器表单
<form action="Transfer.php" method="POST">
    <p>ToBankId: <input type="text" name="toBankId" /></p>
    <p>Money: <input type="text" name="money" /></p>
    <p><input type="submit" value="Transfer" /></p>
</form>

那么怎么防止钓鱼网站的攻击的,那么一个很好的办法就是浏览器每向服务器请求一次,我们都返回一个csrftoken,那么当危险网站发出request请求时,发现这个表单不是由我签发的,那么这是服务器便会返回一个403的访问被拒绝。

<form method="post" action="/delete">
  <!-- 其他字段 -->
  <input type="hidden" name="csrftoken" value="由服务端生成"/>
</form>

JWT

近几年随着前后端分离项目的流行,JWT验证方式成为了主流,那么JWT是如何避免CSRF攻击的呢?

  • JWT 认证流程

  • JWT 加密流程

# header,包含加密方式、类型
{
  "alg": "HS256",
  "typ": "JWT"
}
# payload,此部分此段也可自已定义,下面是官方字段
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
# signature,对header和payload部分进行拼接以点分割,secret来自服务器,他是一直对称加密
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

oAuth2.0

此协议主要分为三部分,请求用户授权、获取令牌、传输数据

三者区别

  • 使用cookie + session进行验证,我们需要服务器集群数据同步的问题
  • 使用cookie + session进行验证,会给服务器带来一定的查询压力
  • 每次生成的jwt具有一定的时效,因此我们只要遵循jwt的对称加密解密流程即可,而不用每次都要去查询数据库
  • JWT 不仅可以用于认证,也可以用于交换信息
  • 很显然oAuth2.0协议最安全,它不涉及任何cookie,换取令牌的动态均在服务端完成,更为安全

XSS

参考文档

前端安全系列(一):如何防止XSS攻击?

RESTful API 最佳实践

跨域资源共享 CORS 详解

jwt 怎么防止 csrf

安全 – 在浏览器中存储JWT的位置?如何防范CSRF?

JSON Web Token 入门教程

浅谈CSRF攻击方式

Web安全如何通过JWT防御CSRF

JWT 超详细分析

FreeBuf 文章:如何防止CSRF攻击?