从iOS App安全地访问数据库

我在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如何认证用户

我会假设上述方法不会安全......但我需要开悟。

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


最好的方法是设置一个API来与服务器上的数据库进行交互,并且您的iPhone应用程序只是查询API并以JSON等机器可读格式返回数据,请参见http://en.wikipedia。 org / wiki / JSON和http://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=98fy92473r92hAAIYEFG397qbqwiuUEAFhttps://iphoneapp.com/notifications.json?key=98fy92473r92hAAIYEFG397qbqwiuUEAF key 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并利用它,如果你可以/想要。

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


如果您正在寻找“从头开始构建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开发人员:)


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

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

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

我不建议在每个请求中使用用户名/密码,而是让用户进行一次认证,并让服务器发回应用程序可用于执行未来认证呼叫的认证令牌。 看看OAuth2是一个潜在的授权框架。 还请查看OAuth 2.0 - 好,坏,丑。

我建议在PHP中使用BShaffer OAuth2服务器。 另请参阅保护替代品的REST API / Web服务的最佳实践。

从你的问题来看,它似乎有一个现有的子系统,我建议创建一个简单的界面,使得子系统更易于使用,并可在多个客户端之间重用,而不是修改子系统以适应API。 这通常被称为门面设计模式。

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

总结:

  • 创建一个简单的界面来访问现有系统中的信息(一个REST API)。
  • 使用适当的身份验证机制(也许是OAuth2)保护您的私人信息。
  • 使用现有的库和/或框架加速开发。
  • 您的代码将作为结果跨多个应用程序和平台重复使用!
  • 链接地址: http://www.djcxy.com/p/71343.html

    上一篇: Access database securely from iOS App

    下一篇: Using Json string in the Http Header