POST 如何通过 PHP 在没有任何隐藏字段的情况下在表单中查询数据?

How to POST data to query in Form without any hidden-fields by PHP?

我的php查询码

<?php 
  if (isset($_POST['btn_add'])) 
      {
          $query_insert = "INSERT INTO Calc_Tbl(id_Customer,Flname_Customer, )
          VALUES (N'$_POST[id_Hidden]', N'$_POST[flname_Hidden]' )";
          mysqli_query($db, $query_insert);
      }
?>

我的 html 表单代码将数据发送到上述查询

<form method="post" action="" >
    <input type="hidden" name="id_Hidden">
    <input type="hidden" name="flname_Hidden">
    <button type="submit" class="btn btn-danger" name="btn_add"></button>
</form>

现在您知道每个人都可以在 Web 浏览器的 Inspect Source 中编辑隐藏字段,如何在没有任何输入字段作为隐藏字段的情况下以表单形式发送数据以在同一页面中查询? 如何使用变量而不是输入隐藏字段?

谢谢

您可以对此类字段使用会话..

不需要隐藏字段..

您可以直接使用会话变量..

<?php 
          if (isset($_POST['btn_add'])) 
          {
              $query_insert = "INSERT INTO Calc_Tbl(id_Customer,Flname_Customer)
              VALUES ('".$_SESSION["id"]."','".$_SESSION["flname"]."')";
              mysqli_query($db, $query_insert);
          }
?>

See

您可以加​​密此数据并在服务器端对其进行验证,正如该问题的其中一个答案所述,

正如某些答案中link所说,您可以通过某种方式加密隐藏字段。

将您的变量数据放入 $_SESSION 全局变量中。
首先要做的就是像这样开始你的会话

<?php
session_start();
//now you have created $id and $flname somewhere in your code
//which you want to submit
$_SESSION['id']=$id;
$_SESSION['flname']=$flname;
?>

表单的其余部分 HTML 代码将保持原样

您的表格 posted 所在的 PHP 程序将以

开头
<?php
session_start();
$id=$_SESSION['id'];
$flname=$_SESSION['flname'];

如果提交了任何其他字段,它们自然会在 $_POST 中
在使用 session_destroy; 销毁 $_SESSION 之前,您的变量将在您随后使用的任何其他程序中找到。

        With Ajax you can do like this :
var first = 'data1';
var second = 'data2';
    $("body").off("submit","#assignedUserForm").on("submit","#assignedUserForm",function(){
            $("#assignedUserForm [type='submit']").text('Loading...').prop('disabled', true);
            $('<input>').attr({
                type: 'hidden',
                name: 'id_Hidden',
                value: first 
            }).appendTo('#assignedUserForm');
            $('<input>').attr({
                type: 'hidden',
                name: 'flname_Hidden',
                value: second 
            }).appendTo('#assignedUserForm');
            var formData = new FormData(this);  
            $.ajax({
                url: 'url.php',
                type: 'POST',
                data: formData,
                contentType: false,
                cache: false,
                processData: false,
                success: function (response) {
                    $("#assignedUserForm [type='submit']").text('Submit').prop('disabled', false);

               }
            });
            return false;
        });

你看问题的角度不对。 问题不在于用户可以提交不正确的值。问题在于您的server-side代码假定值是正确的。

the hidden fields can edit in Inspect Source in Web browsers by every body

是的,这是真的。用户还可以完全在 Web 浏览器之外向您的服务器发送他们想要的任何请求。从根本上说,任何客户端都可以随时向您的服务器发送任何请求。

与其试图与之抗争,不如简单地解释一下。问问自己...

Why shouldn't User X be allowed to submit Value Y in this field?

例如,value/record 可能属于不同的用户,并且该用户不应该能够编辑其他用户的记录。那么这正是您应该验证的 server-side.

表示为pseudo-code:

if (!CurrentUser->canEdit($_POST[id_Hidden])) {
    die "You are not allowed to edit this record.";
}
// continue editing the record here

那么CurrentUser是什么?这取决于您如何跟踪当前用户是谁。 (不包括在问题中。)无论您如何跟踪 logged-in 用户,请参考该信息。什么是 canEdit()?这取决于您如何确定是否允许任何给定用户编辑任何给定记录。您必须编写该逻辑。

请注意上面是 pseudo-code 你不能只 copy/paste 它 as-is 并期待它工作。但希望它能说明整体观点。简单来说:

When a user attempts to perform an action, first determine if the user is allowed to perform that action. If they are not, return an error. If they are, perform the action.

仅此而已。永远不要暗中信任来自客户的信息。始终验证用户是否有权执行他们正在尝试执行的操作。


旁注,到目前为止,遵循此 question/answers 中发布的所有其他建议...

为此不需要会话。随着应用程序需求的增长和应用程序复杂性的增长,依赖它们将变得极其有限且过于复杂。

客户端提供服务器使用的 "hidden" 值绝对没有错。事实上,这可以让您的服务变得更加 RESTful 并且更易于使用和维护。您需要做的就是在使用它们之前 验证 这些值 server-side。