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

时间:2012-08-30 19:56:18

标签: php html

我有一个目前有效的网站。它有一个显示信息的页面,另一个允许您编辑信息源的页面。现在,当您登录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的新手,完全是安全的新手。

3 个答案:

答案 0 :(得分:4)

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

了解PHP Sessions

查看PHP manual中的一些示例。

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

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

一个示例流程:

进行身份验证(用户登录)时:

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()(很可能是在退出页面上)。

答案 1 :(得分:3)

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

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

设置完成后,您可以在

的每个文件中获取用户名
session_start();

写的。

答案 2 :(得分:0)

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