当表单密码正确时设置 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>
我有一个表单,当用户输入 "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>