草庐IT

iOS 偶尔会发送旧的 cookie

coder 2023-07-28 原文

我有一个定期轮换身份验证 token cookie 值的应用程序。

每次服务器轮换 token 时,它不会将其标记为“好”,直到它看到客户端拥有 token (因为客户端将其包含在资源的请求 header 中)。

我只有在 iOS (10.3) 上有一个非常特殊的情况,当网络条件发生变化时(例如:下地铁),它偶尔会发送一个非常旧的 cookie。当这种情况发生时,它会“忘记”最近的 cookie 值并“开始生活在过去”并发送旧值。

** 安全说明:IP 地址是在纽约市公开分配的 t-mobile, token 早已从我们的数据库中删除

  • 这是一个已知问题吗?
  • 是否有任何在 iOS 上更可靠的 cookie 处理变通办法? localstorage 并不理想,因为这些 cookie 仅为 http。

为了澄清......这是流程:

  1. 客户端 (iOS Safari) 有一个名为 _t 的 cookie,其值为 old
  2. 客户端(iOS Safari)向服务器发出请求
  3. 我们发出 Set-Cookie 并将 _t cookie 设置为新值 new(仅限 http,安全 cookie)
  4. 客户端使用新的 cookie 值 new 发出另一个请求。我们标记 cookie 值是好的并且客户端有它。
  5. 时间流逝
  6. 客户端使用值为 old_t cookie 发出请求

最佳答案

这是我对发生的事情的理论:

从cookie的生命周期来看,每当用户身份验证状态发生变化(登录用户->注销用户||注销用户->登录用户)时,旧cookie将失效并被新cookie取代。

但为什么这种情况发生在地铁而不是其他地方?
1. 如今,大多数地铁都提供免费的不安全 WiFi,以补充地下糟糕的无线网络连接。
2. 在 10.3 中有一些关于网络连接问题的报告,以及 this one特别有趣,因为问题是location dependent
3. 我认为上述 (1) 和 (2) 的组合导致应用程序重新向服务器进行身份验证。也许你可以提取日志来检查是否确实如此?

可能的解决方法?

也许没有。
我们无法阻止iPhone 用户进行iOS 升级。大多数人已经这样做了。
此外,在重新验证后不更改 cookie 的安全影响更糟。


根据截至 2017 年 5 月 31 日的评论更新:


鉴于评论中的详细信息。我们可以有更好的解释。

在cookie生命周期中,当用户注销时,server-side-invalidation应该发生。

工作流程:
1. 当用户注销时,authenticated sessionID从浏览器中删除。
2. 但这还不够。服务器也需要使那个sessionID。否则可能会产生安全影响。
3.在您的情况下,服务器可能没有失效。因此,它仍然需要一个 SessionID,它已被从浏览器中删除

这只是一种可能的解释。确切地说,需要更详细的日志文件分析和更多的实验。

比如,在那段时间里,在服务器日志中有没有发生过重新认证?
如果 server-side-invalidation 已正确实现,我们可以在受控环境中进行测试吗?

关于iOS 偶尔会发送旧的 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44144995/

有关iOS 偶尔会发送旧的 cookie的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  4. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby-on-rails - Rails Cookie 问题 - 2

    我在ruby​​onrails应用程序中有以下新方法:defnewifcookies[:owner].empty?cookies[:owner]=SecureRandom.hexend@movie=Movie.new@movie.owner=cookies[:owner]end基本上,每个新用户都应该获得一个代码来识别他们(尽管只是通过cookie)。因此,当用户创建电影时,创建的cookie将存储在owner字段中。所以有两个问题:使用.empty?方法,当我从浏览器中删除cookie时,返回一个undefinedmethodempty?'对于nil:NilClass`当我确实已经在

  7. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

    s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

  8. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  9. ruby - Controller 中的 request.cookies 和 cookies 有什么区别? - 2

    request.cookies和RubyonRails中的cookies对象有区别吗?我目前正在尝试将带有cookie的请求从我的node.js服务器发送到我的ROR4应用程序。似乎在ROR应用程序中,request.cookies包含我发送的cookie,但是cookies对象(现有逻辑所基于的对象)没有它。我已经搜索了文档,但找不到任何相关内容。我错过了什么吗?感谢您的帮助。 最佳答案 理想情况下,request.cookies和cookies应该相同。但是,在POST(创建操作)请求中,rails会验证XSRFtoken。如果

  10. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

随机推荐