0

我真的有很多关于这个特定领域的问题。但基本上我只是想知道如何创建最有效和最安全的 phpsession通信方法。我读过很多网站都在谈论这个,他们似乎并不同意或与我目前的情况有关。

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

1. PHP 会话

登录后我将开始一个会话。我知道我有不同的方法来处理这些问题,但目前我已经创建了一个像这样的会话变量,$_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、Google 等)的相同登录详细信息。我希望能够为我正在使用的所有域重复使用相同的登录信息,但是我如何确保只有我的(注册)域可以访问登录信息,而不是其他站点?

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

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

4

2 回答 2

2

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

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

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

Google 和 Facebook 可以使用 openAuth(2) 登录到各种网站。我不确定这是否对您有用,但 cookie 最多只能由一个域访问。

我建议使用 PHP 会话,如果您正确处理它们,它们是安全的。如果您不确定如何执行此操作,可以查看一些好的 PHP 框架。我从经验中知道 Laravel 框架有一个很好的登录处理程序。

于 2013-02-03T13:05:05.847 回答
0

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

跨域重用信息是一个复杂的领域。如果它们都由同一个数据库支持,则只需让用户登录任何站点即可。您将需要管理单独的会话(阅读:用户需要分别登录每个站点,但可以使用相同的用户/密码)或构建一些非常复杂的跨域会话共享(提示:您可能不想这样做) . 如果您想寻求更复杂的解决方案(例如,因为您的域不共享中央数据库),谷歌“单点登录”并准备好几个小时、几天和几周的阅读。

于 2013-02-03T12:57:30.223 回答