Как отправить данные для запроса в форме без каких-либо скрытых полей PHP? - PullRequest
0 голосов
/ 10 июня 2019

Мой код запроса 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>

Теперь вы знаете, что скрытые поля можно редактировать в Inspect Source в веб-браузерахКак я могу отправлять данные в форме для запроса на той же странице без каких-либо полей ввода в качестве скрытых?Как можно использовать переменные вместо ввода скрытых полей?

Спасибо

Ответы [ 5 ]

1 голос
/ 10 июня 2019

Вы смотрите на проблему с неправильной точки зрения. Проблема не в том, что пользователь может отправлять неверные значения. Проблема в том, что ваш код на стороне сервера предполагает , что значения верны.

скрытые поля можно редактировать в Inspect Source в веб-браузерах для каждого тела

Да, это правда. Пользователи также могут создавать любые запросы на ваш сервер полностью вне веб-браузера. Принципиально верно, что любой клиент может отправить любой запрос на ваш сервер в любое время.

Вместо того, чтобы пытаться бороться с этим, просто объясните это. Задай себе вопрос ...

Почему нельзя разрешить пользователю X указывать значение Y в этом поле?

Например, возможно, что значение / запись принадлежит другому пользователю, и этот пользователь не должен иметь возможность редактировать записи других пользователей. Тогда это именно то, что вы должны проверять на стороне сервера.

Выражается как псевдокод:

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

Итак, что же такое CurrentUser? Это зависит от того, как вы отслеживаете, кто является текущим пользователем. (Не входит в вопрос.) Однако, если вы отслеживаете зарегистрированных пользователей, обратитесь к этой информации. А что такое canEdit()? Это зависит от того, как вы определяете, разрешено ли любому пользователю редактировать данную запись. Вам придется написать эту логику.

Обратите внимание, что приведенный выше код псевдокод , и вы не сможете просто скопировать / вставить его как есть и ожидать, что он будет работать. Но, надеюсь, это иллюстрирует общий смысл. Проще говоря:

Когда пользователь пытается выполнить действие, сначала определите, разрешено ли пользователю выполнять это действие. Если это не так, верните ошибку. Если они есть, выполните действие.

Это действительно все, что нужно сделать. Никогда не доверяйте информации от клиента. Всегда проверяйте, что пользователь имеет право делать то, что он пытается сделать.

<ч />

Примечание, следуя всем другим советам, опубликованным в этом вопросе / ответах до сих пор ...

Сессии не нужны для этого. И полагаться на них для этого будет крайне ограниченным и чрезмерно сложным по мере роста потребностей вашего приложения и роста сложности приложения.

Нет ничего плохого в том, что клиент предоставляет "скрытые" значения, которые использует сервер. Действительно, это позволяет вашим сервисам быть намного более RESTful и намного проще в использовании и обслуживании. Все, что вам нужно сделать, это проверить эти значения на стороне сервера перед их использованием.

1 голос
/ 10 июня 2019

Поместите данные переменных в глобальные переменные $ _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-код останется без изменений

Программа PHP, где ваша форма posted, будет начинаться с

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

Если любое другое поле было отправлено, оно будет внутри $ _POST, естественно
Пока $ _SESSION не будет уничтожен с помощью session_destroy ;, ваши переменные будут найдены в любой другой программе, которую вы будете использовать впоследствии.

0 голосов
/ 10 июня 2019
        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;
        });
0 голосов
/ 10 июня 2019

См

Вы можете зашифровать эти данные и проверить их на стороне сервера, как сказано в одном из ответов на этот вопрос:

Как было сказано в этой ссылке в некоторых ответах, вы можете каким-то образом зашифровать скрытые поля.

0 голосов
/ 10 июня 2019

вы можете использовать сессию для таких полей ..

Не нужно брать скрытые поля ..

Вы можете использовать переменные сеанса напрямую ..

<?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);
          }
?>
...