我已经实现了发布/重定向/获取模式,以避免每次重新加载网页时都将http post请求发送到服务器,但是我遇到了问题。
当密码设置为Welcome
时,test
消息只应显示一次。在我的情况下,它永远不会显示,除非你注释掉第4行。
如果删除该行,则不应用PRG模式,因此每次重新加载时都会重新提交表单
下面的代码是一个完整的代码,直接粘贴到您的代码中进行测试。或here
<?php
$self = htmlspecialchars($_SERVER["PHP_SELF"]);
if(isset($_POST['Code2']) && ( $_POST['Code2'] == "test")) {
header('Location: '.$self, true, 303);exit; //redirection on the same page
?> <span id="welcome-msg"></span> <!-- Display welcome Message -->
<?php } ?>
<form method="post">
Code:<br>
<input type="text" name="Code2"> <input type="submit">
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$("#welcome-msg").html("Welcome").fadeOut(5500);
</script>
答案 0 :(得分:1)
这是一个使用PHP会话而不是cookie的简单PoC。客户端会话由cookie标识,但客户端无法控制会话存储的数据。理论上,您可以通过这种方式将更多敏感数据放入“欢迎”消息中,尽管登录方法仍然非常基础,至少应该通过HTTPS完成。
<?php
// Start PHP session management
session_start();
$self = htmlspecialchars($_SERVER["PHP_SELF"]);
if (isset($_POST['Code2']) && $_POST['Code2'] === "test") {
// Code is correct, flash the welcome message after redirect
$_SESSION["flash_welcome"] = true;
header('Location: '.$self, true, 303);
exit;
} else if (isset($_POST['Code2']) && $_POST['Code2'] !== "test") {
// Code was sent but is incorrect, flash the incorrect message after redirect
$_SESSION["flash_incorrect"] = true;
header('Location: '.$self, true, 303);
exit;
}
if ($_SESSION["flash_welcome"]) {
// Display welcome message
?><span id="welcome-msg">Welcome</span><?php
}
if ($_SESSION["flash_incorrect"]) {
// Display incorrect message
?><span id="incorrect-msg">Incorrect code</span><?php
}
// Clear flash messages
$_SESSION["flash_welcome"] = false;
$_SESSION["flash_incorrect"] = false;
?>
<form method="post">
Code:<br><input type="text" name="Code2">
<input type="submit">
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>$("#welcome-msg,#incorrect-msg").fadeOut(5500);</script>
答案 1 :(得分:0)
您的<span id="welcome-msg"></span>
位于重定向之后,位于if语句中的exit()
之后
如果条件存在与否,则不会显示您的范围。
您需要将其移出&#34; if&#34;,或者在重定向之前添加它&#34; exit()&#34;
<?php
$self = htmlspecialchars($_SERVER["PHP_SELF"]);
if(isset($_POST['Code2']) && ( $_POST['Code2']== "test")) {
header('Location: '.$self, true, 303);
exit;
} ?>
<span id="welcome-msg"></span>
<form method="post">
Code:<br>
<input type="text" name="Code2"> <input onclick="event.preventDefault()" type="submit">
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$("#welcome-msg").html("Welcome").fadeOut(5500);
</script>
答案 2 :(得分:0)
你在这里。 Cookies
是关键。
饼干:
<强>更新强>: 根据评论,使用php会话有另一种方法。对于此问题,您对会话与Cookie有何建议?写下评论!
<h2>code: "test"</h2>
<?php
$self = htmlspecialchars($_SERVER["PHP_SELF"]);
if(isset($_POST['Code2']) && ( $_POST['Code2'] == "test")) {
setcookie('welcome','Cookie',time()+(20),'/'); //cookie will expire in 2 seconds
header('Location: '.$self, true, 303);
exit;
}
else if(isset($_POST['Code2']) && ( $_POST['Code2'] !== "test")){
setcookie('welcome','Cookie',time()-(20),'/'); //if password is incorrect delete cookie
header('Location: '.$self, true, 303);
exit;
}
else if (isset($_COOKIE['welcome'])) { //if cookie is active
?><span id="welcome-msg">Welcome</span> <?php }
else if (!isset($_COOKIE['welcome'])){ //cookie expired or invalid password
?> <span id="Expired">Cookie expired, not set yet or Incorrect Password</span> <?php } ?>
<form method="post">
Code:<br>
<input type="text" name="Code2">
<input type="submit">
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$("#welcome-msg,#Expired").fadeOut(5500);
</script>