我最近阅读了有关 csrf 令牌的信息。我正在使用 YII 框架来开发我的项目。我在 config/main.php 中启用了 csrf 验证,并且 yii 在隐藏的表单字段中放置了一个令牌。并检查令牌是否有效。一切安好。但是我观察到当我刷新并且页面中的所有表单都使用相同的令牌时,CSRF 令牌的值没有改变。
这让我很困惑。如果 csrf 令牌没有改变,那么任何黑客也可以在他的请求中使用该令牌,并且能够产生一个有效的请求。那么 csrf 令牌如何提供安全性?YII框架有问题吗?还是我错过了什么?我希望我确实错过了一些东西。如果我们必须手动生成令牌,请告诉我如何生成和验证(最好在 YII 框架中)
大多数 CSRF 解决方案似乎坚持将 CSRF 令牌作为 POST 数据的一部分发送。
在我的情况下,发送的数据是 json,我不控制发送的内容(而且我不想开始弄乱 json)。因此,我正在考虑将 CSRF 令牌作为标头发送。但是,我的应用程序的遗留部分仍然需要能够在正文中发送令牌(例如从 html 表单提交)。
因此,如果有效的 CSRF 令牌出现在正文或标头中,我的 CSRF 保护必须允许该请求。与坚持将令牌放在体内相比,这是否存在安全风险?
该应用程序在开发和生产模式下都可以在本地正常工作,但是一旦部署在 Heroku 上,CSRF 验证就会失败。这是一个普通的非 ajax 请求。
在本地,我以生产模式运行
RAILS_ENV=production heroku local -e production
Run Code Online (Sandbox Code Playgroud)
我想确保这是真正的问题,所以我禁用了真实性令牌验证,Heroku 版本也能正常工作。
更新:这是我的配置:
# session_store.rb:
Hlresponse::Application.config.session_store :cookie_store, key: '_hlresponse_session', domain: :all
# Environment:
$ heroku config:set MIN_THREADS=1 MAX_THREADS=1
# Procfile:
web: bundle exec puma -C config/puma.rb
# config.ru:
require ::File.expand_path('../config/environment', __FILE__)
run Rails.application
# puma.rb:
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || 'development'
on_worker_boot do
# Worker specific setup for Rails 4.1+
# …Run Code Online (Sandbox Code Playgroud) 众所周知,Rails CSRF 真实性令牌无法在 iframe 或 Facebook 画布内工作。iframe 导致无法验证 Rails 中的 CSRF 令牌真实性
推荐的解决方案是将其关闭。然而,我已经让一些机器人自动提交我们的可嵌入表单。我希望拥有某种 CSRF 保护,而不必求助于验证码。
无论如何,有没有办法让 Rails 身份验证令牌在内部或 iframe 中工作,或者是否有更好的解决方案?谢谢
ruby-on-rails csrf csrf-protection facebook-canvas ruby-on-rails-4
我们的 angularjs 应用程序有一个基于令牌的 OAuth 身份验证机制。acunetix 工具表明存在 XSRF 威胁。
CSRF 是否是基于令牌的身份验证的问题(因为我们没有使用任何 cookie 进行用户识别/身份验证/会话)?
如果 CSRF 是基于令牌的身份验证的问题,是否有任何方法可以在不使用 cookie 的情况下实施预防?
我试图阻止我的 Web 应用程序遭受 CSRF(跨站点请求伪造)我点击了此链接Link for CSRF
这是我尝试过的。为了在 Java 中实现这一机制,我选择使用两个过滤器,一个为每个请求创建盐,另一个用于验证它。由于用户请求和后续应验证的 POST 或 GET 不一定按顺序执行,因此我决定使用基于时间的缓存来存储有效盐字符串的列表。
第一个过滤器用于为请求生成新的盐并将其存储在缓存中,代码如下:
public class LoadSalt implements Filter{
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Assume its HTTP
HttpServletRequest httpReq = (HttpServletRequest)request;
// Check the user session for the salt cache, if none is present we create one
@SuppressWarnings("unchecked")
Cache<String, Boolean> csrfPreventionSaltCache = (Cache<String, Boolean>)
httpReq.getSession().getAttribute("csrfPreventionSaltCache");
System.out.println("Checking cahce befor creating it from Request :csrfPreventionSaltCache: "+csrfPreventionSaltCache);
if(csrfPreventionSaltCache == null)
{
System.out.println("csrfPreventionSaltCache is null …Run Code Online (Sandbox Code Playgroud) 我们在我们的产品上运行Burp Suite并发现了一些安全漏洞。该工具检测到一些易受跨站请求伪造攻击 (CSRF) 攻击的 CGI 文件。
像往常一样,我在 CPAN 上搜索 CSRF 保护模块并找到了CGI::Application::Plugin::ProtectCSRF。
我想知道如何以通用方式将此模块集成到我们的应用程序中?我不清楚文档。如何配置此模块并进行最小更改以确保整个应用程序免受 CSRF 的影响。
我还遇到了mod_csrf(一个防止 CSRF 的 Apache 模块)。在 apache 配置文件中安装此模块和设置是否足以防止 CSRF?
<VirtualHost>
CSRF_Enable on
CSRF_Action deny
CSRF_EnableReferer off
</VirtualHost>
Run Code Online (Sandbox Code Playgroud) 我试图了解何时在 HTML 页面中生成或插入环防伪令牌。我正在使用 Compojure / ring / hiccup 但我认为我的问题真的是关于戒指。我本身没有任何问题:我只是想知道何时以及如何“注入”防伪令牌。
在anti-forgery-field从功能ring.util.anti-forgery实现是这样的:
(html (hidden-field "__anti-forgery-token" *anti-forgery-token*)
Run Code Online (Sandbox Code Playgroud)
如果我在 REPL 中调用这个函数,我会得到:
REPL> (println (anti-forgery-field))
<input id="__anti-forgery-token" name="__anti-forgery-token" type="hidden" value="Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*" />
Run Code Online (Sandbox Code Playgroud)
仍然在 REPL 中,如果我尝试获取此变量,则会得到相同的“未绑定”变量:
> ring.middleware.anti-forgery/*anti-forgery-token*
=> #object[clojure.lang.Var$Unbound 0x1eae055 "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*"]
Run Code Online (Sandbox Code Playgroud)
我不明白的是“未绑定”值是什么,也不知道它何时(通过环?)转换为实际交付的令牌。而且我特别不明白连接到网站的几个用户如何获得不同的令牌(每个会话)。
该变量总是“未绑定”吗?它何时/如何成为“绑定”(如果有?)?
另外,如果我有环会话 ID(比如"ring-session=310678be-9ef6-41a7-a12a-b2417de4a79f"),我怎么能在 Clojure REPL(在服务器端)看到相应的反伪造令牌的价值?
我的网络应用程序的身份验证机制目前非常简单。
当用户登录时,网站会发回一个会话 cookie,该 cookie 存储(使用localStorage)在用户的浏览器上。
但是,此 cookie 很容易被窃取并用于从另一台计算机重播会话。我注意到其他网站(例如 Gmail)拥有更强大的机制来确保仅复制 cookie 不会允许您访问该会话。
这些机制是什么?小公司或单个开发人员是否也可以使用它们?
cookies session-cookies local-storage csrf-protection angular-cookies
我正在尝试在注册步骤的第2步自动登录用户.成功插入db后,我正在Auth::loginUsingId($user_id)使用ajax自动登录用户.我总是CSRF在每个步骤上提交令牌.
现在问题是在成功登录CSRF令牌生成后,Auth::user()在步骤3中变为空白
登录前后CSRF也不同.