我计划实施以下架构来保护我的API。我不维护任何会话,将从Android,iOS和WEB页面调用API。客户端将在部署时获得公钥和私钥对。我不想使用HTTPS。
我的代码如下:
<?php
类Auth {
function is_valid_request(){
$header=apache_request_headers();
$authorization=$_POST['authorization'];//client will create this by same rule as my_algo_to_generate_hash().
$public_key=$_POST['public_key'];
$time=$_POST['time'];
$secret_key=mysql_result(mysql_query("SELECT private_key FROM auth WHERE public_key='$public_key'"),0);
$hash=my_algo_to_generate_hash($public_key, $secret_key);//this is dummy.
if($hash===$authorization){
$token=sha1('some really random strings');
mysql_query("INSERT INTO tokens (token) VALUES ('$token')");
return $token;
}
return false;
}
function is_valid_user(){
if($this->is_valid_request()){
$user=$_POST['email'];
$pass=$_POST['pass'];
$token=$_POST['token'];
if (mysql_num_rows(mysql_query("SELECT id FROM tokens WHERE token='$token' "))) {
$query=mysql_query("SELECT user_id FROM users WHERE email='$email' AND password='$pass'");
if (mysql_num_rows($query)) {
$access_token=my_algo_to_generate_hash($email,$password);
$refresh_token=my_algo_to_generate_hash();
mysql_query("UPDATE users SET access_token='$access_token', refresh_token='$refresh_token' WHERE email='$email'");
return array(
'access_token'=>$access_token,
'expire_time'=>$some_time,
'refresh_token'=>$refresh_token
//return false in all other case
);
}
}
}
}
function is_logged_in(){
$access_token=$_POST['access_token'];
$time=$_SERVER['REQUEST_TIME'];
$some_time='time to which access_token is valid';//how much it should be?
$query=mysql_query("SELECT user_id FROM users WHERE access_token='$access_token' AND TIMESTAMPDIFF(seconds,'$time' ,access_token_created_at)<'$time'");
if(mysql_num_rows(result)){
return true;
}
return false;
}
}
此架构对于通过HTTP进行连接有多安全?
忽略代码级别的安全性,例如sql注入或散列算法或与脚本相关的任何内容。只需寻找逻辑和架构。
答案 0 :(得分:0)
修改
很难找到你真正想要的东西。你在谈论HTTP上的连接安全性。您对HTTP的唯一开放是您的$_POST
变量(除非您运行PHP&lt; 5.3和register_globals = on
),其余代码都是服务器端的东西。
您的$_POST
变量就会出现问题。
但由于HTTP连接没有其他任何影响,因此没有什么可说的。
旧回答
这根本不安全,因为您使用旧的已弃用的 PHP MySQL库: http://php.net/manual/en/intro.mysql.php
此外,它很容易受到 MySQL注入的影响。这在SO上多次提到过,请参阅此答案,例如:https://stackoverflow.com/a/60496/3391783
您应该切换到较新的PHP库,如“mysqli”或“PDO”和使用MySQL参数以防止SQL注入。