我试图用一个简单的例子来演示我的问题:我在android中有一个小应用程序,用户可以在其中登录并保持登录。因此,我知道用户标识并拥有它存储在智能手机上。与PHP服务器通信的Android应用程序
现在在我的服务器上,我有一些用户特定的条目,它们会不时变化。我会以某种方式下载它们,以便这些条目在应用程序本地可用,但显然只有登录用户的相关条目。
如何安全地做到这一点?
我可以设置一个PHP脚本,它将具有指定ID的用户条目作为JSON数据数组。但是,如何使它足够安全以至于没有人可以利用脚本,例如直接从浏览器调用它?我的意思是我可以做这样的事情:
<?php
// check and validate $_GET['user_id']
...
// select all entries for this id:
$mysql->fetch('...');
// return as JSON:
echo json_encode($rows);
?>
,然后从APP发送HTTP请求到与指定用户ID服务器。但是我必须确保没有其他方式可以通过这种方式来检索数据。
其次,我必须确保没有人能够以这种方式利用android应用程序,将存储的用户标识修改为自定义指定的用户,然后使用该应用程序来检索不同用户的数据。这意味着,绝不能以任何方式改变当前登录的用户的本地存储的用户ID。 如何做到这一点?
没关系,wtsang02答案:存储密码(可能散列/盐腌)在应用的Android存储用户ID在本地:我看到以下优点:
- 当用户试图以任何(黑客/黑客)方式修改本地存储的用户标识 - 他不能从服务器为不同的用户(不同的用户标识)获取信息,因为他明显不知道其他用户-id的密码。
- 当有人通过我们的应用程序的主页更改密码时,他需要在应用程序内登录,因为存储的密码与在线数据库中的密码不再匹配。
- 我可以像上面发布的那样使用PHP脚本,而不需要直接将浏览器调用隐藏起来,就像(###)一样。因为每个来自浏览器的调用都不会简单地产生具有特定用户标识的用户的数据库条目,因为您需要知道密码本身(然后它可能会以任何方式合法地检索数据因为你被认证了),但是用户还需要知道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);
}
------->但尽管如此,一个很大的问题是:当我在本地存储的Android应用程序存储中的用户ID,它是真的有可能让用户以任何方式修改它?我以为当地的Android存储将是安全和限制为特定的应用程序使用!?
在此先感谢
非常感谢您的回答。请看我上面更新的问题:-)!? – tim
永不发送密码通过GET。始终使用POST,如果可能的话使用SSL。 –
@Javier ProvechoFernández:是的,我会这样做,但是请问为什么?但是,无论如何,我会通过POST发送它 - 发送咸味密码很好,不是吗?如果服务器支持它,甚至可能使用SSL ... – tim