Как запретить пользовательский запрос на отправку на страницу "действие" формы


Я создаю форму и хотел бы сделать страницу отправки PHP доступной только в том случае, если форма была отправлена, предотвращая пользовательские запросы на мою страницу PHP.

Это мой form.html :

<html>
    <head>
        <title>Name/Surname form</title>
    </head>
    <body>
        <form id="form1" method="POST" action="processData.php">
            Name: <input type="text" id="name" name="name"><br>
            Surname: <input type="text" id="surname" name="surname"><br>
            <input type="submit" value="Submit form">
        </form>
    </body>
</html>

А затем мой processData.php :

<?php
    if(!isset($_POST['name'],$_POST['surname'])) die;

    include ("config.php");

    //connect
    $mysqli = new mysqli($dbhost, $dbuser, $dbpassword, $dbname); //variables from config.php

    //check connection
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }


    if ($stmt = $mysqli->prepare("INSERT INTO name_surname_table (name, surname) values (?, ?)")) {

        //bind
        $stmt->bind_param('ss', $name, $surname);

        //set
        $name=$_POST['name'];
        $surname=$_POST['surname'];

        //execute
        $stmt->execute();

        //close
        $stmt->close();
        }
    else {
        //error
        printf("Prepared Statement Error: %s\n", $mysqli->error);
    }
?>

Проблема в том, что если я выполняю пользовательский запрос на публикацию без отправки формы на моей предыдущей странице, данные отправляются в базу данных, это означает, что автоматизированная программа может просто поместить в мою базу данных все, что захочет... Как я могу предотвратить это?

Спасибо!

Author: BackSlash, 2013-03-16

4 answers

У вас есть много вариантов, чтобы роботы не отправляли ваши формы автоматически:

  1. Используйте Капчу или какое-нибудь простое поле расчета (например What gives 3 + 2 ?)

  2. С помощью жетона

  3. Сделайте некоторую проверку с помощью переменных $_REQUEST

Токен можно сделать следующим образом:

session_start();
//generate a unique string
$token = uniqid(rand(), true);
//Store the token
$_SESSION['token'] = $token;
//Store the token_time
$_SESSION['token_time'] = time();

Добавьте скрытый ввод в свою форму:

<input type="hidden" name="token" id="token" value="<?php echo $token;?>"/>

И чем перед отправкой формы в базу данных:

session_start();
//If token exists
if(isset($_SESSION['token']) && isset($_SESSION['token_time']) && isset($_POST['token']))
{
    //If it's the same as the posted one
    if($_SESSION['token'] == $_POST['token'])
    {
        //For example 15 mins ago
        $old_time = time() - (15*60);
        //If token hasn't expired
        if($_SESSION['token_time'] >= $old_time)
        {
           //Do your queries here
        }
    }
}
 4
Author: soyuka, 2017-05-23 12:16:35

В форме может быть скрытое поле, содержащее секретный код, срок действия которого истекает...

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

При обработке отправки формы убедитесь, что секретный код совпадает с тем, что хранится в сеансе.

 0
Author: Rob Cozzens, 2013-03-16 11:31:11

Вы должны выполнить аутентификацию на основе токенов для своих форм.

На странице, где вы отображаете форму, сначала установите переменную сеанса со случайным кодом.

//generate this using whatever random code generation method you prefer.
$_SESSION["token"] = "your-random-code";

На вашем форуме есть скрытое поле, как показано ниже.

<input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>">

В файле php обработчика отправки выполните проверку, как показано ниже.

if(isset($_POST['token']) && $_POST['token'] == $_SESSION['token'])
 0
Author: kavin, 2013-03-16 11:34:10

В принципе, вы не можете предотвратить отправку вредоносным клиентом "неправильных" данных на ваш сервер. Вы сами должны обнаружить эту ситуацию и соответствующим образом обработать случаи ошибок.

Если только определенные пользователи должны иметь возможность отправлять данные, то, очевидно, вам нужна какая-то форма системы входа в систему. Затем вы можете доверять любым данным вошедшего в систему пользователя и отвергать все остальное.

Если вы просто хотите знать, что клиент загрузил форму на предыдущей странице, вы можете добавить скрытое поле содержащий "nonce" - случайную строку, значение которой вы храните где-то на сервере, например, в сеансе PHP. Если отправленное значение nonce не соответствует ожидаемому значению, отклоните ввод. Обратите внимание, что это не гарантирует, что пользователь взаимодействовал с формой в своем браузере, только то, что он ее загрузил (поскольку программа все еще может извлечь nonce и стимулировать отправку формы)

 0
Author: IMSoP, 2013-03-16 11:36:49