具有输入验证的 PRG 模式技术
PRG pattern technique with input validation
我已经实施了 Post/Redirect/Get 模式 以避免每次重新加载网页时将 http post 请求发送到服务器,但是我遇到问题。
当密码设置为 test
时,Welcome
消息应该只显示 一次 。就我而言,它永远不会显示,除非您注释掉第 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>
您的 <span id="welcome-msg"></span>
位于重定向之后和 if 语句中的 exit()
之后
无论条件是否存在,您的跨度都不会显示。
您需要将其移出"if",或者在重定向和"exit()"
之前添加它
<?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>
给你。 Cookies
是关键。
- 当用户密码正确时,设置cookie 2秒,
将用户重定向到同一页面
- 当密码不正确时,仍然将用户重定向到同一页面并删除该 cookie
Cookies:
- 如果在用户的计算机上激活了 cookie,则显示欢迎消息
- 如果没有,显示另一条消息或什么都不做(您可以删除最后一条语句)
更新:
根据评论,还有一种使用 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>
这是一个简单的 PoC,它使用 PHP 会话而不是 cookie。客户端会话由 cookie 标识,但客户端无法控制会话存储的数据。从理论上讲,您可以通过这种方式将更多敏感数据放入 "welcome" 消息中,尽管登录方法仍然非常基本,至少应该通过 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>
我已经实施了 Post/Redirect/Get 模式 以避免每次重新加载网页时将 http post 请求发送到服务器,但是我遇到问题。
当密码设置为 test
时,Welcome
消息应该只显示 一次 。就我而言,它永远不会显示,除非您注释掉第 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>
您的 <span id="welcome-msg"></span>
位于重定向之后和 if 语句中的 exit()
之后
无论条件是否存在,您的跨度都不会显示。
您需要将其移出"if",或者在重定向和"exit()"
<?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>
给你。 Cookies
是关键。
- 当用户密码正确时,设置cookie 2秒,
将用户重定向到同一页面 - 当密码不正确时,仍然将用户重定向到同一页面并删除该 cookie
Cookies:
- 如果在用户的计算机上激活了 cookie,则显示欢迎消息
- 如果没有,显示另一条消息或什么都不做(您可以删除最后一条语句)
更新: 根据评论,还有一种使用 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>
这是一个简单的 PoC,它使用 PHP 会话而不是 cookie。客户端会话由 cookie 标识,但客户端无法控制会话存储的数据。从理论上讲,您可以通过这种方式将更多敏感数据放入 "welcome" 消息中,尽管登录方法仍然非常基本,至少应该通过 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>