Как я могу предотвратить повторную отправку формы в PHP (которая защищает через несколько окон)? - PullRequest
3 голосов
/ 07 марта 2012

Я пробовал:

  • метод POST / REDIRECT / GET, но он не защищает от нескольких экземпляров одной и той же формы (например, если пользователь открывает form.php в двух отдельных окнах и отправляет форму в окне 1, они могут по-прежнему отправлять в окне 2)

  • метод UNIQUE TOKEN, в котором uid генерируется в переменной сеанса при загрузке и подтверждении формы и сбрасывается при обработке формы, но если у пользователя открыты другие формы, переменная сбрасывается из эти другие формы, так что они рассматриваются как «уже обработанные».

Ответы [ 3 ]

1 голос
/ 08 марта 2012

Вы видели комментарий пользователя "Ofir Baruch"? Мне кажется правильным.

Вам просто нужно объединить два подхода, которые вы уже попробовали, сделать это правильно, и, как сказал Офир Барух, иметь уникальный сеанс токена для каждой формы.

Более или менее так:

form1.php

session_start();

if (empty($_SESSION['form_tokens']['form1']))
{
    $_SESSION['form_tokens']['form1'] = generate_random_token();
}

if (isset($_POST['token']))
{
    if ($_POST['token']) != $_SESSION['form_tokens']['form1'])
    {
        // the token is invalid - do not process the form
        redirect('/some_page');
    }
    else
    {
        // process the form here
        if ($success)
        {
            // reset the token for this form
            unset($_SESSION['form_tokens']['form1']);
            redirect('/another_page');
        }
    }
}

<form id="form1">
    <input type="hidden" name="token" value="<?php echo $_SESSION['form_tokens']['form1']; ?>" />
    <input type="submit" value="Submit" />
</form>

В form2.php вы бы сделали то же самое, но вместо этого использовали бы свой уникальный токен:

$_SESSION['form_tokens']['form2']

Если вы хотите запретить ТАКЖЕ использовать два разных браузера - или даже компьютера - и это так важно, тогда вам следует заняться этим в другом месте - я имею в виду, вы не должны допускать, чтобы у одного и того же ПОЛЬЗОВАТЕЛЯ могло быть ДВЕ СЕССИИ. Есть несколько способов сделать это, но это другой вопрос.

0 голосов
/ 07 марта 2012

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

это открытие требует наличия массива сеанса (или дБ) с элементами всех идентификаторов, которые принадлежат необработанной форме.только одна группа может оставаться одновременно.любой идентификатор, не входящий в группу, игнорируется / отменяется.

0 голосов
/ 07 марта 2012

Ограничены ли отправка формы зарегистрированными пользователями или посетителями сайта?

Если эта форма предназначена только для зарегистрированных пользователей, вы можете проверить их user_id, как только форма достигнет вашего контроллера.Вы можете установить временный файл cookie или переменную сеанса во время обработки формы.Когда форма завершится, вы можете сбросить эту переменную сеанса.Как только форма будет отправлена, проверьте, не установлена ​​ли эта переменная сеанса УЖЕ (т. Е. Отправили ли они форму дважды).Если эта переменная сеанса будет обнаружена, не удастся выполнить запрос.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...