我正在使用 PHP library for OAuth2.0 v20
在draft20中,有一个mention of the use of state to prevent CSRF
到目前为止,我自己的实现此 PHP 库的 Web 应用程序允许执行以下操作:
我是否需要在上述所有 3 种情况下都使用状态?
如果是这样,“状态”的一个很好的例子是什么?
什么是好的“状态”?
有理想的长度吗?有最小长度吗?有最大长度吗?
有什么理想的妆容吗?字母数字,包括大写字母?
最佳答案
逐步了解 CSRF 漏洞利用示例可能有助于了解状态参数如何减轻此类攻击。在此示例中,Mallory 是攻击者,Alice 是受害者。
Mallory 访问一些客户的网站并开始授权该客户使用 OAuth 访问一些服务提供商
客户端向服务提供商请求代表 Mallory 请求访问的权限,该权限已被授予
Mallory 被重定向到服务提供商的网站,她通常会在该网站输入用户名/密码以授权访问
相反,Mallory 会捕获/阻止此请求并保存其 URL
现在,Mallory 以某种方式让 Alice 访问该 URL。如果 Alice 使用她自己的帐户登录到服务提供商,则她的凭证将用于发出授权码
授权码交换访问 token
现在客户端上的 Mallory 帐户被授权访问服务提供商上的 Alice 帐户
那么,我们如何使用 state 参数来防止这种情况呢?
客户端应该创建一个以某种方式基于原始用户帐户的值(例如,用户 session key 的哈希值)。它是什么并不重要,只要它是唯一并且是使用一些关于原始用户的不可猜测的私有(private)信息生成的。
该值在上述第三步的重定向中传递给服务提供商
现在,当 Mallory 让 Alice 访问保存的 URL(上面的第五步)时,该 URL 包含使用 Mallory 的 session 信息生成的 state 参数
授权码在Alice session 中与 Mallory 的state参数一起发布并发送回客户端
客户端根据 Alice 的 session 信息生成一个新的 state 值,并将其与发回的 state 值进行比较从授权请求到服务提供商。此值与请求中的 state 参数不匹配,因为该 state 值是根据 Mallory 的 session 信息生成的,因此被拒绝。
攻击者不应该为任何特定用户生成状态值,因此,诱骗用户访问他们的授权 URL 没有任何效果。
关于php - OAuth2.0 Server栈如何使用state来防止CSRF?对于 draft2.0 v20,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11071482/
我正在尝试使用Capistrano部署带有puma的Rails应用程序。在部署结束时它尝试运行bundleexecpumactl-S/home/deployer/production/shared/sockets/puma.state重启失败了/undefinedmethod`has_key?'forfalse:FalseClass.我只是为puma.state创建了一个空文件。我的问题是这个文件到底是什么,里面应该有什么? 最佳答案 Puma有一个状态文件,记录了进程的PID。如果你是第一次部署,你应该删除.state文件,然后做
我有一个放在lib/network中的类:moduleNetworkApiclassNetworkProxyendend然后在另一个类中,我引用了这个类:network_proxy=::NetworkApi::NetworkProxy.new(params)一切都在我的开发环境中正常运行,但是当我部署到服务器时,我在上面一行收到错误消息:NameError:uninitializedconstantNetworkApi::NetworkProxy我不知道为什么会出现这个奇怪的错误。请告诉我为什么。 最佳答案 请注意Rails5dis
我有一个Rails2.3.5应用程序,其中包含我希望保护的API。没有用户-它是一个应用到应用风格的网络服务(更像是亚马逊服务而不是facebook),所以我想使用两条腿的OAuth方法来实现它。我一直在尝试使用oauth-plugin服务器实现作为开始:http://github.com/pelle/oauth-plugin...但它的构建需要三足(网络重定向流)oauth。在我深入研究对其进行更改以支持两条腿之前,我想看看是否有更简单的方法,或者是否有人有更好的方法让Rails应用程序实现成为两条腿的OAuth提供程序。 最佳答案
我想用一个(自己的)omniauth提供商来衡量每秒可以登录多少次。我需要了解此omniauth/oauth请求的性能如何,以及此身份验证是否具有可扩展性?到目前为止我得到了什么:defperformance_auth(user_count=10)bm=Benchmark.realtimedouser_count.timesdo|n|forkdoclick_on'Logout'omniauth_config_mock(:provider=>"foo",:uid=>n,:email=>"foo#{n}@example.net")visit"/account/auth/foo/"enden
我想在服务器启动时在我的Rails应用程序中订阅一个mqtt主题,并保持订阅始终处于事件状态和运行状态。我正在使用这个mqttgem进行mqtt通信:https://github.com/njh/ruby-mqtt这是我现在拥有的:在application.rb中:config.after_initializedomqttSub=BackgroundMQTT.newmqttSub.runend后台MQTT类:classMQTTSubscriberdefrunThread.newdoMQTT::Client.connect(:host=>'localhost',:port=>1883,)
我正在尝试为使用omniauth-google-oauth2gem创建session编写测试。我是否需要将env["omniauth.auth"]变量与post:create一起传递?也许当我试图这样做时,我做错了。我得到的错误如下所示...Rake测试错误1)Error:SessionsControllerTest#test_should_get_create:NoMethodError:undefinedmethod`provider'fornil:NilClassapp/models/user.rb:6:in`from_omniauth'app/controllers/sessi
我正在使用一些旧代码并使用ActiveResource进行非常基本的Twitter集成。我想尽可能少地接触应用程序代码,并在仍然使用ActiveResource的同时引入OAuth。不幸的是,我找不到简单的方法来做到这一点。我确实遇到了oauth-active-resourcegem,但它并没有完全记录下来,而且它似乎是为创建完整的API包装器库而设计的。您可以想象,我想避免为这一遗留更改创建整个TwitterActiveResourceAPI包装器。有什么成功案例吗?在我的例子中,离开ActiveResource可能比让它工作更快。我很高兴被证明是错误的!
我试图制作一个可执行文件,它通过Thin作为守护进程启动Sinatra应用程序。我正在使用此代码通过Sinatra应用程序调用Thin:#!/usr/bin/envrubyrequire'thin'require'app.rb'server=::Thin::Server.new('127.0.0.1',9999,App)server.log_file='tmp/thin.log'server.pid_file='tmp/thin.pid'server.daemonize这是我执行脚本时得到的日志输出:>>WritingPIDtotmp/thin.pid>>Exiting!服务器正常启动
我在使用Twitter进行基本的omniauth身份验证时被封锁了2天。我在简单的omniauth上跟随RyanBates的railscast,但无法通过OAuth::Unauthorized401异常,当我尝试登录时引发。请帮忙!我的代码粘贴在下面:twitterinfo:website:[http://127.0.0.1:3000]callbarckurl:[http://127.0.0.1:3000/auth/twitter/callback]//路线.rbSentimentalist::Application.routes.drawdoresources:dashboard,o
我正在使用state_machine构建一个多步骤表单,在过渡到下一步之前验证每个步骤的字段。这是我的模型:classFoo:step1doevent:nextdotransition:step1=>:step2transition:step2=>:step3endevent:previousdotransition:step3=>:step2transition:step2=>:step1endstate:step1dovalidates_presence_of:field1endstate:step2dovalidates_presence_of:field2endstate:st