【发布时间】: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:我看到以下优点:
- 当用户尝试以任何(被黑/黑)方式修改本地存储的用户 ID 时 - 他将无法从服务器检索其他用户(不同的用户 ID)的信息,因为他显然没有不知道其他用户 ID 的密码。
- 当有人通过我们的应用程序主页更改密码时,他需要在应用程序内登录,因为存储的密码与在线数据库中的密码不再匹配。
- 我可以使用上面发布的 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 存储将是安全,并且仅限于特定应用程序使用!?
提前致谢
【问题讨论】: