3

我们都知道使用地址路由和带有 URL 中的参数的 HTTP-Get 进行 Ajax 调用是多么时髦,因为客户端可以缓存这些调用,从而减少服务器负载,但是你们认为这两者之间的界限在哪里?一种解决资源的巧妙方法”和“披露漏洞”?我举几个例子——

假设我在我的银行网站上。在后台,我的浏览器是 HTTP-Getting to /onlinebanking/AForster/transactions。当然,我很担心别人知道我的银行账户登录 ID,所以我总是确保“记住我”没有被选中。但是,我的浏览器访问带有我的登录 ID 的 URL 是否构成泄露漏洞?

如果我在论坛上,并且正在阅读普通用户不应该知道存在的受限线程怎么办。我的浏览器通过对 /forum/Secret-Board/Im-Going-To-Kill-My-Brother/posts 执行 HTTP-Get 来检索线程的内容。我什至使用 Ajax 访问该 URL 的事实是否以某种方式向我的兄弟揭示了该线程的存在?

等等等等。你大概可以想到更多的场景。我真的想要在客户端缓存我的 Ajax 调用的好处,但在这些情况下,对这些 URL 的 Ajaxing 是否会被视为泄露漏洞?

4

5 回答 5

0

避免此类泄露的最简单方法是使用 ID 号而不是字符串。

里面没有任何透露/forum/Board-214/Thread-5625/posts或类似的东西。


请注意,我不一定同意这个问题,只是提供一种解决方法。

在哪些情况下,恶意用户可以获得 AJAX 请求 URL,但无法获得响应正文?

于 2009-09-30T21:14:18.400 回答
0

