如何安全地访问外部数据库?

时间:2014-09-11 14:50:09

标签: php codeigniter optimization cross-domain

我正在开发一个移动应用程序,它必须访问外部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

会话已加密,我也将它们存储在数据库中。 你认为这种方法会好吗?我错过了一些重要的事情吗?

4 个答案:

答案 0 :(得分:5)

您应该为移动应用程序创建API。创建一个身份验证机制。

如果您的数据库包含用户特定数据,那么您应该为每个用户创建帐户。因此,如果用户嗅探网络并尝试手动调用api,那么他只能更改自己的数据。

有一些用于php的API库,你应该研究一下。

答案 1 :(得分:1)

实际上,您的解决方案正在做的不仅仅是必要的。感兴趣的唯一标记是public_token来回发送。因此,您可以从会话数据中丢弃private_tokensecure_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应用程序+移动应用程序的安全身份验证,那么它可以是一个很好/经过验证的解决方案!

另一方面,它实际上取决于您当前系统的复杂程度以及未来系统的运行方式。