回复到div而不是空白页

问题描述:

我正在使用此代码在PHP中创建安全登录页面。我从http://girlswhogeek.com/tutorials/2006/creating-a-secure-php-login-page得到它。回复到div而不是空白页

<?php 
    $username = "user"; 
    $password = "pass"; 
    $randomword = "bibblebobblechocolatemousse"; 

    if (isset($_COOKIE['MyLoginPage'])) { 
     if ($_COOKIE['MyLoginPage'] == md5($password.$randomword)) { 
?> 
    CONTENT HERE 
<?php 
    exit; 
     } else { 
     echo "<p>Bad cookie. Clear please clear them out and try to login again.</p>"; 
     exit; 
     } 
    } 

    if (isset($_GET['p']) && $_GET['p'] == "login") { 
     if ($_POST['name'] != $username) { 
     echo "<p>Sorry, that username does not match. Use your browser back button to go back and try again.</p>"; 
     exit; 
     } else if ($_POST['pass'] != $password) { 
     echo "<p>Sorry, that password does not match. Use your browser back button to go back and try again.</p>"; 
     exit; 
     } else if ($_POST['name'] == $username && $_POST['pass'] == $password) { 
     setcookie('MyLoginPage', md5($_POST['pass'].$randomword)); 
     header("Location: $_SERVER[PHP_SELF]"); 
     } else { 
     echo "<p>Sorry, you could not be logged in at this time. Refresh the page and try again.</p>"; 
     } 
    } 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?>?p=login" method="post"> 
    <fieldset> 
     <label> 
      <input type="text" name="name" id="name" /> Name 
     </label> 
     <br /> 
     <label> 
      <input type="password" name="pass" id="pass" /> Password 
     </label> 
     <br /> 
     <input type="submit" id="submit" value="Login" /> 
    </fieldset> 
</form> 

它的作品真的很好,但是,当有日志信息的错误,它切换到一个空白页和回声出一个消息,说在日志中的信息是错误的。我想知道是否有办法让它在输入页面上回显到页面上的div。我试图把相关的回声消息放入div中,但它不起作用。我必须承认,我甚至不知道为什么它会进入空白页面。

此外,这是做到这一点的最好方法还是有办法让它更安全?

感谢您提供任何援助。

本尼。

有2个问题:

  • 在你的代码的exit停止页面的执行,以便“回声-ING”你的消息后,该页面将停止
  • 如果你想在一个div显示在一个变量中设置的消息,并在div代码

这里显示它是你的代码示例,重新加工了一下(你可能需要调整):

<?php 
$message = NULL; 
if (isset($_COOKIE['MyLoginPage'])) { 
    if ($_COOKIE['MyLoginPage'] == md5($password . $randomword)) { 
     ?> 
     CONTENT HERE 
     <?php 
     exit; 
    } else { 
     $message = "<p>Bad cookie. Clear please clear them out and try to login again.</p>"; 
    } 
} 

if (isset($_GET['p']) && $_GET['p'] == "login") { 
    if ($_POST['name'] != $username) { 
     $message = "<p>Sorry, that username does not match. Use your browser back button to go back and try again.</p>"; 
    } else if ($_POST['pass'] != $password) { 
     $message = "<p>Sorry, that password does not match. Use your browser back button to go back and try again.</p>"; 
    } else if ($_POST['name'] == $username && $_POST['pass'] == $password) { 
     setcookie('MyLoginPage', md5($_POST['pass'] . $randomword)); 
     header("Location: $_SERVER[PHP_SELF]"); 
    } else { 
     $message = "<p>Sorry, you could not be logged in at this time. Refresh the page and try again.</p>"; 
    } 
} 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?>?p=login" method="post"> 
    <fieldset> 
    <label><input type="text" name="name" id="name" /> Name</label> 
     <br /> 
    <label><input type="password" name="pass" id="pass" /> Password</label> 
     <br /> 
    <input type="submit" id="submit" value="Login" /> 
    </fieldset> 
    <?php 
    if (isset($message)) { 
     echo "<div>" . $message . "</div>"; 
    } 
    ?> 
</form> 
+0

嘿,谢谢JScoobyCed,这就像我想要的那样工作。非常感谢。你能回答我的问题:这是多么安全,是否可以更安全?这是做这件事的最好方法吗? – Benjamin 2013-02-28 02:11:09

+0

恩......没有“最好的办法”来做到这一点。你提供的链接是从2006年开始的,所以我想你可以找一些更近期的帖子。请注意,使用md5进行登录被认为是不安全的,因为可能会被利用,但如果你没有保护财务信息,那么你可能是很好的。 – JScoobyCed 2013-02-28 02:29:36

如果登录失败,则回显登录结果,但不显示页面。如果您想要在您的网站设计中显示登录失败页面,我建议将它们发送回登录页面并显示错误消息。例如:

header("Location: http://website.com/loginpage.php?failed=1"); 

,然后在登录页面的代码:

if ($_GET['failed'] == '1') echo "Failed to login. Please try again."; 

这样,如果登录失败,他们将被送回登录页面,并显示错误消息。

您是否把您的整个内容,包括<html>标签在哪里说CONTENT HERE

唯一应该去那里的是安全内容,而不是整个页面。您的样板html,<html><head><title>title</title></head><body> ... </body></html>应该包含您发布的所有代码块。 CONTENT HERE的内容仅显示成功登录,所以任何不安全的内容都不应显示在那里。

下面是我很久以前写的一个PHP page locker的替代实现,这可能会使这个更清晰。 < /无耻插头>

+0

我喜欢这个,因为它使用会话。这更安全吗?另外,是的,我知道这里有什么内容。我没有选择这个作为公认的答案,因为它是关于内容而不是错误消息。尽管如此,我喜欢你的代码,并可能会与它一起。 – Benjamin 2013-02-28 02:13:38

+0

在cookies中存储密码并不是一个好习惯,这就是你问题中代码的作用。即使它被散列,破坏MD5也是相当微不足道的。更好地使用会话并将密码检查限制在服务器端。如果JScoobyCed的答案能够更好地解决您的问题,我并没有冒犯,希望我的代码有用。随时与我联系的问题/反馈,这是旧的,但我很乐意改善它。 – dimo414 2013-02-28 05:25:20