什么是CSRF攻击?
CSRF(Cross-site request forgery)攻击,也称为“跨站请求伪造”,指黑客利用用户已经登录了某个网站的情况下,在用户不知情的情况下,通过构造恶意请求来执行一些潜在危险的操作,例如修改用户信息、发送恶意邮件等。
举个例子,假设你已经登录了一个购物网站,此时你访问了一个恶意网站,该网站中包含了一个图像标签,它的src
属性指向了购物网站的某个接口,而这个接口可以修改你的配送地址。当你访问该网站时,浏览器会向购物网站发送一个带有修改配送地址请求的HTTP请求,而由于你已经登录了购物网站,所以该请求会被认为是合法的,进而执行了修改操作。
对于CSRF攻击,我们需要采取措施来防范。
CSRF防范方案之——CSRF保护头
在HTTP请求中加入CSRF保护头是常见的防范CSRF攻击的方式之一。其核心思想是在HTTP响应中添加一个自定义头部字段,比如X-CSRF-Token
,该字段的值是一个随机生成的字符串。当客户端发送请求时,需要在请求头部中添加一个与响应头部相同的字段,并将其值设置为响应头部中X-CSRF-Token
字段的值。如果两个值不一致,则该请求被认为是非法的。
下面是一个示例代码:
-- -------------------- ---- ------- -- ---- -------- --- -- ------------- ----------------------- ----------- --------------------- ------------- -------------- -- ---- ---- --------- -------- ----- --------------- ------- --------------------- ------------- -------------- ------------- --------------------------------- --------------- -- --------------------------
为了让CSRF保护头生效,我们需要确保以下几点:
- 所有敏感操作(比如修改或删除数据)都要验证CSRF保护头。
X-CSRF-Token
字段的值必须是随机生成的,不能是静态的。- CSRF保护头不能在响应的HTML页面中泄露,否则攻击者可以通过解析页面获取
X-CSRF-Token
的值。 - Cookie必须启用SameSite属性,以限制Cookie只能由相同站点的请求访问。
CSRF防范方案之——CSRF令牌
除了CSRF保护头之外,还有一种常见的防范CSRF攻击的方式是使用CSRF令牌。
该方案的核心思想是在每次敏感操作中添加一个随机生成的字符串作为参数,比如csrf_token=abcdefg1234567
。当服务器接收到请求时,需要对该参数进行验证,如果不合法则拒绝请求。由于该参数是动态生成的,攻击者很难猜测出正确的值。
下面是一个示例代码:
// 请求参数 POST /api/user HTTP/1.1 Host: www.example.com Cookie: JSESSIONID=1234567890 Content-Type: application/x-www-form-urlencoded Content-Length: 45 username=test&password=123&csrf_token=abcdefg1234567
在使用CSRF令牌时,我们需要注意以下几点:
- 所有敏感操作都要添加CSRF令牌。
- CSRF令
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/12674