Skip to main content

安全

token​

使用 token 的缺点有哪些?答案:以 jwt 为例,token 一旦签发是无法撤回的,在时效内如果 token 泄露了,服务端有可能收到恶意请求。如何处理 token 过期问题?答案:在约定的过期时间之前,向服务器交换一个新的 token;并且在网页应用中维护一个统一的逻辑,比如当有异步请求响应类似 401 之类的状态码时,网页自动重定向到登录页之类的

服务端在设置客户端 cookie 时,添加 http-only 属性,能否避免 CSRF 攻击?回答:不能。http-only 只能防止浏览器脚本读取这个 cookie 值。CSRF 攻击并不需要获取具体 cookie 信息,只要携带就行。采用 token 方案才能避免 CSRF。

CSRF​

CSRF,跨站请求伪造(英文全称是 Cross-site request forgery),是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。

防御手段​

同源检测​

检查请求头 origin 或 referer, referer 可伪造,而且会屏蔽搜索引擎

在 url 请求参数中应该携带随机 TOKEN,繁琐​

CSRF Token​

CSRF Token 通常也会通过 Cookie 的方式保存在客户端(浏览器)中,以便在每个请求中携带 Token。

但是与普通的 Cookie 不同的是,CSRF Token 通常会采用 HttpOnly、Secure、SameSite 等安全措施来增强 Token 的安全性。

HttpOnly​

其中,HttpOnly 属性可以使得 Token 只能在服务端被访问,而无法在客户端被获取。

Secure​

Secure 属性可以保证 Token 只能通过 HTTPS 协议传输,避免 Token 被窃取。

重点​

SameSite 属性可以限制 Cookie 只能在同源请求中携带,从而避免跨站点攻击。(因此重点在于 SameSite,CSRF 即为跨站请求伪造攻击!

因此,虽然 CSRF Token 最终也会存储在客户端的 Cookie 中,但是通过使用一些安全措施,可以使得 Token 更加安全,从而有效地防止 CSRF 攻击。

SameSite​

SameSite 是 Cookie 的一个属性,用于指定 Cookie 是否可以在跨站点请求中被发送。它有三个可选值:

  • SameSite=None:表示 Cookie 可以在任何请求中发送,包括跨站点请求。但要注意,使用该选项必须同时设置 Secure 属性,以保证 Cookie 只会在安全的 HTTPS 连接中传输。

  • SameSite=Strict:表示 Cookie 只能在同站点请求中发送,不能在跨站点请求中发送。

  • SameSite=Lax:表示 Cookie 可以在一些跨站点请求中发送,例如从其他网站链接进入当前网站的 GET 请求,但对于 POST、PUT、DELETE 等修改请求,以及从其他站点的链接打开的窗口中的请求,仍然会被禁止发送。

    其中,SameSite=Strict 是最安全的选项,可以有效地防止跨站点攻击(如 CSRF 攻击)。而 SameSite=None 需要额外的安全措施,否则可能会被滥用。 SameSite=Lax 则提供了一种折中的方案,可以在一定程度上平衡安全性和用户体验。

缺点​

被滥用,会使得一些信息难以跨站点流转