php - Android 应用程序与 PHP 服务器通信

标签 php android security

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

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

如何安全地做到这一点?

我可以设置一个 PHP 脚本,以 JSON 数据数组的形式提供具有指定 ID 的用户条目。但如何使其足够安全,以便没有人可以利用该脚本,例如直接从浏览器调用?我的意思是我可以做这样的事情:

<?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请求。但我必须确保没有其他方法可以通过这种方式检索数据。

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


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

  1. 当用户尝试以任何(黑客/黑客)方式修改本地存储的用户 ID 时,他将无法从服务器检索不同用户(不同用户 ID)的信息,因为他显然不这样做不知道其他用户 ID 的密码。
  2. 当有人通过我们应用程序的主页更改密码时,他需要在应用程序内登录,因为存储的密码与在线数据库中的密码不再匹配。
  3. 我可以使用上面发布的 PHP 脚本,而无需隐藏它以防止直接浏览器调用,例如 (###)。因为直接来自浏览器的每个调用都不会简单地生成具有特定用户 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 存储安全并且仅限于特定应用程序使用!?

提前致谢

最佳答案

我们先回答第二个问题。

I've got to make sure that nobody can exploit the android app in that way that he modifies the stored user-id

这是行不通的,因为用户方面的任何东西都是你无法信任的。他们无论如何都可以修改它。

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

更新:

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

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

关于php - Android 应用程序与 PHP 服务器通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22798820/

相关文章:

php - Laravel 5.3 ModelFactory Seeder 调用未定义的方法 Illuminate\Database\Query\Builder::posts()

php - 在 Redbean PHP 中验证

php - mysql 语句在 php 代码中无法正常工作

java - 无法从 EditText 转换为 Button

security - Rijndael 和 AES 之间的差异

python - 使用 python SMTP 库凭据安全发送电子邮件

php - 每个 parent 有多少个特定项目的 child ?

android - 如何在不受InputType限制的情况下将字符串粘贴到EditText中?

java - 使用 HttpURLConnection 的 Android 应用程序在 connect() 处崩溃

asp.net-mvc - asp.net mvc 中的安全问题是什么?