我真的有很多关于这个特定领域的问题。但基本上我只是想知道如何创建最有效和最安全的 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 中存储和使用登录详细信息的正确方法的官方页面。