har*_*on4 0 php optimization codeigniter cross-domain
我正在开发一个移动应用程序,它必须访问外部webapp(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
Run Code Online (Sandbox Code Playgroud)
然后客户端将在下一个查询中使用公共令牌,我将在服务器上执行此操作:
$public_token = $this->input->post('token');
$data['token'] = get_public_token($public_token);
// some stuff ...
// send $data in JSON
Run Code Online (Sandbox Code Playgroud)
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('/');
}
}
Run Code Online (Sandbox Code Playgroud)
因此,只有此会话的用户才能修改数据库的数据.
我只是想在这里解释同样的问题:https://stackoverflow.com/a/17371101/2154101
会话已加密,我也将它们存储在数据库中.你认为这种方法会好吗?我错过了重要的事吗?
小智 5
您应该为移动应用程序创建API.创建身份验证机制.
如果您的数据库包含用户特定数据,则应为每个用户创建帐户.因此,如果用户嗅探网络并尝试手动调用api,那么他只能更改自己的数据.
那里有一些用于php的API库,你应该研究一下.