【问题标题】:Sending secure POST requests to MySQL/PHP server from Android [duplicate]从 Android 向 MySQL/PHP 服务器发送安全 POST 请求 [重复]
【发布时间】:2014-09-18 13:37:24
【问题描述】:

我目前正在开发一个主要用于学习目的的应用程序。到目前为止,我读到的所有内容都让我感到困惑,而不是帮助。我的目标是连接到 MySQL 数据库并检索数据。该数据库由引文、作者和引文所属的类别组成。

我对 PHP 和 MySQL 的了解足以编写一个 API 来从服务器返回 JSON 数据。我想我了解 Android 应用需要发送 JSON 编码的 POST 请求。所以我认为这使得任何人都可以反编译应用程序并查看 API url,并类似地生成请求并从数据库中检索数据。

我主要关心的是,如何从 Android 生成请求以安全地与服务器 API 通信,并验证请求是否来自应用程序。

感谢阅读!

【问题讨论】:

    标签: android mysql security post


    【解决方案1】:

    如果我正确理解您的问题,您就知道如何在 Android 中进行 POST,但您需要一种“安全”的方式来执行此操作。我认为您正在寻找的是一种基本的身份验证方法。

    最简单的方法是让用户使用用户名/密码登录(用户名可以存储在 SharedPreferences 或其他方式中)。正如一位用户所指出的那样,人们担心在 SharedPreferences 中存储密码,尽管这里有许多其他答案和应用程序使用这种存储方法 - 只需使用密码 ONCE 就可以工作,直到令牌过期。服务器应用程序将在首次成功验证后提供此令牌。您必须跟踪数据库中的令牌并为其分配到期日期以提高安全性。所有这些都只能通过 SSL 执行,因此 POST 有效负载是加密的。

    反编译应用程序和从请求中找出 API 端点是两件完全不同的事情。对于您的情况,您不必真正担心会掩盖您的端点,只需保护 POST (JSON) 有效负载并提供简单的授权方法。无论如何,您的端点都将被探测,因此最好简单地设置身份验证机制,以便只有获得授权的用户才能看到数据。

    创建同步适配器将有助于管理所有身份验证工作,并且用户的 USERNAME(和令牌)可以相对安全地保存在共享首选项中。但是,您必须在您的服务器上设置此用户名/密码/令牌身份验证系统。这是一个示例流程:

    User [username/password] -> Server [authentication] -> Server [token] -> User [store token]
    

    然后,应用程序将使用其令牌对端点进行身份验证,直到它过期(服务器将在过期时通知应用程序):

    User [token] -> Server [validates token] -> User [data] -> Server [data]
    

    令牌可以像随机 GUID 一样简单。

    这将确保用户有权接收数据,并且只能通过 POST 请求并且只能通过 SSL 执行,以确保 JSON 有效负载尽可能安全,不被窥探。您可以在这里进入一大堆其他领域,例如限速请求以防止人们使用暴力攻击或其他方式轰炸您的 API,但这一切都将在服务器端完成。

    当然,这不是安全的方法,因为有更好的协议,如 OAuth,但它们的实现也更复杂客户端/服务器应用程序。不过,我强烈建议您调查它们。

    来源:

    创建同步适配器:http://developer.android.com/training/sync-adapters/creating-sync-adapter.html

    如何在 Android 中进行 HTTP POST:How to do a HTTP Post in Android?

    PHP GUID:http://php.net/manual/en/function.com-create-guid.php

    【讨论】:

    • 不要在共享首选项中存储密码。如果用户丢失了手机,他们就丢失了密码。它会被读取。如果他们在其他地方使用了该密码,那么他们使用的所有地方都会受到威胁。此外,您已经永久丢失了此帐户,因为他们可以使用密码更改您的密码。正确的方法是向服务器发送一次密码,然后接收一个登录令牌。将其存储在共享首选项中并随每个请求一起发送。如果该令牌被泄露,则不会丢失任何其他内容。
    • 真的吗?对此投反对票?我个人知道有十几个开源应用程序使用这种方法,虽然我自己可能不同意,而且这里有几十个答案展示了做同样事情的例子。无论如何,我已经更新了我的答案以反映这些担忧,我认为对这一部分的全部反对完全没有必要——我花时间来回答,一个简单的评论就足够了。对如此简单的事情的全部反对让人们甚至不想费心写一个答案 - 你可以在你的评论中指出它。
    • 向我展示这里的其他示例,我也会(并且已经)对它们投反对票。这里的想法是我们希望帮助人们成为更好的程序员并改进事物。告诉人们使用不安全的方法只会让问题变得更糟。
    • 正如我所说,答案已更新。来吧:stackoverflow.com/questions/9233035/…stackoverflow.com/questions/785973/…stackoverflow.com/questions/19629625/…stackoverflow.com/questions/1925486/… ... 有很多很多,还有一些有数百个赞成票。
    • 其中一个帖子说这是一个坏主意,根本不这样做,我同意。其他人被否决了。如果您看到更多,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多