我该如何修复这个安全漏洞


How do I fix this security hole?

我有一个目前可以使用的网站。它有一个显示信息的页面,还有一个可以编辑信息源的页面。现在,当你登录index.php时,它会通过一个表单将数据发布到view.php。该网站不使用任何cookie。当我点击编辑时,它会将用户名、passhash和提交请求发布到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)。首先,我想是的,这是一个安全漏洞吗?其次,如何将passhash传递到edit.php页面,而不将哈希发送回最终用户。第三,我这样做完全错了吗?对我来说,通过帖子登录似乎没问题,但这种安全性疯了吗?我对PHP有点陌生,对安全性也完全陌生。

这不是一个好方法(表单中的隐藏输入)。

了解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()(很可能在注销页面上)。

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

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

设置后,您可以在所在的每个文件中获得用户名

session_start();

已写入。

如果你不想使用cookie,你可以使用URL中传递的某种会话ID(请参阅php.net/output_add_rewrite_var)并将其存储在数据库中,但随后你会打开一个全新的蠕虫来处理会话劫持。基于COokie的PHP会话是可行的。