从iOS App安全访问数据库

时间:2013-09-19 06:35:14

标签: php mysql iphone ios sqlite

我在浏览MySQL和SQLite之后选择MySQL进行访问,因为我的iPhone应用程序需要从已经在MySQL中的在线数据库中提取信息。

我认为访问信息的传统方式是:在服务器上安装一个php文件,为您进行访问。

iPhone应用程序将调用此php文件,它将返回结果。

iOS应用将调用http://somewebsite.com/index.php?id=234,网站将打印出id = 234的用户名。

What happens in the background of an iPhone app

现在,这个过程有多安全? ......我显然会使用预备语句和https。但是,如果有人找到了这个网站的URL呢?如何保护自己免受滥用(有人可以生成我所有用户的列表)?这是让您的iPhone应用程序连接并从数据库获取信息的标准方法吗?


编辑:此外,假设我需要创建一个应用程序登录页面...我有一个带有用户名和密码的MySQL数据库(显然是哈希)。使用$ _GET变量来查看它们是否经过身份验证是否安全?例如:https://somewebsite.com/checkauth.php?username=test&password=C3LyiJvTCQ14Q并打开php是或否。下面的图片示例:

This is how the iPhone would authenticate a user This is how the iPhone would authenticate a user

我认为上述方法不安全......但我需要开悟。

此外,我宁愿远离使用第三方API在应用内调用数据库,Apple也不支持。

4 个答案:

答案 0 :(得分:20)

解决此问题的最佳方法是设置API以与服务器上的数据库进行交互,并且您的iPhone应用程序只查询API并以机器可读格式返回数据,例如JSON,请参阅{ {3}}和http://en.wikipedia.org/wiki/JSON。因此,对于用户登录,服务器将返回类似于:

的内容
{
    "result": false,
    "error": "Invalid username or password"
}

这将由PHP生成,代码如下:

echo json_encode(array(
    "result" => false, 
    "error" => "Invalid username or password"
));

另请注意,您应将http://json.org/与此结合使用,例如401表示未经授权。

JSON可以在其格式中使用布尔和其他数据结构。几乎所有主要语言都有支持/库。

这样做的好处是它允许您使用相同的API构建其他应用程序,例如Android版本或实际网站。

这个 SO 问题是移动应用程序安全性的一个很好的起点:

HTTP response codes

要点是确保使用HTTPS。通过用户凭据发送时,您可以返回用户令牌(api密钥),该用户令牌可用于将来的请求并存储在iPhone应用程序中以供将来访问。

例如:https://iphoneapp.com/notifications.json?key=98fy92473r92hAAIYEFG397qbqwiuUEAF

您的密钥应该在HTTP标头或POST中发送,因此它不会记录在日志中......

注意:这只是键盘上输入的随机字符串。

此方法允许您在密钥泄露时删除/重新生成密钥。您还可以设置键的速率限制和各种其他参数。

另一个巨大的好处是通过构建自己的应用程序使用的API意味着它将保持高标准,而其他第三方公司也可以使用API​​(如果您允许)。

  

编辑:此外,我想说我需要创建一个应用登录页面......我   有一个带有用户名和密码的MySQL数据库(显然是哈希)。   使用$ _GET变量来查看它们是否安全   认证。例如:   Creating an API for mobile applications - Authentication and Authorization

您应该使用POST发送敏感数据,但任何服务都必须在某个时候登录。使用HTTPS应该最有帮助,因为它可以防止窃听。在第一次身份验证之后,您可以返回令牌并获得上述优势。

对于用户登录,因为您的PHP符合良好实践,您应该没有问题。如果您有疑问,请参阅https://somewebsite.com/checkauth.php?username=test&password=C3LyiJvTCQ14Q它会有很大帮助。

绝对研究OAuth,如果你愿意,可以利用它。

这只是一个起点,并不是逐字逐句使用,需要进一步阅读和谷歌搜索。

答案 1 :(得分:2)

如果您正在寻找“从头开始构建API”方法的替代方法,我们在kumulos.com上使用了名为Kumulos的基于Web的服务,以获得快速简便的解决方案。

此服务允许开发人员连接到MySQL数据库,并通过网页构建数据模型和API,然后将本机库部署到您的平台。我相信您也可以导入现有的数据模型。

在网页上构建数据模型后,您可以构建API并指定输入和输出参数。 API基于您正在执行的SQL操作类型(如SELECT,UPDATE,INSERT,DELETE)建模。

在您的情况下,您可能希望建模一个接受用户名和(哈希)密码的登录/身份验证UI,根据Users表验证数据并返回身份验证结果。

一旦您的API通过网页建模,您就可以“部署”您的配置并为iOS,Android,PHP等生成本机库。

生成的Obj C库被删除到您的项目中,您使用目标c调用和委托来创建和响应API。

Kumulos还包括一些其他功能,例如数据导出,API调用计量以及他们称之为KScript的功能。这基本上是能够在服务器(也通过网页配置)中用javascript包装您的调用,以极大地扩展您可以构建的API调用功能的灵活性和功能。

在过去的几个月里,我们遇到了一些问题或支持问题,他们的支持是一流的。他们的骨干是Rackspace。我们目前有大约8或10个生产应用程序通过它们运行API,并且非常满意而不必雇用API开发人员:)

答案 2 :(得分:2)

许多移动应用程序使用API​​来获取和存储服务器中的信息。弄清楚其中一些端点并不复杂,并且让不安全的端点返回敏感信息是一件危险的事情。

API的第一级保护可能是创建标识应用程序的“API密钥”。该密钥存储在服务器中,并在每个请求中检查。没有API密钥的请求应返回HTTP 401(未授权)状态代码。

API密钥没问题,但某些呼叫只能由某些用户执行时不够。例如,用户需要更新他的信息,只有信息的所有者应该能够执行此调用,而不是另一个用户。为此,您可以传递标识用户的身份验证信息以执行更新操作。

我不建议在每个请求上使用用户名/密码,而是让用户进行一次身份验证,然后让服务器发回可由应用程序用来执行将来经过身份验证的调用的身份验证令牌。请查看OAuth2作为潜在的授权框架。另请查看OAuth 2.0 - The Good, the Bad & the Ugly

我建议使用BShaffer OAuth2 Server in PHP。另请参阅Best Practices for securing a REST API / web service了解替代方案。

从您的问题来看,这听起来像是有一个现有的子系统,我建议创建一个简单的界面,使子系统更易于使用,并可以跨多个客户端重用,而不是修改子系统以容纳API。这通常称为Facade Design Pattern

许多PHP框架都有用于实现自定义RESTlike API的包。 Symfony有FOSRestBundleFuelPHP开箱即用REST控制器,CodeIgniter有REST server

总结:

  1. 创建一个简单的界面来访问现有系统的信息(REST API)。
  2. 使用适当的身份验证机制(可能是OAuth2)保护您的私人信息。
  3. 使用现有的库和/或框架来加速开发。
  4. 您的代码可以在多个应用程序和平台上重复使用!

答案 3 :(得分:-9)

如果要从IOS应用程序访问数据库并将数据保存到数据库中,则必须使用中间件解决方案。

Webservice

在IOS应用程序中的 Microsoft ASP dot Net和访问该WebService 中创建Web服务器您可以在两个不同的操作系统之间进行通信。

Webservice 返回 XMLdoucment ,可以使用xml专员进一步解析。