【问题标题】:Secure API Authentication安全 API 身份验证
【发布时间】:2011-11-27 00:52:07
【问题描述】:

我正在为游戏统计系统创建自己的 API(使用 PHP)。 我希望用户能够从他们的游戏中登录系统。

基本上,该游戏是使用 GM:HTML5(HTML5 的 GameMaker)制作的,这意味着它只是经过混淆处理,但仍然可以使用任何 JavaScript 调试器读取。

要使其工作,用户必须包含一个 PHP 库,该库将连接到我的 API 系统。 但是,我想通过使用 API 密钥来限制访问。

如果我将 API 密钥与请求一起发送,它将是可见的(例如,通过使用 Firefox 的开发者控制台)。使用该 API 密钥,任何人都可以“登录”并提交统计数据。

我想做的是发送托管游戏的域,以加密形式与登录请求一起发送。 (只是从我的 PHP 库向服务器发送一个简单的 GET 请求)。然后服务器必须解密该字符串(加密的域/IP)并检查它是否与也与请求一起发送的 API 密钥匹配。

但我想知道,这实际上有多安全。

如果不安全,还有什么更好的方法?

【问题讨论】:

    标签: php security api authentication


    【解决方案1】:

    您可以考虑使用 OAuth 1.0(或 2.0,如果您有 SSL 连接)。它是一种已在 Twitter 和 Facebook 等网站上证明自己的协议,但实施起来相当简单。

    https://www.rfc-editor.org/rfc/rfc5849

    但是,请注意最终没有安全库是安全的。 iOS5 的 OAuth 库在第一个开发者预览版发布的第二天就被破解了。基本规则:如果用户可以访问二进制版本,则不安全。

    【讨论】:

    • 我已经考虑过 OAuth,但我想为此拥有自己的“系统”...
    • OAuth 比要求的要复杂得多!我只想控制它的工作方式,而不是依赖现有的系统/协议。
    【解决方案2】:

    这是对CWE-602 的隐含违反,并且永远不会解决此问题。攻击者将始终能够使用TamperData 之类的工具来拦截和修改请求或以其他方式修改代码。也许您正在寻找“(In)security 尽管默默无闻”。

    【讨论】:

    • @Artaex Media 不,这是正确的答案,你试图做一些根本不可能的事情,可悲的是你认为这是可能的。
    • 我正在寻找更好的方法(如果有的话),我不是在问它是否不可能。
    • @Artaex Media 您无法控制客户端的行为,攻击者始终可以访问远程 API。以其他方式思考会导致大规模的安全问题,例如通过网络发送原始 sql 查询,就好像 sql 注入不是问题一样。
    【解决方案3】:

    选项 2:

    编写您自己的协议。请务必考虑所有这些因素:

    • 数据不得在代理级别上进行编辑(签署所有字段)
    • 请求不能是可重放的(添加一个必须唯一的随机 nonce)
    • 请求必须立即执行(添加时间参数)

    您需要一个 API 系统,因此请包含一个 API 密钥。

    【讨论】:

    • $signData = array('oauth_time' => time(), 'oauth_nonce' => uniqid(), 'oauth_consumer_token' => 'abcdef'); - 然后使用 HMAC 对所有这些字段进行签名(使用 oauth_consumer_secret)。我想说的是:您可能不想要整个 OAuth 实现,但其中的签名概念非常很有用。
    • 我根本不想使用 OAuth :(
    • 我知道。但是,任何实现我在此答案中列出的 4 个要求的系统都会看起来像 OAuth 的 LOT。您要求提供代码示例,我将您指向 OAuth。为什么你这么讨厌 OAuth?这是您将找到的唯一真正可靠的解决方案,如果您自己编写一些东西,它最终会看起来很像 OAuth。
    • 是的,但是如果我自己写一些东西,我会完全理解它是如何工作的......
    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2014-04-30
    相关资源
    最近更新 更多