RESTful API 被广泛地应用于现代 Web 应用程序中。但是,RESTful API 的安全性问题一直是一个值得关注的问题。其中,CSRF(Cross-Site Request Forgery)攻击是其中的一种。本文将介绍 CSRF 攻击的背景,展示一些攻击示例,并提供如何保护 RESTful API 免受 CSRF 攻击的建议。
CSRF 攻击概述
CSRF 攻击是一种网络安全漏洞攻击,黑客利用用户的登录凭据,强制用户在未经授权的情况下执行意外的操作。这种攻击常常利用了浏览器在发送 HTTP 请求时的默认行为,即浏览器会自动发送附加到 Cookie 中的所有信息。黑客将有害代码注入被攻击网站,用户在访问此网站时,有害代码会利用该网站的值,携带用户的 Cookie 信息发送伪造请求,如果 Cookie 中的认证凭证有效,那么服务器将把请求看作是合法的并执行相应的操作。
CSRF 攻击示例
假设有一个在线购物网站存在 CSRF 攻击漏洞,该网站使用 RESTful API 接口 http://example.com/cart/add_item
将指定项的商品添加到用户的购物车中。
攻击者在另一个网站注入页面代码,这会将下面的表单提交到购物车添加 RESTful API 接口:
<form method="POST" action="http://example.com/cart/add_item"> <input type="hidden" name="product_id" value="12345"> <input type="hidden" name="quantity" value="1"> <input type="submit" value="Buy now!"> </form>
当用户访问黑客注入的页面并单击“立即购买”按钮时,由于该表单提交到购物车添加 RESTful API 接口,会添加一件商品到用户的购物车中。
保护 RESTful API 免受 CSRF 攻击
以下是一些建议,可帮助您保护 RESTful API 免受 CSRF 攻击。
随机 CSRF 令牌
为了防止 CSRF 攻击,您可以在表单和 Cookies 中添加随机值,称为 CSRF 令牌。服务器在响应请求时应该检查令牌是否有效,不匹配则应拒绝该请求。
例如,如果你使用 Express.js 技术栈,你可以使用 csurf
中间件自动生成 CSRF 令牌,如下所示:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- ---- - ---------------- ----- ---------- - ---------------------- -- -- --- ----- --- - --------- -- --- ------------------------------- --------- ---- --- --------------- -- ------ ------------- ---- ----- -- - -------------------- - --------------- ------ -- -- ------- -------------------------- ----- ---- -- - -- -- ---- -- -- -------------- --- ---------------- - ------ ----------------------------- ---- ------- - -- -------- --
在上面的例子中,我们使用 csurf
中间件生成 CSRF 令牌,并在每个表单中将令牌值渲染为 csrfToken
局部变量。
然后在添加购物车 RESTful API 接口中,我们验证与 POST 请求正文中提交的 CSRF 令牌是否相同。
确认引用资源
确保请求来自您的网站,可以在 HTTP 请求头中添加引用资源的域名。这样,如果请求来自未受信任的网站,就会被服务器拒绝。
例如,您可以使用以下示例代码来对 Express.js RESTful API 路由进行 X-Frame-Options CSRF 防御:
// 防御 X-Frame-Options app.use((req, res, next) => { res.setHeader('X-Frame-Options', 'SAMEORIGIN') next() })
使用双重认证
在某些情况下,将双因素认证(2FA)用于登录和重要操作,可以提供更高的安全性。2FA 可以使用任何一种二因素身份验证来实现,例如短信代码,邮件和双因素身份验证应用程序。
结论
在实现 RESTful API 时,您必须十分谨慎,以确保 API 免受恶意攻击。其中,CSRF 攻击是一种常见的攻击类型,如果您不采取行动,则会对您的应用程序造成严重影响。通过使用随机 CSRF 令牌、确认引用资源、使用具有双因素认证的安全措施,您可以较好地保护 RESTful API 免受 CSRF 攻击的威胁。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66faa4ac44713626014e78e4