这归结为您的用户的浏览器、历史记录、缓存等不是秘密或适当保护的事实(在许多情况下,未经授权的用户可以访问这些内容,您提出问题的事实表明您'可能知道他们......)。

所以,不要假设任何缓存在那里的东西都会受到保护 - 并且不允许任何“敏感”信息被缓存在那里。“什么是敏感的”,你问?好吧,任何你不想透露给任何其他用户的东西。银行账户、秘密论坛、用户名、会话 ID、交易详情——这些都不应该被允许缓存或存储在客户端上。

这确实是您提出的一个很好的观点,因为开发人员经常急于使用 AJAX 和诸如此类的东西来提高可用性,而忘记了在途中和客户端上保护这些信息。

于 2009-09-30T21:20:37.873 回答
0

由于 URL 是 Web 浏览器的不透明标识符,因此向它们添加人类可读文本的唯一目的是便于记忆。

银行应该使用匿名 ID 代替您的姓名。虽然连接已(希望!)加密,但 URL 仍将存储在您的浏览器历史记录中,第三方可以访问它。匿名 ID,甚至是临时的每个会话 ID,会更安全。

论坛示例包含一个奇怪的短语,“普通用户不应该知道存在的受限线程”。普通用户是否知道线程存在真的很重要吗?问题是该线程的主题在 URL 中公开,这是一个漏洞。URL 应该类似于/forum/thread/12345/.

老实说,这与 CRUD、AJAX 或您在问题中提出的任何其他流行语无关。问题是是否可以接受以明文形式公开秘密信息,答案是否定的。

于 2009-09-30T21:22:04.357 回答
0

所以你的问题提出了一些我希望我知道更多的观点,但我会尽力至少把事情弄清楚......

您的浏览器正在缓存路径中包含私人/安全信息的 URL,从而为您的私人信息留给其他人的潜在窗口。影响:

  1. 当您不在时,有人可能会走到您的计算机前,或者可能远程访问您的计算机,或者——如果没有在多个级别上采取适当的预防措施——使用 XSS 方法通过 javascript 获取缓存的 URL。

这种担忧是合法的,但您已经指出可以采取哪些步骤来消除它们:

  • 不要打开多个窗口,一些私人的,一些不那么私人的。使用私人浏览器会话进行私人浏览。实际上,我有一个 Firefox 插件的想法,它可以让你创建一个“黑名单”,一个应该始终处于隐身模式的域列表。这样你就可以在你的银行网站上,跳到 twitter,它知道有不同的会话,等等。

  • 将您的浏览器设置为在每次关闭时删除(或至少要求删除)所有个人数据。

  • 在服务器端,任何负责任的 Web 应用程序设计者都不应在URL中使用凭据或个人数据来建立安全站点。那不是光滑,那是懒惰。我认为 ID 号或会话 ID 并没有好多少(我将在第二点讨论)。您的银行应使用:/onlinebanking/UserServices/transactions作为 RESTful url,并且应该在服务器级别确认每个请求的所有内容,直至 IP(mod_auth 和该死的好证书)。听到人们谈论“减少服务器负载”甚至“减少数据库命中”,我感到非常疲惫。该软件专为接收大量请求而设计。我 6 年前制造的 HP 笔记本电脑听起来像是一台旧冰箱,并不是为了减轻服务器的工作量而设计的,等待 10 分钟等待一个设计不佳的 js 脚本(请参阅:新的 Yahoo! Mail 客户端)让我想刺伤。如果不应该期望可怜的被滥用的巨型服务器处理其他任何事情,那么它应该每次都确保您的安全。

好了,吐槽结束了。

  • 你的兄弟能看到你缓存的网址吗?也许。即使我清除了历史记录,我的女朋友也可以知道我何时访问了 xxx 网站(为什么?因为它仍然显示在最近关闭的标签中!耶隐私!)而且那些没有被缓存用于 RESTful,它们正在被缓存因为这就是浏览器所做的。因此,在访问 URL 中包含的站点后,您应该采取相同的预防措施,iamgoingtokillhimtonight/posts就像您在访问 pron 站点或查找生日礼物的想法时一样。

关于我的解释的一部分:

所以是的,这些 URL 被缓存了,这对于任何想要细读所述缓存以进入您的业务的人来说都是令人毛骨悚然的。但似乎您表达的另一个问题是他们可以用它做什么,即跨浏览器利用。有人可以使用该缓存的 URL 编写脚本来获取您的实际银行信息并消灭您吗?是的。但是,如果他们已经知道如何做到这一点,他们获得的优势是微不足道的。这更像是为他们节省了一步,然后将钥匙挂在门上。如果我能以某种方式通过 js 看到您的缓存,从而看到您的安全银行 URL,那么如果他们不使用可爱的 URL,我可以很容易地看到您的银行的 URL,并且可以很容易地围绕它编写我的 XSS。如果我能看到你的缓存,我肯定能看到你的 cookie 并窃取它们(只有在网络上 cookie 的价值超过缓存)。因此,AJAX 之前的相同规则适用:

  • 用户不应写下密码
  • 会话 cookie 应在会话结束时过期
  • Web 应用程序需要使用白名单、证书和随机数来确保用户请求的完整性和真实性。

我不能足够强调 XSS 的成功有多少是基于开发人员(包括我自己)的懒惰(或无知)以及用户的困惑和天真。大多数非常大的 XSS 分数都涉及在互联网黑客之前的社交黑客。网络钓鱼诈骗或老朋友或西班牙囚犯的来信,只是要求您关注这个无辜的链接或分享一些无意义的个人信息。在您的银行示例中,我可以看到会使情况变得更糟的一件事是,现在我从该站点知道您的名字是 Alex,并且从 URL 知道您的姓氏是 Forester。这可能会使挖掘细节以使您更容易摆脱其他信息。

所以总而言之,最后:

RESTful 和 AJAX 不会像浏览器历史和糟糕的服务器安全性那样构成更大的威胁,因此同样的规则适用于用户和开发人员。但是你完全正确,这样的 RESTful URL 指出我们在这些实践方面变得更糟,而不是更好;用技术来偷懒,而不是利用优势专注于真正的努力。

那很有趣。回到盐矿。

于 2009-09-30T21:55:27.753 回答
0

精彩的对话,以及所有非常有趣的回应!抱歉,我必须批量回复,但我正试图快速下班,我没有时间去弄清楚我是否在某个地方有 OpenID 提供程序。

虽然我的例子是编造的,但我今天确实发现自己处于这种情况下。我的项目正在脱离设计,首先要构建的是 HTTP/JSON 网络服务。昨天我梳理了所有的 UI 概念,并列出了 Web 服务需要提供一些数据的每个点。然后,当我试图将所有这些操作嵌入到一致的 URL 方案中时,我发现自己想将一些信息放入看起来有点敏感的 GET 请求中。我承认我的原始帖子与其说是一个问题,不如说是对在这种情况下使用的 RESTful Web 服务(尤其是 CRUD 端点)引发的潜在安全问题的评论。我从来没有听过任何人从这个角度谈论这个话题,我对你们所有人的想法很感兴趣。

我认为对我的问题最有用的答案来自 John Millikin,他指出基于 iframe 的 Ajax 确实会将请求 URL 抛入历史,对此我感到很惊讶。我很确定任何 XHR 请求都只会存在于浏览器的缓存中,那里的响应也可用,此时你有一个更大的问题。提到 XSS 攻击是另一个有趣的地方。在很多情况下,人们找到了一种公开浏览器历史记录或获取某个 URL 缓存的方法。如果有人知道我的银行账户 ID 是“AForster”,然后找到一种方法从另一个域的上下文中获取我的 /onlinebanking/AForster/transactions 的缓存版本,他们可以获得大量信息。

奇怪的是,我最终可能会谨慎行事并通过 GET 传递我的敏感数据,因为这个特定的敏感数据根本不是真正敏感的,而且它是一个公司内部网,我们在下面有 TLS。对于自我记录、人类可读、易于记忆的 URL,有很多话要说。但是,我确实知道这些请求将由以下设备记录:1) 我们的网络服务器、2) websense 和 3) 我们的 VPN 基础设施。我曾经拥有的每一个家庭路由器都有可以记录 URL 的家长控制,上帝禁止你运行一些花哨的 CMS /where/everything-damn-thing-is/addressed-by-title/ 然后有人找到一种方法来获取您的网络服务器的请求日志。在我的特殊情况下,这对我来说是一个可以接受的权衡,但在不同的情况下,我相信我可能有相当多的担心的理由。

于 2009-10-01T02:42:48.550 回答