【问题标题】:Security concerns sending user name and password to server via https from iOS app安全问题从 iOS 应用程序通过 https 将用户名和密码发送到服务器
【发布时间】:2017-07-24 18:07:04
【问题描述】:

我已根据 Apple 的建议设置了应用购买收据验证,方法是将收据发送到我的服务器,然后再将其发送到 Apple 的服务器进行验证。我所有的收据处理都是在服务器端处理的,并且运行良好。我的服务器向我的应用程序发送回一个非常模糊的代码,以确认购买是否有效。我在应用程序端使用了一种非常强大的混淆方法来掩盖该返回码的情况,以使越狱黑客尽可能难以击败它。

问题是我将我的 php 文件存储在我的 Web 服务器上的受密码保护的文件夹中,并且我担心当应用程序本身具有嵌入其中的目录的用户名和密码时,如何将其视为安全的将收据发送到 php 文件开始。

我的应用仅使用服务器进行应用内购买的收据验证。所有其他功能都在应用程序本身中,因此我不会强制每个用户拥有一个具有唯一用户名和密码的帐户。

我正在使用 URLSession 通过 TLS 1.2 https 连接与服务器进行通信,因此该部分是安全的,但我想不出一种方法来阻止坚定的黑客从应用程序中提取用户名和密码他们的设备,并可以直接访问我的服务器文件夹。具有该功能的人可以轻松地修改 php 文件以始终返回指示有效购买的代码。

我确实在应用程序中混淆了用户名和密码,以至于我认为大多数人可能会放弃尝试弄清楚它,但我知道我只是让提取变得更加困难,而不是几乎不可能。

对此有什么想法吗?我在网上找到的几乎所有与此相关的内容都与不通过 h​​ttp 传输用户名和密码有关,而不是越狱设备的更大问题。

【问题讨论】:

  • 为什么要在应用中包含用户名和密码?只需使用经过检查的随机生成的令牌,例如由服务器端的 PHP 脚本执行,仅对特定 API 有用。
  • Robert 我对从 iOS 应用程序与服务器进行交互还很陌生。服务器目录使用 .htaccess 文件进行密码保护。我正在使用 NSURLSession 的基本身份验证来访问 .php 文件。我想我要问的问题是如何在没有硬编码密码和用户名的情况下授予对这个受保护目录的访问权限。
  • 不要使用基本身份验证,只需使用 HTTP 获取参数并在服务器端 PHP 脚本中检查。当然,您必须为此学习一点 PHP。再说一遍:永远不要将允许直接文件访问的网络服务器凭据嵌入到应用程序中!
  • 我认为我在您的建议中遗漏了一个关键细节。到目前为止,为了快速了解我的实现,我的服务器上有一个非常强大的 .php 文件,它从我的应用程序接收 https POST 参数,传递 Apple 收据的 json,以便我可以在服务器端验证它。该 .php 文件位于我服务器上受密码保护的目录中,因此我的应用程序(使用 NSURLSession 连接到服务器)收到身份验证质询,并且必须使用用户名和密码进行响应。使用 GET 会有什么不同?我不会仍然接受挑战吗?谢谢!!
  • “密码保护文件夹”你用什么方法?希望这意味着您使用了 .htaccess 文件或类似文件。

标签: ios security authentication passwords nsurlsession


【解决方案1】:

所以我想我已经想出了一个相当安全的解决方案来解决这个混乱。非常感谢花时间对此发表评论的人们,因为您的意见肯定很有帮助。

首先,虽然我在 Obj-C/Swift iOS 开发方面有相当多的经验,但服务器端的东西对我来说还是很新的,但我学得很快。对我来说,这似乎是一个巨大的灵感时刻,但对于一个大型 REST/Linux/PHP 专家来说,这似乎是例行公事,所以请耐心等待。

总结挑战:我想将应用内购买收据的 json 表示从我的应用发送到我服务器上的 .php 文件,以便它可以将其发送给 Apple 进行验证。为了保护那个 .php 文件,我在它的文件夹中放置了一个 .htaccess 文件,要求用户名和密码才能访问它。

