在JavaScript中公开Facebook用户访问令牌存在哪些安全风险?

11
假设我的应用程序拥有某个Facebook用户的访问令牌。在JS代码中向其他访问我网站的用户公开此访问令牌是否存在安全风险?如果有,他们可以做些什么?

1
security.stackexchange.com 也许是这个问题的一个很好的论坛。 - Mike Samuel
4个回答

14

您有以下风险:

  1. 混淆代理问题 — 您的代码授予权限给可能故意滥用这些权限的代码,或者代表更具恶意的代码行事。
  2. 通过代码注入 (XSS)进行盗窃 — 凭据可能会被通过XSS漏洞注入到您的页面中的代码窃取,然后用于代表用户行事,可能会生成记录,将您指控为罪犯。
  3. 通过窃听进行盗窃 — 如果浏览器和您的服务器之间存在非HTTPS内容,则能够读取数据包的窃听者可以窃取凭据。
  4. 通过恶意软件进行盗窃 — 如果用户计算机上运行有恶意软件,则将这些凭据发送到浏览器会使它们暴露给该恶意软件。 恶意软件可能需要读取浏览器进程拥有的内存或缓存文件。

访问令牌不是限制在域名范围内吗? - Muhammad Umer
1
关于#4...如果存在恶意软件,那么用户已经陷入麻烦了,发送访问令牌不应该再创建另一层安全漏洞,对吧?因为如果恶意软件可以控制和访问浏览器,那么它可以直接进入网站并阅读私人内容。 - Muhammad Umer
@MuhammadUmer,不行。如果一个网站在使用凭据D登录时向运行在该机器上的浏览器发送凭据C,则现在该机器上的恶意软件可以访问凭据C和D。但是,如果该站点不向浏览器发送C,则该机器只能访问凭据D。区别在于,D与短期XSRF令牌结合可能会在内部暗示C,但如果发送了C,则恶意软件现在有一个广泛的时间窗口来滥用C。 - Mike Samuel
我理解它创建了另一个门..但整个墙都不见了。C是短暂和有限的(门),如果D已经破坏了墙、密码和用户名,那么问题更大。但我想这是一种无懈可击的方法,尽管我认为你可以接受其中一个。我认为不要将访问令牌保存在本地存储中,只需通过请求使用它,然后丢弃它可能就足够了.. .? - Muhammad Umer
1
@MuhammadUmer,是的,运行在计算机上的恶意软件可以做很多事情,所以有时这些区别并不重要。但是,计算机上的恶意软件并不能做所有的事情。编写恶意软件从文件系统中获取信息要容易得多,而从驻留在内存中的进程中获取信息则更加困难,因此防止凭据出现在缓存文件(以及您提到的本地存储)中非常重要,因为恶意软件只需要访问文件系统即可。 - Mike Samuel

9
一个Facebook访问令牌会授予获得该令牌的任何人相同的权限,就像您的应用程序对特定用户拥有的权限一样。因此,如果您的应用程序获得了执行操作A、B和C的权利,并被发出一个令牌以此效果,任何能够获取该令牌的其他应用程序都将具有该用户相同的权限(直到令牌过期)。
因此,确实存在风险。您需要保护令牌免受任何/任何不应该具有与您的应用程序相同的权限的Facebook用户访问。

3
但访问令牌的使用受限于应用程序域。因此,似乎其他应用程序将无法使用它。 - Andy
2
您的应用程序根据您的示例拥有 Facebook 的访问令牌。这意味着它有权在 Facebook 上执行操作 A、B 和 C。任何获取该令牌的人现在都有与所询问用户相同的权限,在 Facebook 上执行操作 A、B 和 C。应用程序域可防止其他应用程序接受该令牌,但是Facebook将乐意接受它,无论谁提交。这就是为什么OAuth令牌应受保护并且具有短暂生命周期的原因。关于OAuth 2.0承载令牌的IETF互联网草案应详细解释此问题:http://self-issued.info/docs/draft-ietf-oauth-v2-bearer.html - user121356
我明白了。然而,我正在使用一个应用程序来实现自己的目的,没有其他用户参与其中。我想使用cron读取发布在我的文章中的评论。因此,我创建了一个长期有效的访问令牌,到目前为止已经有60天了。我确定它是在服务器端脚本中使用的。我将不得不将其存储在数据库或平面文件中。我设置的权限只是offline_access。如果这个访问令牌变成公共的,那么可以执行哪些操作?换句话说,如何限制只能读取评论而不能进行任何其他操作?希望我已经表述清楚了。 - Jayapal Chandran

3
那个访问令牌可以被任何人在任何地方使用,以执行该访问令牌具有权限执行的任何操作。这就是它的强大之处,对吧?
因此,在javascript中公开access_token取决于运行javascript的位置以及发送access_token的网络类型。
如果一切都在https上,那么如果设备上运行javascript的浏览器是安全的(例如带有屏幕锁定的个人手机浏览器),则您不必担心。
如果设备是共享的互联网终端,即使使用https,每个人都使用相同的用户帐户,那么如果骗子查看浏览器的历史文件并提取出该访问令牌,则非常危险。
如果使用http通信,则整个世界都可以看到。 非常危险。
因此,由于您没有提供任何关于环境的信息,所以问题相当模糊。 因此,我的底线将不会如此模糊。 不要这样做! 只需让Facebook的Javascript SDK为您处理access_token。

2
披露安全令牌可能会使您的用户易受攻击。
我记得有一个名为"FaceNiff"的软件可以在已Root的Android手机上运行,它会嗅探Facebook和其他网站的安全令牌,您可以使用连接到该WIFI的任何用户帐户进行登录。
还有另一个Android软件中存在安全漏洞,黑客可以嗅探您的Gmail日历安全令牌并获得完全访问权限。
请阅读此文章:http://www.techlicious.com/blog/android-security-flaw-could-expose-you-to-data-theft/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接