关于这个特定领域,我确实有很多问题。但基本上我只想知道如何创建最高效、最安全的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构建的任何东西都可能比这更不安全,所以我不会为此烦恼。当然,要正确配置会话设置。
跨域重用信息是一个复杂的领域。如果它们都由同一个数据库备份,只需让用户登录任何网站即可。您需要管理单独的会话(阅读:用户需要单独登录每个网站,但可以使用相同的用户/密码)或构建一些非常复杂的跨域会话共享(提示:您可能不想)。如果你想寻求一个更复杂的解决方案(例如,因为你的域没有共享一个中央数据库),请在谷歌上搜索"单一登录",并为数小时、数天和数周的阅读做好准备。