PHP中的密码安全性

时间:2014-06-03 18:45:51

标签: php password-protection

我主要开发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。

2 个答案:

答案 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;在没有哪里并且进入。它还有一个好处,如果你曾经改变密码,它会自动注销已经登录的每个人。