Web应用程序中与数据库通信的适当安全性


Proper security for communication with DB in Web App

关于这个特定领域,我确实有很多问题。但基本上我只想知道如何创建最高效、最安全的phpsession通信方法。我读过很多关于这件事的网站,它们似乎不同意或与我的现状无关。

我的问题是,我不知道如何正确创建登录、会话、cookie、注册等,以匹配高安全级别。到目前为止,这是我的想法。

1.PHP会话

我将在登录后开始一个会话。我知道我有不同的方法来处理这些问题,但目前我已经创建了一个会话变量,如so $_SESSION['user'],它允许我在会话期间存储用户的电子邮件地址。然后,当与服务器的会话结束时,我遇到了一个问题。这就把我带到了下一处房产。

2.库克

使用cookie,我将能够存储电子邮件地址和哈希编码的密码,然后能够根据这些登录信息重新创建会话。

<?
session_start();
require_once('config.php'); //retrieved from the servers include folder specified on the apache server.
// if session is closed that means that there wouldn't be stored a session variable called 'user' anymore.
if ($_SESSION['user'] == '') {
    // if the cookie hasn't been set..
    if ($_COOKIE['user'] == '') {
        // ... close the session and return to the login page
        session_destroy();
        header('Location: login.php?err=4'); // err=4 means session ended
    } else {
        // We don't know wether the user has logged in using e-mail or username, so that's why we connect using either email or username.
        $sql = 'SELECT * FROM login WHERE (email = :user and password = :psw) or (username = :user and password = :pass)';
        $statement = $conn->prepare($sql);
        $statement->bindParam(':user', $_COOKIE['user'], PDO::PARAM_STR);
        $statement->bindParam(':psw', $_COOKIE['psw'], PDO::PARAM_STR);
        if ($statement->execute() && $row = $statement->fetch()) {
            $_SESSION['user'] = $_COOKIE['user'];
        } else {
            // Failed to retrieve data somehow.
        }
    }
}
?>

但后来我读到session_id()也是一个cookie存储值,每次重新创建会话时都是一样的。所以我实际上不必再次将这些值与服务器匹配,因为我可以再次启动会话,然后从我离开的地方继续。。但我认为这是一个安全漏洞,因为如果session_id()被其他人检索到,他们将能够使用相同的session_id()等进行连接

3.我还需要使用其他域的值

我知道可以使用另一个网站(如Facebook、谷歌等)的相同登录信息。我希望能够对我正在使用的所有域重复使用相同的登录信息,但我如何确保只有我的(注册的)域才能访问登录信息,而不是其他网站?

4.还有其他安全的方法吗

这其实是我的问题。我不确定我所做或计划的是否高度安全,而且我绝对不认为我的新手经验足以创建登录安全的数据库连接。因此,我想知道是否有人可以将我链接到官方页面,以最有效和安全的方式在PHP中存储和使用登录详细信息。

PHP会话是处理PHP登录的方法。要以保存的方式执行此操作,您应该确保会话数据存储在服务器上,并且客户端在cookie中只有session_id。

每次安全级别更改(登录、注销等)时,都应该重新生成会话id以确保更安全(旧的被盗会话id将变得不可用)。您还应该将会话cookie设置为http_only,这样就不可能使用JavaScript窃取cookie。

从安全角度来看,我建议您永远不要使用cookie来存储敏感信息。存储在cookie中的信息不会被保存,而是存储在客户端计算机上,可能会被更改或窃取。

谷歌和脸书使得使用openAuth登录各种网站成为可能(2)。我不确定这是否对您有用,但cookie最多只能由一个域访问。

我建议使用PHP会话,如果处理得当,它们是安全的。如果你真的不确定如何做到这一点,你可以看看一些好的PHP框架。根据经验,我知道Laravel框架有一个很好的登录处理程序。

会话已经使用cookie来保持会话。如果配置得当,您可以无限期地打开会话,如果这是您想要做的(除非用户删除cookie,但基于cookie的解决方案也无济于事)。你用cookie构建的任何东西都可能比这更不安全,所以我不会为此烦恼。当然,要正确配置会话设置。

跨域重用信息是一个复杂的领域。如果它们都由同一个数据库备份,只需让用户登录任何网站即可。您需要管理单独的会话(阅读:用户需要单独登录每个网站,但可以使用相同的用户/密码)或构建一些非常复杂的跨域会话共享(提示:您可能不想)。如果你想寻求一个更复杂的解决方案(例如,因为你的域没有共享一个中央数据库),请在谷歌上搜索"单一登录",并为数小时、数天和数周的阅读做好准备。