2

我正在构建一个必须通过 PHP API 与 MySQL 数据库通信的 iPhone 应用程序。

现在显然,我不希望任何人访问我的数据库。因此,我想在 API 和应用程序中添加一些不错的安全性。

经过一番研究,我发现这可能是一个好方法:

使用 PHP/MYSQL 构建安全的公共 API

它基本上说代码对用户在应用程序端输入的变量执行一些数学运算。这个数学返回一个值。然后,您对 API 端的变量执行相同的数学运算。如果值相同,您就知道 API 获得了保存请求。

问题是,我上面链接的 SO 帖子是关于 PHP 应用程序和 API 的。我有一个用 Objective-C 和 PHP API 编写的应用程序,但我想执行同样的技巧。

有没有办法通过 Obj-C 应用程序和 PHP API 将这种安全性放入服务中?如果没有,有什么更好的办法来保护我的服务?

4

2 回答 2

3

如果您不希望任何人访问您的数据库,为什么不使用使用会话的简单身份验证。NSURLConnection处理从服务器发送的 cookie。

当您使用通用数学运算来计算一些哈希以用于验证请求时,可以轻松实现“执行一些数学”方法。只要您正确执行数学运算,您使用哪种语言都没有关系。

于 2013-11-04T20:41:00.890 回答
2

当您尝试选择一组合适的安全实践时,需要考虑几件事情。

  1. 您提出的方案是否对任何敏感信息保密?即使我无法控制任何消息或以其他方式冒充他们,它是否会阻止我作为恶意第三方阅读您所有用户的通信?正如提议的那样,我没有看到任何可以阻止攻击者查看这些请求和响应的东西。也许这不是一个问题?如果它需要 SSL 连接,那么防止这种窃听会有很长的路要走。

  2. 您是否有有效的方法来验证您的用户以建立他们的身份?如果我可以模拟其他一些用户,我可能可以读取或覆盖他们的所有数据。这通常通过用户正确回答安全挑战时创建的某种形式的用户会话来处理。例如,用户可能会输入他们的密码或提供来自第三方(如 Facebook)的 oauth 令牌,然后获得一个 cookie 或会话令牌以在一段时间内识别他们。一个有效的方案将不允许攻击者轻易猜出这些会话标识符或窃取它们以供攻击者使用(参见上面的第 1 点)。

  3. 一旦通过身份验证,您是否强制执行授权限制用户可以访问哪些数据的规则?即使您知道(或至少相信)我是您 API 的合法用户,您也不应该相信我只会尝试访问我自己的数据。我已经看到许多公共 API,特别是对于移动应用程序,在这一步失败。在许多情况下,使用您自己的应用程序遵循完全合法的身份验证过程对我来说是微不足道的。一旦我这样做了,我就可以自由地使用该合法用户帐户和您自己的应用程序的身份验证过程来制作我希望针对您的 API 的任何请求。您不能盲目地相信您的 API 的客户端会表现良好。我听到的对最后一点的常见反对意见是“但我们编写了唯一的客户端应用程序”。不幸的是,编写客户端并不意味着您可以控制它。一旦该应用程序在您的用户手中,它的行为就不再是秘密。curl. 如果这被证明很困难,它将在攻击者sendEncryptedAPIRequest使用他们自己的参数调用您的方法时被原地重用。与其尝试对客户的行为保密,同时仍使用户可以使用它,不如将访问控制作为 API 的一部分强制执行。

  4. 您会在可能的情况下验证您从客户那里收到的数据的完整性吗?即使我只能访问我自己的数据,您是否相信我会提供合理的值,如果我不这样做会产生什么后果?例如,看看几乎所有带有在线排行榜或高分列表的 iOS 应用程序。如果您信任客户报告他们自己的分数,他们中的一些人确实会报告非常高的分数。根据您的应用程序的功能以及是否共享任何数据,这可能或多或少是个问题。

这不会给您留下一个简单的“这样做,您的 API 将是安全的”答案,但恐怕这就是现实情况。在您构建的软件的每个级别,安全性都需要成为一个持续的考虑因素。幸运的是,您的要求不太可能是独一无二的,因此存在库和通用实践来帮助解决上述所有领域。

于 2013-11-06T17:17:33.263 回答