PHP中的API安全性(PHP中的简单oauth类型实现)

时间:2014-11-24 09:32:14

标签: php security

我计划实施以下架构来保护我的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注入或散列算法或与脚本相关的任何内容。只需寻找逻辑和架构。

1 个答案:

答案 0 :(得分:0)

修改

很难找到你真正想要的东西。你在谈论HTTP上的连接安全性。您对HTTP的唯一开放是您的$_POST变量(除非您运行PHP&lt; 5.3和register_globals = on),其余代码都是服务器端的东西。

只要您不使用任何类型的MySQL参数,

您的$_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注入。