我主要开发HTML / CSS网页,我正在开发一个网页,用户需要保护网页密码免受窥探。该页面仅用于发布非机密信息,例如私人成员事件和日程安排。我知道PHP的基础知识,并希望使用它,但我担心安全性。该页面将有多个用户,但它只需要一个密码,供所有用户使用。它也是一个交通量相当低的网站,所以对于这种情况,它不需要100%安全,但我希望它尽可能安全,没有太多麻烦。
到目前为止,我有一个登录页面,当用户尝试访问成员页面时会出现一个密码输入字段,该字段会将结果发布到名为(示例名称)的页面中验证验证密码.php
此文件如下所示:
$password = ("mypass");
$passresult = $_POST["password"];
$passresult = strip_tags($passresult);
$passresult = htmlspecialchars($passresult);
if ($passresult != $password) {
die("Invalid password.");
}
elseif ($passresult == &password) {
setcookie("mycookie");
header("location: member-page.php");
}
else {
die("Unknown Error")
}
然后,在成员页面的顶部,我有一些PHP代码行如下:
$userloggedin = $_COOKIE["mycookie"];
if (!isset ($userloggedin)) {
die("Please log in to view this page");
}
如果用户未登录,则文件和值本身将通过die函数隐藏,但密码和cookie仍在服务器上传输。 我试着阅读盐水和散列密码值,但不熟悉这种事情。我该怎么做?我可以阅读任何教程或资源吗?我尝试在谷歌,php.net,当然还有堆栈溢出,但我找不到任何处理密码,除了创建一个数据库来存储多个用户生成的密码,这不是我需要的。 / p>
我目前正在使用WAMPP。
答案 0 :(得分:3)
如果您想遵循最佳做法,代码的第一行应如下所示:
$hash = '$2y$10$zRg5l/v9gzD/aICnp/GUlu/rFv/0ZNvxX/A5v86zjepZmuRWWL6IG';
请注意,我们在纯文本中存储哈希而不是密码。这些哈希值以下列方式生成:
password_hash("test", PASSWORD_DEFAULT);
我们为什么要这样做?因为如果以某种方式访问您的数据库(或本例中的代码),那么您也不希望您的密码被盗。内置的密码处理功能可以尽可能地减轻这种影响。
在检查密码方面,您必须确保用户必须通过互联网以这种或那种方式发送密码!如果这是您最关心的问题,则可以使用SSL来缓解此问题 - 最佳做法是始终使用SSL进行至少身份验证。这意味着如果有人拦截您的用户与您的网站之间的连接,他们将只能看到加密数据。无论如何,当它到达时你会检查如下:
// Assuming single password:
if ( password_verify( $_POST['password'], $hash ) ) {
// correct!
// the plain text in $_POST['password'] is the same as the plain text used to generate $hash
}
好的,接下来的事情。 Cookie在浏览器和服务器之间作为标题发送。这些可以由客户任意设置。因此,如果您依赖$_COOKIE['mycookie']
之类的cookie来验证用户身份,那么有人可以发送手工制作的Cookie标头来模仿登录的效果。此特定问题的解决方案是使用会话。在每个脚本的顶部,运行session_start()
,设置自己的cookie。此cookie不包含任何信息,只包含随机生成的唯一ID。 PHP存储信息并将其与该ID相关联(通过temp文件夹中的文件) - 但客户端本身无法查看该信息的实际内容 - 或者更改它。
要向会话添加信息,请将其放在$ _SESSION超全局中,如下所示:
$_SESSION['logged_in'] = password_verify( $_POST['password'], $hash );
如果密码匹配, password_verify
将返回true,否则返回false,因此您可以依赖它来正确设置布尔值。
因此,您可以按以下方式为login.php
:
session_start();
$hash = '$2y$10$zRg5l/v9gzD/aICnp/GUlu/rFv/0ZNvxX/A5v86zjepZmuRWWL6IG';
if ( isset($_POST['password']) ) {
// Assuming single password:
if ( password_verify( $_POST['password'], $hash ) ) {
// correct!
header('Location: /member-page.php');
}
}
// display login form
并在会员页面的顶部:
session_start();
if (empty($_SESSION['logged_in'])) { // checks if it's set and if it's false
die("Please log in to view this page.");
header('Location: /login.php');
}
n.b。我重写了我的答案,因为我意识到它没有很好地回答你的许多问题:)
答案 1 :(得分:1)
您可能不应该使用Cookie来执行此操作,因为它们可以在客户端伪造。会话变量可能会更好一点,但如果你想尝试保持简单,我可能会用一些盐MD5密码并将其存储在cookie中,然后在尝试访问时检查MD5ed密码+ salt该页面。
所以我最喜欢这样的东西:
<?
$password = ("mypass");
$salt = "makeUpASaltHere";
$passresult = $_POST["password"];
$passresult = strip_tags($passresult);
$passresult = htmlspecialchars($passresult);
if ($passresult != $password) {
die("Invalid password.");
}
elseif ($passresult == &password) {
setcookie("mycookie",md5($password.$salt));
header("location: member-page.php");
}
else {
die("Unknown Error")
}
?>
将它放在一个单独的文件中,只需使用require()将其包含在所有成员页面的顶部。
<?
$password = ("mypass");
$salt = "makeUpASaltHere";
$userloggedin = $_COOKIE["mycookie"];
if ($userloggedin == md5($password.$salt)) {
die("Please log in to view this page");
}
?>
仍然没有使用会话变量那么好,但至少有人不能仅仅创建&#34; mycookie&#34;在没有哪里并且进入。它还有一个好处,如果你曾经改变密码,它会自动注销已经登录的每个人。