1

我有一个目前可以运行的网站。它有一个显示信息的页面,以及另一个允许您编辑信息源的页面。现在,当您登录 index.php 时,它会通过表单将数据发布到 view.php。该网站不使用任何cookies。当我单击编辑时,它会将用户名、密码和提交请求发布到 edit.php。目前,这个按钮效果很好,但编辑按钮的当前代码如下:

<FORM NAME ="form1" METHOD ="post" ACTION = "edit.php">
<p class="BodyText">
<INPUT TYPE = "Hidden" Name = "Username" Value = "<?php print($username); ?>">
<INPUT TYPE = "Hidden" Name = "PassHash" Value = "<?php print($password); ?>">
<INPUT TYPE = "Submit" Name = "Change" VALUE = "Edit">
</p>
</FORM>

我以前没有注意到,但现在我在查看代码时注意到它会打印密码。如果没有这个,我真的不知道如何获取编辑页面的密码,但是当我检查 Chrome 中的元素时,我可以看到密码哈希 (SHA-1)。首先,我认为是的,这是一个安全漏洞吗?其次,如何在不将哈希发送回最终用户的情况下将密码传递给 edit.php 页面。第三,我完全做错了吗?对我来说,通过帖子登录似乎没问题,但安全性疯了吗?我对 PHP 有点陌生,对安全性也完全陌生。

4

3 回答 3

4

这不是执行此操作的好方法(表单中的隐藏输入)。

了解PHP 会话

查看PHP 手册中的一些示例。

您需要在页面之间的会话中保留用户的访问权限,并且永远不要打印出他们的密码。

您可以验证用户的密码以对其进行身份验证,并让会话保存有关用户是谁以及他们是否为该会话登录的信息(而不是尝试在每个页面上验证密码)。

一个示例流程:

验证时(用户登录):

session_start();

// Authenticate user here with the password.
if (someAuthenticationFunction($_POST['user'], $_POST('password') === true) {
    $_SESSION['user'] = $user;
    $_SESSION['loggedIn'] = true; // Notice we're not saving the password into the session, only whether user is loggedIn.
}

在您想要检查用户身份验证的所有其他页面上(很可能在 edit.php 页面上):

session_start();

if ($_SESSION['loggedIn'] === true) {
    $user = $_SESSION['user'];
    // Do the actual editing stuff here.
}

一旦用户准备好退出,使用session_destroy()(很可能在退出页面上)。

于 2012-08-30T19:58:44.727 回答
3

您可以将密码保存在 $_SESSION 变量中。为此,您必须在处理登录表单的页面中写入:

session_start();//at top of the page
$_SESSION['user'] = $_POST['username'];
$_SESSION['password'] = $_POST['password'];

设置完成后,您可以在每个文件中获取用户名

session_start();

是写的。

于 2012-08-30T20:03:47.147 回答
0

如果您不想使用 cookie,您可以使用 URL 中传递的某种会话 ID(请参阅php.net/output_add_rewrite_var)并将其存储在数据库中,但是您将打开一个全新的蠕虫罐与会话劫持有关。基于 COOKie 的 PHP 会话是可行的方法。

于 2012-08-30T20:03:51.933 回答