2012-08-30 129 views
1

我有一个网站,目前的作品。它有一个显示信息的页面,另一个允许您编辑信息源。现在,当你在index.php上登录时,它通过表单将数据发布到view.php。该网站不使用任何cookie。当我点击编辑时,它会将用户名,密码和提交请求发布到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方面有点新,而且完全是安全的。

+0

反正密码在第一个登录页面上传输。你在这里要做的是尽量减少传输到一个页面。就是这样。安全方面,index.php脚本是主要的障碍。为所有页面启用SSL,而不是关注第二个或第三个POST请求。 – mario

+0

CP ** Cookie **人应该使用cookie(或会话) – 2012-08-30 20:15:33

回答

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

+0

您的链接没有提供太多帮助。这里是更好的资源吗? http://www.w3schools.com/php/php_sessions.asp – Paulywog

+2

w3school不是推荐的源代码,请参阅http://w3fools.com – 2012-08-30 20:02:15

+0

@CPCookieMan如何实现会话取决于你如何验证用户(使用密码等)。在您的会话中,您可能希望保留的一些内容是:用户名可能,用户是否通过此会话的身份验证。编辑页面应该检查会话是否被认证,而不是针对密码散列。当用户注销时,只需销毁会话即可。 – Stegrex

3

你可以将密码保存在$ _SESSION变量中。 对于它,你必须在那里登录表单得到处理在网页中写:在此之后设置,你可以得到的用户名在每一个地方

session_start(); 

写入文件

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

+0

这似乎是一个非常好的答案。每个文件都必须有session_start();访问这些变量? – Paulywog

+0

@CPCookieMan不,只有认证页面应该有session_start();每隔一页检查是否设置了会话。 – Stegrex

+0

哈哈okay ty Stegrex我学到了一些新东西:D –

0

如果你不想使用cookies,你可以使用URL中传递的某种会话ID(见php.net/output_add_rewrite_var)并将它存储在数据库中,但是你会打开一个全新的蠕虫箱与会话劫持有关。基于COOKIE的PHP会话是要走的路。