当表单密码正确时设置 cookie

Setting cookies when form password is correct

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

下面是我正在尝试的。有关 cookie 的更多信息 here

Problem is that the cookie idea is not working.

     <?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>

您在 $_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';
    }
}

这要求您的密码是 'test'(来自 post 表格)并且 $_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>

这也有效:

<?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>