Cookie的所有选项以及CSRF攻击

267 阅读1分钟

Cookie的选项

1、Expires

Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>

data是一个时间戳,不写的话,默认是会话结束后cookie过期.

2、Max-age

Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>

Max-Age是一个时间段,比如300表示300秒。假如二者 (指 Expires 和Max-Age) 均存在,那么 Max-Age 优先级更高

3、HttpOnly

Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly

设置了 HttpOnly 属性的 cookie 不能使用 JavaScript 经由 Document.cookie 属性、XMLHttpRequest 和 Request APIs 进行访问,以防范跨站脚本攻击(XSS)。

如何通过JavaScript修改Cookie:document.cookie="id=88";

CSRF攻击

1、什么是CSRF攻击

跨站请求伪造。比如我登录银行网站 your-bank.com,银行会返回给我一个cookie:

Set-Cookie:id=a3fWa;

然后我又访问恶意网站 malicious.com,网站内有个表单:

<form action="your-bank.com/transfer" method="POST">
  ...
</form>

表单的内容是给银行网站your-bank.com提交数据。如果此时Cookie允许跨站点传输,那么用户在提交表单的时候,就会把Cookie提交给银行your-bank.com。银行检查Cookie发现是可相信的,就会执行用户需要的操作。

2、防止CSRF

Cookie的Samesite属性可以限制Cookie的跨站传输。

2.1、SameSite:Strict

Set-Cookie: CookieName=CookieValue; SameSite=Strict;

此方法杜绝了CSRF攻击,恶意网站 malicious.com诱导用户给银行your-bank.com提交表单,用户发现提交表单的地址your-bank.com和恶意网站地址malicious.com不一样,因此提交表单时不允许携带Cookie。

坏处:假设现在某网站看到一个好文章,想转发到掘金上,结果跳到掘金的时候又需要登录,原因是第三方跳转的时候不允许携带Cookie。

2.2、SameSite:Lax

Set-Cookie: CookieName=CookieValue; SameSite=Lax;

大多数跳转不携带Cookie,特殊三种跳转可携带Cookie。

image.png