在表单密码正确时设置cookie

时间:2018-03-12 08:09:18

标签: php cookies setcookie

我有一个表单,当用户输入"测试"它应该创建一个cookie并使用require函数加载模板。一旦cookie启用,它将显示模板。如果cookie过期,则需要再次输入密码。换句话说,如果密码是"测试"我想在再次询问密码之前将该模板包含在用户浏览器中12小时。

以下是我正在尝试的内容。有关cookies here

的更多信息
  

问题是cookie的想法不起作用。

     <?php
        if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $code = $_POST["SecretCode"];
        }



        if( $code === "test") {
        $cookie_name = "user";
        $cookie_value = "Cookie"; 
        setcookie($cookie_name, $cookie_value, time() + (1000 * 10), "/"); // 86400 = 1 day
        if(isset($_COOKIE[$cookie_name])) {
        require_once 'template.php';
//echo 'cookie set:'.$_COOKIE[$cookie_name];
        } 
        }?>

        <form method="post" action='<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>'>
        <input name="SecretCode" type="text" required>
        <button>Check password</button>
        </form>

2 个答案:

答案 0 :(得分:1)

在下一页请求之前,不会填充$_COOKIE超全局中的Cookie值。

当您使用setcookie时,服务器将尝试向客户端发送cookie。如果cookie在后续客户端请求中未过期,则客户端将显示该cookie。然后Php将使用此值填充$_COOKIE超全局。

换句话说:setcookie('foo', 'bar', etc)不会立即填充$_COOKIE['foo']

您目前正在嵌套模板调用,如下所示:

if($code === "test") {
    if(isset($_COOKIE[$cookie_name])) {
        require_once 'template.php';
    }
}

这要求您的秘密是“测试”(来自表单帖子)并且$_COOKIE['user']已设置。因此,除非您在设置了cookie之后提交了具有正确值的表单(至少两次成功的表单提交和验证),否则您的模板将不会被包含在内。

如果你在setcookie之后重定向,那么你可以依赖$_COOKIE。请注意,cookie可能是欺骗性的:

<?php

$cookie_name   = "user";
$cookie_value  = "Cookie";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $secret = isset($_POST['secret']) ? $_POST['secret'] : null;
    $forget = isset($_POST['forget']) ? $_POST['forget'] : null;

    if($secret === "test") {
        $cookie_expiry = time() + (24*60*60); // +1 day
        setcookie($cookie_name, $cookie_value, $cookie_expiry , "/");
        // Redirect here.
        exit;
    }
    if($forget) {
        $cookie_expiry = time() - (24*60*60); // -1 day
        setcookie($cookie_name, '', $cookie_expiry , "/");
        // Redirect here.
        exit;
    }
}
if(isset($_COOKIE[$cookie_name])) {
    echo 'Cookie set.';
} 
?>
<form method="post" action='<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>'>
    <label for="secret">Secret:</label>
    <input name="secret" type="text" required>
    <input type="submit" value="Check in">
</form>
<form method="post">
    <input type="submit" name="forget" value="Forget me">
</form>

答案 1 :(得分:1)

这也有效:

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$cookieName = 'User';

if (isset($_POST['SecretCode']) && ($_POST['SecretCode'] == 'test')) {
  echo 'Password correct.<br>';
  setcookie($cookieName,'Cookie',time()+86400,'/'); // 86400 = 1 day
  echo 'Cookie was set.<br>';
  echo 'Require template here.<br>';
}  elseif (isset($_COOKIE[$cookieName])) {
  echo 'Require template here as well.<br>';
  echo 'Cookie value: ['.$_COOKIE[$cookieName].']<br>';
}

?>

<form method="post">
<input name="SecretCode" type="text" required>
<button>Check password</button>
</form>