javascript - CSRF - 通过 api 调用询问是否安全?

标签 javascript api http csrf csrf-protection

我在使用 Angular 的站点上使用基于 session 的 CSRF。进行 HTTP 调用以请求 CSRF token 是否安全?

例如,如果我向一个名为/csrf/get 的页面发送了一个带有有效用户 session 的请求,并且它打印了一个原始 token ,这对于 CSRF 功能来说是否足够安全?如果不是,我可以做些什么来使其更安全,同时保持 JSON 检索功能?

这将是第一个 api 调用,然后我会把它保存在本地存储中,以便在每次 http 调用时使用它

最佳答案

简而言之,没有。您尝试进行 CSRF 保护的方式使您暴露于 CSRF,因为您的 csrf/get 端点未受到 CSRF 保护。

本质上,您需要保护自己免受两种主要攻击媒介的侵害:XSS 和 CSRF。

CSRF

CSRF 涉及您的站点和将尝试向您的站点发出经过身份验证的请求的恶意站点。如果有办法从恶意网站请求 CSRF token ,您就不会受到保护。 防止 CSRF 的常用方法是从您的身份验证 API 调用返回一个 token ,并将该 token 存储在浏览器 session 中。 此方法的问题在于它向您开放了 XSS

跨站攻击

跨站点脚本或 XSS 漏洞与您页面上运行的外部脚本有关。这包括攻击者插入的潜在恶意脚本。

本地存储和 session 存储并不安全,因此您不应在常规 cookie 中存储 token 。

为了免受 XSS 攻击您的身份验证响应可以存储 javascript 无法使用 HttpOnly cookie 读取的 cookie。

因此,使用通过 javascript 存储的 token 可以保护您免受 CSRF,但会向 XSS 开放,而使用 session cookie 可以保护您免受 XSS,但会向 CSRF 开放。

保护您的 API 免受 XSS 和 CSRF 攻击

解决方案是同时使用这两种方法:您的身份验证 API 应该设置一个 HttpOnly cookie 来防止 XSS,并且应该返回一个 token 来防止 CSRF。

请注意,不需要 csrf/get api,因为 token 应该由身份验证方法返回:您只想发送该 token 以交换有效凭据。还请记住在所有经过身份验证的 API 调用上发送并验证相同的 token

这是一篇很好的文章,解释了 API 安全性,更详细地解释了为什么以及如何做到这一点: http://www.redotheweb.com/2015/11/09/api-security.html

登录CSRF注意事项:

还应通过使用 CSRF token 创建预 session 来保护逻辑表单免受 CSRF。

(来自 https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#login-csrf)

大多数开发人员倾向于忽略登录表单上的 CSRF 漏洞,因为他们假设 CSRF 不适用于登录表单,因为用户在那个阶段未经过身份验证,但这种假设并不总是正确的。 CSRF 漏洞仍然可以发生在用户未通过身份验证的登录表单上,但影响和风险是不同的。

例如,如果攻击者使用 CSRF 在使用攻击者帐户的购物网站上假设目标受害者的经过身份验证的身份,然后受害者输入他们的信用卡信息,则攻击者可能能够使用受害者的帐户购买商品存储卡的详细信息。有关登录 CSRF 和其他风险的更多信息,请参阅 section 3 of this paper .

可以通过创建预 session (用户通过身份验证之前的 session )并在登录表单中包含 token 来缓解登录 CSRF。您可以使用上述任何技术来生成 token 。请记住,一旦用户通过身份验证,预 session 就无法转换为真实 session - 应该销毁 session 并创建一个新 session 以避免 session fixation attacks . Robust Defenses for Cross-Site Request Forgery section 4.1 中描述了此技术。 .

关于javascript - CSRF - 通过 api 调用询问是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52274847/

相关文章:

javascript - 使用javascript将数组转换为数组的数组?

api - 我可以检测magento函数是否正在作为API调用运行吗?

javascript - 纯粹使用 javascript 而不使用 Nodejs 下载 azure blob?

javascript - 双击打开链接

javascript - 解析 REST api 注销 401 未经授权

python - 如何使用请求模块使用 Python 将 JSON 文件的内容发布到 RESTFUL API

Angular 5 HTTP Client 的 Response header 中缺少 "Authorization"

http请求消息边界

python - 如何在网络上获取文件的创建日期(使用 Python)?

javascript - 为什么 ".title"无法到达动态创建的 html 元素的标题?