Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的密码安全_Php_Password Protection - Fatal编程技术网

PHP中的密码安全

PHP中的密码安全,php,password-protection,Php,Password Protection,我主要开发HTML/CSS网页,我正在开发一个网页,在这个网页上,用户需要有一个页面密码,以防被窥探。该页面仅用于发布非机密信息,如私人会员活动和日程安排。我知道PHP的基础知识,并希望使用它,但我担心安全性。该页面将有多个用户,但它只需要一个密码,所有用户都将使用该密码。它也是一个流量相当低的网站,所以在这种情况下,它不需要100%安全,但我希望它尽可能安全,没有太多麻烦 到目前为止,我有一个登录页面,当用户试图访问成员页面时,会出现一个带有密码输入字段的页面,该字段将结果发布到一个名为(示例

我主要开发HTML/CSS网页,我正在开发一个网页,在这个网页上,用户需要有一个页面密码,以防被窥探。该页面仅用于发布非机密信息,如私人会员活动和日程安排。我知道PHP的基础知识,并希望使用它,但我担心安全性。该页面将有多个用户,但它只需要一个密码,所有用户都将使用该密码。它也是一个流量相当低的网站,所以在这种情况下,它不需要100%安全,但我希望它尽可能安全,没有太多麻烦

到目前为止,我有一个登录页面,当用户试图访问成员页面时,会出现一个带有密码输入字段的页面,该字段将结果发布到一个名为(示例名称)verifypassword.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")
}
$hash = '$2y$10$zRg5l/v9gzD/aICnp/GUlu/rFv/0ZNvxX/A5v86zjepZmuRWWL6IG';
<?
$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")
}
?>
然后,在成员页面的顶部,我有一些PHP代码行,如下所示:

$userloggedin = $_COOKIE["mycookie"];

if (!isset ($userloggedin)) {
die("Please log in to view this page");
}
$_SESSION['logged_in'] = password_verify( $_POST['password'], $hash );
如果用户未登录,但密码和cookie仍在服务器上传输,则文件和值本身将通过die功能隐藏。 我试着读过密码值的盐析和散列,但不熟悉这种东西。我应该怎么做?有我可以阅读的教程或资源吗?我试着在Google、php.net上搜索,当然还有stackoverflow,但是除了创建一个数据库来存储多个用户生成的密码之外,我找不到任何处理密码的东西,这不是我需要的


我目前正在使用WAMPP。

如果您想遵循最佳实践,代码的顶行应该如下所示:

$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")
}
$hash = '$2y$10$zRg5l/v9gzD/aICnp/GUlu/rFv/0ZNvxX/A5v86zjepZmuRWWL6IG';
<?
$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")
}
?>
请注意,我们存储的是散列,而不是明文中的密码。这些散列按以下方式生成:

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(如
$\u cookie['mycookie']
)对用户进行身份验证,那么有人可以发送一个手工制作的cookie头来模拟登录的效果。这个特殊问题的解决方案是使用会话。在每个脚本的顶部,运行
session\u start()
,它设置自己的cookie。此cookie不包含任何信息,只包含随机生成的唯一ID。PHP存储信息并将其与该ID关联(通过临时文件夹中的文件),但客户端本身在任何情况下都无法看到该信息的实际内容,也无法对其进行更改

要向会话添加信息,请将其放入$\u会话超全局,如下所示:

$userloggedin = $_COOKIE["mycookie"];

if (!isset ($userloggedin)) {
die("Please log in to view this page");
}
$_SESSION['logged_in'] = password_verify( $_POST['password'], $hash );
password\u 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.我重写了我的答案,因为我意识到它没有很好地回答您的许多问题:)

如果您想遵循最佳实践,代码的顶行应该如下所示:

$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")
}
$hash = '$2y$10$zRg5l/v9gzD/aICnp/GUlu/rFv/0ZNvxX/A5v86zjepZmuRWWL6IG';
<?
$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")
}
?>
请注意,我们存储的是散列,而不是明文中的密码。这些散列按以下方式生成:

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(如
$\u cookie['mycookie']
)对用户进行身份验证,那么有人可以发送一个手工制作的cookie头来模拟登录的效果。这个特殊问题的解决方案是使用会话。在每个脚本的顶部,运行
session\u start()
,它设置自己的cookie。此cookie不包含任何信息,只包含随机生成的唯一ID。PHP存储信息并将其与该ID关联(通过临时文件夹中的文件),但客户端本身在任何情况下都无法看到该信息的实际内容,也无法对其进行更改

要向会话添加信息,请将其放入$\u会话超全局,如下所示:

$userloggedin = $_COOKIE["mycookie"];

if (!isset ($userloggedin)) {
die("Please log in to view this page");
}
$_SESSION['logged_in'] = password_verify( $_POST['password'], $hash );
password\u 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、 我重写了我的答案,因为我意识到它没有很好地回答你的许多问题:)

你可能不应该用Cookies来做这件事,因为它们可以在c上伪造