什么是 CSRF 攻击?
CSRF(Cross-site request forgery),中文名为跨站请求伪造,是一种常见的网络攻击方式。攻击者通过构造恶意网站或者利用已经存在的漏洞,让用户在已经登录的网站上执行某些操作,例如转账、修改密码等,从而达到攻击的目的。
CSRF 攻击原理
CSRF 攻击的原理是利用用户在已经登录的网站中的身份信息,构造伪造的请求,以达到攻击的目的。攻击者可以通过构造一个链接或者一个表单,让用户在不知情的情况下执行某些操作,比如:
<img src="https://example.com/api/transfer?to=attacker&amount=10000" width="0" height="0" style="display:none;">
上面的代码会向 https://example.com/api/transfer
发送一个转账请求,将 10000 元转账到攻击者的账户中。当用户访问包含上述代码的页面时,浏览器会自动向 https://example.com/api/transfer
发送请求,由于用户已经登录,因此请求会携带用户的身份信息,攻击者就可以利用这个信息执行转账操作。
CSRF 攻击的防御策略
1. 验证来源站点
验证来源站点是防御 CSRF 攻击的最基本策略。在 Express 中,可以通过设置 origin
头来实现验证来源站点的功能。当请求的来源站点和目标站点不一致时,可以返回一个 403 错误,拒绝请求。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ------------- ---- ----- -- - ----- ------ - ------------------ -- ------- --- ---------------------- - ------ ---------------------------------- - ------- ---
上面的代码会验证请求的来源站点是否为 https://example.com
,如果不是,则返回 403 错误。
2. 添加 CSRF Token
在每个表单中添加一个 CSRF Token,可以有效地防御 CSRF 攻击。在 Express 中,可以使用 csurf
中间件来添加 CSRF Token。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---- - ----------------- ----- ------------ - ------------------------- ----- --- - ---------- ------------------------ -------------- ------- ---- ---- ---------------- ----- ---- -- - ----- --------- - ---------------- ---------- ----- ------------------ -------------- ------ ------------- ------------ --------------------- ------ ----------- --------- ------------------ ------ ------------- ------------- ----------------- ------- ------------------------- ------- --- --- --------------------- ----- ---- -- - ----- - --- ------ - - --------- -- -- ---- ----- -- ---------------- --- --------------- - ------ ---------------------------------- - -- ------ -- --- ----------------- ---
上面的代码中,使用了 csurf
中间件来添加 CSRF Token,并在表单中添加了一个隐藏的 _csrf
字段。在处理 POST 请求时,验证请求中的 CSRF Token 是否和服务器生成的一致,如果不一致,则返回 403 错误。
3. 添加 SameSite 属性
在 Cookie 中添加 SameSite 属性可以有效地防御 CSRF 攻击。SameSite 属性可以控制 Cookie 的跨站访问,当设置为 Strict 时,只有同站点的请求才能携带 Cookie,从而防止 CSRF 攻击。
在 Express 中,可以使用 cookie-session
中间件来添加 SameSite 属性。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------------- - -------------------------- ----- --- - ---------- ----------------------- ----- ---------- ----- -------- -------- ------- -- - -- - -- - ----- -- - --- --------- --------- -- -- -------- -- ----
上面的代码中,使用了 cookie-session
中间件来添加 Cookie,并设置了 SameSite 属性为 Strict。
总结
CSRF 攻击是一种常见的网络攻击方式,可以通过验证来源站点、添加 CSRF Token、添加 SameSite 属性等方式来防御。在使用 Express.js 开发应用时,可以使用 origin
头、csurf
中间件、cookie-session
中间件等工具来实现防御 CSRF 攻击的功能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6565968cd2f5e1655ded0aca