23

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

我相信访问信息的传统方式是:在服务器上有一个 php 文件来为您进行访问。

iPhone 应用程序会调用这个 php 文件并返回结果。

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

iPhone应用程序的后台发生了什么

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


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

这就是 iPhone 验证用户的方式 这就是 iPhone 验证用户的方式

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

此外,我宁愿避免使用 Apple 不支持的第三方 API 在应用程序中调用数据库。

4

4 回答 4

23

解决此问题的最佳方法是设置一个 API 以与服务器上的数据库进行交互,而您的 iPhone 应用程序只需查询 API 并以机器可读格式返回数据,例如JSON,请参阅http://en.wikipedia.org /wiki/JSONhttp://json.org/。因此,对于用户登录,服务器可能会返回如下内容:

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

这将由 PHP 使用以下代码生成:

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

另请注意,您应该结合使用HTTP 响应代码,例如 401 表示未经授权。

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

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

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

为移动应用程序创建 API - 身份验证和授权

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

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

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

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

如果密钥被泄露,此方法允许您删除/重新生成密钥。您还可以对按键和各种其他参数设置速率限制。

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

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

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

至于用户登录以及您的 PHP 符合良好实践,您应该没有问题。请参阅http://www.phptherightway.com/如果您有任何问题,它会很有帮助。

如果可以/想要的话,一定要研究 OAuth 并利用它。

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

于 2013-09-26T11:24:32.513 回答
2

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

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

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

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

我建议在 PHP 中使用 BShaffer OAuth2 Server。另请参阅保护 REST API / Web 服务的最佳实践以获取替代方案。

从您的问题听起来好像有一个现有的子系统,我建议创建一个简单的接口,使子系统更易于使用,并且可跨多个客户端重用,而不是修改子系统以适应 API。这通常称为外观设计模式

许多 PHP 框架都有包来实现自定义 REST 类 API。Symfony 有FOSRestBundleFuelPHP有一个开箱即用的 REST 控制器,CodeIgniter 有一个REST 服务器

总结一下:

  1. 创建一个简单的接口来访问现有系统中的信息(REST API)。
  2. 使用适当的身份验证机制(可能是 OAuth2)保护您的私人信息。
  3. 使用现有的库和/或框架来加速开发。
  4. 因此,您的代码将可在多个应用程序和平台上重用!
于 2013-09-29T17:37:25.733 回答
2

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

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

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

在您的情况下,您需要对接受用户名和(散列)密码的登录/身份验证 UI 建模,根据用户表验证数据并返回身份验证结果。

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

生成的 Obj C 库被放入您的项目中,您可以使用目标 c 调用和委托来创建和响应 API。

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

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

于 2013-09-27T23:48:15.517 回答
-9

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

这是网络服务

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

Webservice返回的是XMLdoucment,可以用 xml purser 进一步解析。

于 2013-09-19T06:39:41.063 回答