我正在开发一个移动应用程序,它必须访问外部Web应用程序(PHP + Codeigniter)才能管理ajax查询的操作。
所以通过这种方式,存在问题。如果有人看到使用的URL,可以删除行,或从数据库修改用户的信息。所以我认为在这个系统中要避免这个:
成功登录后,我会这样做:
// getToken : https://stackoverflow.com/a/13733588/2154101
$this->session->set_userdata('private_token', getToken(50));
$public_token = getToken(50);
$this->session->set_userdata('secure_token', md5("$private_token:$public_token"));
$data['token'] = $public_token;
// some stuff ...
// send $data in JSON
然后客户端会在下一个查询中使用公共令牌,我会在服务器上执行此操作:
$public_token = $this->input->post('token');
$data['token'] = get_public_token($public_token);
// some stuff ...
// send $data in JSON
get_public_token
在使用此代码的帮助程序中:
public get_public_token($public_token) {
$last_secure_token = $this->session->userdata('secure_token');
$private_token = $this->session->userdata('private_token');
$actual_token = md5("$private_token:$public_token");
if ($actual_token === $last_secure_token) {
$public_token = getToken(50);
$this->session->set_data('private_token', getToken(50));
$this->session->set_data('secure_token', md5("$private_token:$public_token"));
return $public_token;
} else { // you are cheating me ...
$this->session->sess_destroy();
redirect('/');
}
}
因此,只有此会话的用户才能修改数据库的数据。
我只想尝试在此处解释:https://stackoverflow.com/a/17371101/2154101
会话已加密,我也将它们存储在数据库中。 你认为这种方法会好吗?我错过了一些重要的事情吗?
答案 0 :(得分:5)
您应该为移动应用程序创建API。创建一个身份验证机制。
如果您的数据库包含用户特定数据,那么您应该为每个用户创建帐户。因此,如果用户嗅探网络并尝试手动调用api,那么他只能更改自己的数据。
有一些用于php的API库,你应该研究一下。
答案 1 :(得分:1)
实际上,您的解决方案正在做的不仅仅是必要的。感兴趣的唯一标记是public_token
来回发送。因此,您可以从会话数据中丢弃private_token
和secure_token
,仅保留public_token
进行检查。当你可以简化到(X + 5)/2 == (14 + 5)/2
时,你当前的支票是X == 14
([received_token + 5] / 2等于[14 + 5] / 2?)。
然而,如果有人在嗅探网络,他可以将最后一个令牌发送到客户端并使用它来劫持该会话。他可以执行任何操作,而原始客户端不会使用过时的令牌发送请求,从而终止会话。
更好的解决方案是在登录后创建secure_key
并将其保留在两端(客户端和服务器)。然后,服务器会在每个响应中继续发送新的public_token
,但客户端会在请求时发送md5(secure_key + public_token)
。这会将劫持窗口缩小到会话开始的确切位置。如果没有原始密钥,攻击者就无法创建有效的md5。
但是我们在这里讨论的是小黑客粉丝。无论如何,任何更热心的人都会破解。如果你担心这一点,那么扔掉所有的东西,只需使用HTTPS连接。通过可信连接,您的会话和访问控制规则将受到保护。
答案 2 :(得分:0)
更好的方法是使用SOAP或SAML2创建API。
答案 3 :(得分:0)
OAuth可以是一个非常好的解决方案:http://oauth.net/。它负责令牌并具有非常安全的API!如果您希望支持Web应用程序+移动应用程序的安全身份验证,那么它可以是一个很好/经过验证的解决方案!
另一方面,它实际上取决于您当前系统的复杂程度以及未来系统的运行方式。