- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我是一名经验丰富的 Web 开发人员(主要使用 Python 和 CherryPy),之前从头开始实现过安全 session 管理,现在正在学习 Rails。我正在调查 session
暴露的 Rails session 行为ActionController
中可用的对象实例和 View 上下文。
我读到 Rails 4 中 session 的默认实现使用加密且防篡改的 cookie。很酷,我想这意味着我可以使用它来保存用户 session 的用户 ID,而不必担心 session 伪造(防篡改)或任何人能够找出他们的 ID 是什么(加密)。我想对此进行测试,看看如果 session cookie 被更改,rails 会做什么。
因此,我使用浏览器插件更改了 session cookie 属性的内容,当我使用新的 cookie 值重新加载页面时,Rails 很高兴地为 session_id
提供了不同的新值。和 _csrf_token
.
session cookie 完整性发生了什么!?
Rails 难道不应该检测到(通过 HMAC 签名)cookie 被更改然后以某种方式告诉我吗?
我很害怕我错过了一些非常明显的东西,但我一直没有运气在网上寻找答案,而且源代码也不会轻易放弃(我是新来的 ruby )。提前致谢。
我创建了一个新应用并生成了一个带有 index
的 Controller Action :
$ rails new my_app
$ cd my_app; rails g controller home index
然后我将这两行添加到 app/views/layouts/application.html.erb 文件中:
<%= session.keys %><br/>
<%= session.values %>
我启动了开发服务器并将浏览器导航到“localhost:3000/home/index”。正如预期的那样,页面底部有以下几行:
["session_id", "_csrf_token"]
["8c1558cabe6c86cfb37d6191f2e03bf8", "S8i8/++8t6v8W8RMeyvnNu3Pjvj+KkMo2UEcm1oVVZg="]
重新加载页面给我相同的值,尽管应用程序设置了一个新值 _my_app_session
cookie 属性每次。这对我来说似乎很奇怪,但我得到了相同的 session 哈希值,所以我想这很酷。
然后,我使用 Chrome 的 cookie 编辑插件来更改 _my_app_session
的值cookie 属性(替换属性值的第一个字符)。重新加载页面显示完全不同的值,但没有任何反应。什么?
最佳答案
我不能声称对这里的代码有真正透彻的理解。但我可以告诉你这么多:
我完全按照您的步骤操作(使用 Ruby 2.0.0-p247 和 Rails 4.0),但有一个异常(exception)——我还在我的 Gemfile 中添加了“byebug”gem,并在 HomeController#index 中插入了一个调试断点
Action 。
从 byebug 控制台,在该断点处,我可以通过以下方式看到未编辑 session cookie:
(byebug) cookies["_my_app_session"]
"cmtWeEc3VG5hZ1BzUzRadW5ETTRSaytIQldiaTMyM0NtTU14c2RrcVVueWRQbncxTnJzVDk3OWU3N21PWWNzb1IrZDUxckdMNmZ0cGl3Mk0wUGUxU1ZWN3BmekFVQTFxNk55OTRwZStJSmtJZVkzVmlVaUI2c2c5cDRDWVVMZ0lJcENmWStESjhzRU81MHFhRTN4VlNWRlJKYTU3aFVLUDR5Y1lSVkplS0J1Wko3R2IxdkVYS3IxTHA2eC9kOW56LS1IbXlmelRlSWxiaG02Q3N2L0tUWHN3PT0=--b37c705a525ab2fb14feb5f2edf86d3ae1ab03c5"
我可以用
看到实际的加密值(byebug) cookies.encrypted["_my_app_session"]
{"session_id"=>"13a95fb545a1e3a2d4e9b4c22debc260", "_csrf_token"=>"FXb8pZgmoK0ui0qCW8W75t3sN2KLRpkiFBmLbHSfnhc="}
现在,我通过将第一个字母更改为“A”来编辑 cookie 并刷新页面:
(byebug) cookies["_my_app_session"]
"AmtWeEc3VG5hZ1BzUzRadW5ETTRSaytIQldiaTMyM0NtTU14c2RrcVVueWRQbncxTnJzVDk3OWU3N21PWWNzb1IrZDUxckdMNmZ0cGl3Mk0wUGUxU1ZWN3BmekFVQTFxNk55OTRwZStJSmtJZVkzVmlVaUI2c2c5cDRDWVVMZ0lJcENmWStESjhzRU81MHFhRTN4VlNWRlJKYTU3aFVLUDR5Y1lSVkplS0J1Wko3R2IxdkVYS3IxTHA2eC9kOW56LS1IbXlmelRlSWxiaG02Q3N2L0tUWHN3PT0=--b37c705a525ab2fb14feb5f2edf86d3ae1ab03c5"
(byebug) cookies.encrypted["_my_app_session"]
nil
因此请求中此时 session 为nil
:
(byebug) session
#<ActionDispatch::Request::Session:0x7ff41ace4bc0 not yet loaded>
我可以强制加载 session
(byebug) session.send(:load!)
当我这样做时,我看到生成的 session ID 是
"f6be13fd646962de676985ec9bb4a8d3"
果然,当我让请求完成时,这就是我在 View 中看到的:
["session_id", "_csrf_token"] ["f6be13fd646962de676985ec9bb4a8d3", "qJ/aHzovZYpbrelGpRFec/cNlJyWjonXDoOMlDHbWzg="]
我现在还有一个新的 cookie 值,与我编辑的值无关。
因此,我认为我们可以得出结论,由于无法验证 cookie 签名, session 被取消并重新生成。我现在有一个新 session ,具有不同的 csrf_token。
相关代码出现在actionpack/lib/action_dispatch/middleware/cookies.rb:460-464
,在EncryptedCookieJar
类中:
def decrypt_and_verify(encrypted_message)
@encryptor.decrypt_and_verify(encrypted_message)
rescue ActiveSupport::MessageVerifier::InvalidSignature, ActiveSupport::MessageEncryptor::InvalidMessage
nil
end
我们不解密带有无效签名的消息,而是将其视为nil
。因此,存储 session ID 和 csrf token 的无法验证的 cookie 不会用于加载 session ,任何依赖于 cookie 中的值的操作都会失败。
那么为什么我们没有收到错误而只是收到一个新 session 呢?那是因为我们没有尝试任何依赖于加密值的东西。特别是,虽然我们有
protect_from_forgery with: :exception
(与 :null_session
相对)在 ApplicationController
中,Rails 不会验证 GET 或 HEAD 请求上的 csrf token ——它依赖于开发人员来实现这些操作根据规范,因此它们是非破坏性的。如果您在 POST 请求上尝试相同的操作,您会收到 ActionController::InvalidAuthenticityToken
错误(您可以轻松地自行验证)。
关于ruby-on-rails - 检测 Rails 4 session cookie 篡改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18751565/
大家好,我是沙漠尽头的狼。 本文首发于 Dotnet9 ,介绍使用 Lib.Harmony 库拦截第三方 .NET 库方法,达到不修改其源码并能实现修改方法逻辑、预期行为的效果,并
我有Helm Applciations使用 Terraform 的 helm_release 资源与 Terraform 一起部署。 有时由于以下一个或多个原因,我的 Kubernetes Pod 将
我有Helm Applciations使用 Terraform 的 helm_release 资源与 Terraform 一起部署。 有时由于以下一个或多个原因,我的 Kubernetes Pod 将
我们开发了一个 Javascript 文件供客户使用。 Javascript 片段对其运行的网站进行屏幕截图,然后通过 jQuery.post() 将其发送回我们的服务器 我们行业的性质意味着我们必须
我在本地主机上运行我的测试站点。 当我用 URL 加载它时: localhost/projects/forums/index.php 它看起来像这样(符合预期) 但是当 我给 URL: localho
我正在 中共同开发一个简单的网络应用程序 rails 3.0.9 我已经意识到可能通过恶意请求篡改 session_id。请注意,这是我的第一个 RoR 应用程序,所以我的概念可能完全错误。 当前的应
我返回了以下 JSON 数据,但由于某种原因,Javascript 或 jQuery ajax 似乎重新组织了项目列表。服务器返回按item.title字母顺序排序的数据(已验证)... 下面的 JS
背景 我是一名经验丰富的 Web 开发人员(主要使用 Python 和 CherryPy),之前从头开始实现过安全 session 管理,现在正在学习 Rails。我正在调查 session 暴露的
我正在使用 MVC3、.NET4.5、C#、Razor。 我在 Codeproject 之外重用了 Albin 的一些非常有用的代码,通过添加哈希来防止 URL 篡改。主要运行良好。 然而…… 我现在
我是一名优秀的程序员,十分优秀!