问题标签 [csrf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
security - 通过在 Session 变量和表单中存储 nonce 来保护 CSRF
为了防止 CSRF,您应该在表单的隐藏字段中、cookie 或会话变量中放置一个 nonce。但是,如果用户在不同的选项卡中打开多个页面怎么办?在这种情况下,每个选项卡都会有一个具有唯一 nonce 的表单,但会话变量或 cookie 中只会存储一个 nonce。或者,如果您尝试将所有 nonce 存储在 cookie/session 变量中,您将如何识别哪个属于哪种形式?
ruby-on-rails - 使跨站点请求伪造令牌在 Rails 中的寿命更长
在我制作的应用程序中,我收到了很多这样的消息:
我怀疑它正在发生,因为人们在该页面上花费了大量时间而没有刷新它(它使用 ajax)并且令牌过期。
有没有办法让这些代币寿命更长?
web-services - 将 CSRF 保护与 RESTful API 相结合的可行技术有哪些?
我很想听听人们在为他们的 Web 应用程序构建 RESTful(或准 RESTful)API 时采用了哪些方法。
一个实际的例子:
假设您有一个传统的基于浏览器的 Web 应用程序,它在所有表单上都使用 CSRF 保护。带有 CSRF 保护令牌的隐藏输入包含在浏览器中显示的每个表单中。提交表单后,如果此输入与服务器端版本的令牌不匹配,则该表单被视为无效。
现在假设您想将 Web 应用程序公开为 API(可能使用 JSON 而不是 HTML)。传统上,在发布 API 时,我认为事务是单方面的(这意味着 API 使用者基于已发布的 API 构建请求,而不是首先请求表单,然后使用返回的表单构建请求)。
当 CSRF 保护因素考虑在内时,“单边”方法就会失效。CSRF 保护令牌需要包含在 API 使用者发送的任何 POSTS/PUTS/DELETES 中。
我一直在想如何最好地解决这个问题。每次需要进行 API 调用时请求表单似乎很尴尬(尤其是在处理异步操作时),但我自己想到的所有其他替代方案似乎都破坏了 CSRF 保护(或者至少在其中打孔),这是不可接受的。
你们中有人对此有见解吗?
谢谢。
(并不是说它应该太重要,因为这个问题与概念和平台无关,但我正在处理传统的 LAMP 堆栈并使用 Symfony 1.4 作为我的应用程序框架。我的目标是发布一个 JSON 格式的 Web API 允许开发人员使移动/桌面应用程序与现有的 Web 应用程序配合得很好。)
forms - Symfony 中启用 CSRF 的功能测试表单
创建功能测试以测试在 Symfony 中启用 CSRF 保护的表单的最佳方法是什么?
目前我必须在每个表单提交之前添加以下代码:
然后我添加 $token 和 $token_name 来形成这样的参数:
文档中建议的选项:
根本不起作用。
有没有更简单的方法可以避免向手动测试的每个表单添加令牌?或者有没有办法在运行测试时关闭 csrf 检查?
当您必须测试 1-2 个表单时,我上面描述的方式是可以的,但如果项目包含数十个独特的表单,它就会变得很痛苦。
django - Django 将 CSRF 令牌输出为对象而不是值
我在 Django 中以简单的 POST 形式处理 CSRF 令牌。该模板生成以下 CSRF 输出,而不是输出令牌的值:
我{% csrf_token %}
在模板中使用,我该如何解决这个问题?(我正在使用 Django 1.2)
编辑:确切的表单代码是:
security - CSRF 和不断变化的代币
我刚刚在 CSRF 上看到了Doctype 的插曲。
他们在其中说,CSRF 的最佳预防措施是从一些用户唯一数据(例如散列会话 ID)创建一个令牌,然后将其与您的请求一起发布。
生成一个难以猜测的值(例如 GUID)并将其存储为会话变量并将其作为隐藏字段放入页面中会不会更不安全?
每次加载页面时,该值都会更改,但 POSTed 数据的测试会在此之前进行。
在我看来,这同样安全。我错了吗?
asp.net - 使用 MVC2 的 AJAX 请求中的 CSRF 保护
我正在构建的页面很大程度上依赖于 AJAX。基本上,只有一个“页面”,每个数据传输都通过 AJAX 处理。由于浏览器端过度乐观的缓存会导致奇怪的问题(数据未重新加载),我必须使用 POST 执行所有请求(也读取) - 这会强制重新加载。
现在我想阻止页面针对 CSRF。通过表单提交,使用Html.AntiForgeryToken()
可以很好地工作,但是在 AJAX-request 中,我想我将不得不手动附加令牌?有什么开箱即用的东西吗?
我目前的尝试如下所示:
我很想重用现有的魔法。但是,HtmlHelper.GetAntiForgeryTokenAndSetCookie
它是私有的,我不想在 MVC 中乱搞。另一种选择是编写一个扩展,如
这有点 hacky 并留下更大的问题未解决:如何验证该令牌?默认验证实现是内部的,并且针对使用表单字段进行了硬编码。我试着写一个稍微修改过的ValidateAntiForgeryTokenAttribute
,但它使用的AntiForgeryDataSerializer
是私有的,我也真的不想复制它。
在这一点上,提出一个本土解决方案似乎更容易,但这确实是重复的代码。
任何建议如何以聪明的方式做到这一点?我错过了一些完全明显的东西吗?
ajax - Ajax 请求 CSRF 安全吗?
如果我的 Ajax 请求设置了 X-Requested-With 标头,我可以跳过 CSRF 检查此标头是否存在吗?我可以确定它不能被伪造(使用用户会话)吗?
security - 如何在 RESTful 应用程序中防止 CSRF?
通常使用以下方法之一来防止跨站请求伪造 (CSRF):
- 检查referer - RESTful 但不可靠
- 将令牌插入表单并将令牌存储在服务器会话中 - 不是真正的 RESTful
- 神秘的一次性 URI - 不是 RESTful,原因与令牌相同
- 为此请求手动发送密码(不是用于 HTTP auth 的缓存密码)- RESTful 但不方便
我的想法是使用用户密码、神秘但静态的表单 ID 和 JavaScript 来生成令牌。
GET /usersecret/john_doe
由 JavaScript 从经过身份验证的用户那里获取。- 回应:
OK 89070135420357234586534346
这个秘密在概念上是静态的,但可以每天/每小时更改......以提高安全性。这是唯一保密的事情。 - 使用 JavaScript 读取神秘的(但对所有用户都是静态的!)表单 ID,将其与用户密码一起处理:
generateToken(7099879082361234103, 89070135420357234586534346)
- 将表单连同生成的令牌一起发送到服务器。
- 由于服务器知道用户密码和表单 id,因此可以在发送之前运行与客户端相同的 generateToken 函数并比较两个结果。只有当两个值相等时,才会授权该操作。
这种方法有问题吗,尽管没有 JavaScript 就无法工作?
附录:
security - 在不需要用户登录的 POST 表单中,我是否面临 CSRF 攻击的风险?
我可能在这里完全是个菜鸟,但我仍然不确定 CSRF(跨站点请求伪造)攻击到底是什么。那么让我们看看三种情况......
1) 我有一个 POST 表单,用于编辑我网站上的数据。我希望这些数据只能由登录的用户编辑。
2)我有一个网站,既可供登录用户使用,也可供访客使用。该网站的某些部分仅供登录用户使用,但也有可供所有用户使用的 POST 表单 - 匿名而不是匿名(例如标准联系表单)。是否应该保护联系表免受 CSRF 攻击?
3) 我有一个站点,它根本没有身份验证系统(嗯,这可能是不现实的,所以可以说它有一个与其他站点分开的管理站点,并且管理部分得到了适当的保护)。该网站的主要部分仅供匿名用户使用。上面的 POST 表格是否需要保护?
在 1) 的情况下,答案显然是肯定的。但是在 2 和 3 的情况下,我不知道(2 和 3 之间的差异甚至显着吗?)。