【问题标题】:Android App with PHP Server Communication与 PHP 服务器通信的 Android 应用程序
【发布时间】:2014-04-01 23:27:36
【问题描述】:

我尝试用一​​个简单的例子来说明我的问题:我在 android 上有一个小应用程序,用户可以在其中登录并保持登录状态。因此我知道用户 ID 并将其存储在智能手机上。

现在在我的服务器上,我有一些特定于用户的条目,它们会不时更改。我会以某种方式下载它们,以便这些条目在应用程序本地可用,但显然只有登录用户的相关条目。

如何安全地做到这一点?

我可以设置一个 PHP 脚本,它将具有指定 ID 的用户的条目作为 JSON-Data-array 提供。但是如何让它足够安全,以至于没有人可以利用脚本,例如直接从浏览器调用?我的意思是我可以这样做:

<?php
// check and validate $_GET['user_id']
...

// select all entries for this id:
$mysql->fetch('...');

// return as JSON:
echo json_encode($rows);
?>

然后从APP向指定user-id的服务器发送HTTP请求。但我必须确保没有其他方法可以通过这种方式检索数据。

其次:我必须确保没有人可以通过将存储的用户 ID 修改为自定义指定的用户 ID,然后使用该应用程序检索不同用户的数据的方式来利用 Android 应用程序。这意味着,不能有任何方式以某种方式更改当前登录用户的本地存储用户 ID。 如何做到这一点?


好的,正如 wtsang02 的回答:在 APP 的 android-storage 中本地存储密码(可能是散列/加盐)和用户 ID:我看到以下优点:

  1. 当用户尝试以任何(被黑/黑)方式修改本地存储的用户 ID 时 - 他将无法从服务器检索其他用户(不同的用户 ID)的信息,因为他显然没有不知道其他用户 ID 的密码。
  2. 当有人通过我们的应用程序主页更改密码时,他需要在应用程序内登录,因为存储的密码与在线数据库中的密码不再匹配。
  3. 我可以使用上面发布的 PHP 脚本,而无需隐藏它以防止直接浏览器调用 make 它,例如 (###)。因为直接来自浏览器的每个调用都不会简单地为具有特定用户 ID 的用户生成数据库条目,因为您需要知道密码本身(然后以任何方式检索数据显然是合法的当您通过身份验证时),但用户还需要知道 saltedPassword 是如何准确计算的(散列函数、哪种盐、多少次迭代等)。

(###)

// check and validate $_GET['user_id'] and $_GET['saltedPass']
...
if(correctCredentials()) {
  // select all entries for this id:
  $mysql->fetch('...');

  // return as JSON:
  echo json_encode($rows);
}

-------> 但是,仍然存在一个大问题:当我将用户 ID 本地存储在 android 应用程序存储中时,用户真的可以以任何方式修改它吗?我认为本地 android 存储将是安全,并且仅限于特定应用程序使用!?

提前致谢

【问题讨论】:

    标签: php android security


    【解决方案1】:

    让我们先回答第二个问题。

    我必须确保没有人可以在其中利用 android 应用程序 他修改存储的用户ID的方式

    这行不通,因为用户方面的任何事情,您都无法信任。他们可以随时修改。

    现在作为您的第一个问题,为什么不将您的用户 ID 和密码本地存储在手机中。每次您需要检索数据时,您将用户 ID 和密码传递给您的服务器进行验证。这样,您的用户是否修改用户 ID 或密码都没有关系。并且作为普通用户,如果您将密码存储在本地,他们将无需更改密码并重新登录。

    更新:

    任何本地存储都不安全。任何有根设备都可以查看/编辑您的应用程序拥有的任何文件。无根设备无法查看它。但是您为那一小部分已获得根目录的设备或试图破坏您的应用程序的人添加了安全测量,因此您不能认为这部分设备是安全的。

    正如评论所指出的,如果发送密码,请使用 POST 而不是 GET。

    【讨论】:

    • 非常感谢您的回答。请看我上面更新的问题:-)!?
    • 永远不要通过 GET 发送密码。始终使用 POST 并尽可能使用 SSL。
    • @Javier Provecho Fernández:是的,我会这样做,但你能告诉我为什么吗?但是,是的,无论如何我都会通过 POST 发送它 - 发送加盐密码很好,不是吗?如果服务器支持,甚至可以使用 SSL...
    • @tim:如果您通过 GET 将加盐密码作为参数发送,它将在“任何人”嗅探的 URI 甚至历史记录中可见。 POST + SSL 很难获得。
    • 是的,但仅限于使用 SSL 时。当不使用 SSL 时,我认为 GET 和 POST 之间没有任何区别。!?
    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多