PRG模式技术与输入验证

时间:2018-03-26 12:42:53

标签: php html forms post post-redirect-get

我已经实现了发布/重定向/获取模式,以避免每次重新加载网页时都将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>

3 个答案:

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

https://www.tehplayground.com/Hf25u68JYljxkjQu

答案 2 :(得分:0)

你在这里。 Cookies是关键。

  1. 当用户密码正确时,将cookie设置为2秒和
    将用户重定向到同一页面
  2. 如果密码不正确,仍然会将用户重定向到同一页面并删除该Cookie
  3. 饼干:

    • 如果在用户的计算机上激活了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>