NSURLSession 很好地处理了这个问题,但要求我在应用程序中输入用户名和密码……不好。这就是混淆对话进行的原因,让我意识到在将密码硬编码到应用程序中时无法保证密码安全。

然后我意识到我可以将文件放在 public_html 文件夹之外(我的尤里卡时刻),这就是我所做的。因此,在 public_html 文件夹中,其中也有一个 index.html 文件,我现在有一个非常简单的 .php 文件,它只是在另一个 .php 文件中调用一个函数,该文件完成所有与 Apple 服务器通信的工作,并且解析响应。当它完成解析后,它会将一个非常模糊的代码(不是 Apple 返回的广为人知的代码)返回到简单的 .php 文件,该文件又将其返回给我的应用程序。
根据该代码,应用程序将决定是否授予对所购买商品的访问权限。

使用服务器端权限,我已限制 public_html 目录中的简单 .php 文件从“世界”进行读取或写入访问,仅将其保留为可执行文件。因此,虽然黑客可以在入侵应用程序时快速获取该文件的名称,但这对他们没有好处。我不再需要应用程序中的用户名或密码,并且完成所有工作的“主”.php 文件位于 public_html 文件夹之外的文件夹中,其权限设置为限制读/写/执行来自“世界”,尽管我认为这是矫枉过正,但我​​在其中放置了一个 .htaccess 文件并拒绝所有内容。

我认为我在这里有一个“相当”安全的解决方案,应该会让普通黑客很难窃取应用内购买,但我一如既往地愿意接受建议,以防我错过了什么。

【讨论】:

    【解决方案2】:

    您正在想象黑客反转您的混淆二进制文件以尝试获取用户名和密码。这是很难做到的。最简单的方法是检查网络流量。

    是的,即使没有越狱,设备的所有者也可以轻松绕过 TLS。 TLS 可以防止外部攻击者,但它不能防止想要检查他们自己的网络流量的东西。这很容易做到,例如参见instructions on my blog where I beat a very popular iOS game

    如果你想阻止这种更简单的攻击,你可以尝试实现certificate pinning。这仍然可以在越狱设备上轻松破解,但您可以阻止许多不想越狱设备的普通黑客。

    归根结底,你是对的,一个坚定的黑客会战胜这种类型的设计。

    【讨论】:

    • 感谢周到的回复。我确实会研究证书固定,但有趣的是,我对这个问题研究得越深,我就越容易感到脆弱。在这一点上,我花在尝试确保应用内购买上的时间可能比我花在编写应用上的时间还要多!当然,这段时间并没有浪费,因为一旦我完善了它,我也可以用它来适应我的其他应用程序。再次感谢。
    • @Scooter:你是对的。你正在打一场可能比付出更多努力的战斗。特别是,证书固定的正确实施可以是 PITA。但我希望你能从我的帖子中得到启示:如果攻击者有更简单的成功方法,那么所有这些混淆都是毫无意义的。如上所述拦截网络流量几乎总是攻击者要做的第一件事。
    • 我确实明白你的意思,但无论如何,现在一切都在那里。现在对我来说,这真的变成了一个更有趣的智力挑战。我很好奇银行级别的安全性如何克服这一点。我想强迫人们在我的服务器上注册一个帐户会给黑客增加一定的难度。我还需要研究令牌并摆脱基本级别的服务器身份验证。这肯定是很多猫捉老鼠!
    • @Scooter,在客户端代码中隐藏秘密是一场失败的战斗,即使对银行来说也是如此。关于银行代码,有时会实施 Cert pinning。越狱检测有时会实现,但通常可以轻松绕过。代码混淆的使用频率较低,主要是因为好的混淆器价格昂贵。事实是,您不应该关心单个用户是否可以绕过您的控制,更严重的问题是是否有人开发了一个为所有人作弊的应用程序。 AppStore 比 Android 替代品更受控制,这对您有利。
    • 所有这一切都适用于一个可能在一个月内赚到 30.00 美元的应用程序,哈哈。这不是一个太大的目标,但你永远不知道我什么时候会在市场上投放下一个愤怒的小鸟。
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 2018-09-16
    • 2018-01-04
    • 2011-02-22
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多