具有输入验证的 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>

https://www.tehplayground.com/Hf25u68JYljxkjQu

给你。 Cookies 是关键。

  1. 当用户密码正确时,设置cookie 2秒,
    将用户重定向到同一页面
  2. 当密码不正确时,仍然将用户重定向到同一页面并删除该 cookie

Cookies:

  • 如果在用户的计算机上激活了 cookie,则显示欢迎消息
  • 如果没有,显示另一条消息或什么都不做(您可以删除最后一条语句)

PhpFiddle Cookies way.

更新: 根据评论,还有一种使用 php 会话的替代方法。对于此问题,您对会话与 cookie 有何建议?写在评论里!

Session way

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