Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) 1 [2]  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Защита формы от повторной отправки
AllesKlar  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3691
Пользователь №: 38635
На форуме: 3 года, 5 месяцев, 29 дней
Карма: 195




Цитата (VeRTak @ 26.04.2017 - 12:56)
Отработал скрипт, далее redirect. Попали на страницу какую нужно, уже с пустым постом. Что не так? Или я где то не так понимаю

При такой структуре у тебя должно быть три скрипта (или логических блока, не суть важно)
1. - Форма
2. - Обработчик формы
3. - Обязательный скрипт-приемник, куда нужно будет прыгнуть, дабы убить POST

Для чего нам нужен лишний скрипт? Тогда как, при той же MVC это все интегрируется в index.php и любой action принимает уже чистые данные формы из сессии, а POST уже пуст.

Как ты будешь релизовывать MVC на твоей модели поведения?
- action читает непосредственно из POST.
- action закончил обработку, его задача вывести новое View, но мы этого не можем, т.к. нам нужен промежуточный прыжок, чтобы очистить POST. При этом необходимо куда-то запихать данные, подготовленные для View, как и имя самого View


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
VeRTak  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Местная прописка
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 860
Пользователь №: 41530
На форуме: 1 год, 11 месяцев, 25 дней
Карма: 11




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


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3691
Пользователь №: 38635
На форуме: 3 года, 5 месяцев, 29 дней
Карма: 195




VeRTak
ээээ... За что эксперта дали? biggrin.gif
Ок. У тебя три скрипта, у меня два. Два меньше, чем три biggrin.gif


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15383
Пользователь №: 4190
На форуме: 9 лет, 4 месяца, 20 дней
Карма: 470




Цитата (AllesKlar @ 26.04.2017 - 15:07)
При такой структуре у тебя должно быть три скрипта (или логических блока, не суть важно)
1. - Форма
2. - Обработчик формы
3. - Обязательный скрипт-приемник, куда нужно будет прыгнуть, дабы убить POST

Не надо никуда прыгать! Ты даже на примере этого форума постоянно видишь, как работает "убийца F5" :) (когда при отправке данных вылезает в центре экрана надпись "Подождите" и еще чего-то)

Кстати, в хэлпе об этом сказано всё: http://php.net/manual/ru/function.header.php

Вот примерно так код получается (всё в одном скрипте!!!):
<?php
// обработчик тут же, где и форма, в одном файле - это намного удобнее
if (была отправлена форма) {
... // обрабатываем данные
...

if (если обработка успешна) {
header("refresh: 10, url=этот же файл");
echo ... // выводим какую-нибудь инфу о том, что данные приняты
// и сейчас произойдет автоматический возврат назад;
// можно сделать на JS обратный отсчет и также ссылку для прямого перехода

exit(); // этот также важно тут, чтобы всякая лабуда, что ниже в коде, вообще не выводилась в браузер
}

}


?>
<!doctype html>
...
<body>
<form
....>
...
</form>
....


Это сообщение отредактировал sergeiss - 26.04.2017 - 16:48


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
VeRTak  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Местная прописка
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 860
Пользователь №: 41530
На форуме: 1 год, 11 месяцев, 25 дней
Карма: 11




Цитата (sergeiss @ 26.04.2017 - 16:46)
Вот примерно так код получается (всё в одном скрипте!!!):


Так же делаю. Если обработка успешна header, не успешна и тоже header


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3691
Пользователь №: 38635
На форуме: 3 года, 5 месяцев, 29 дней
Карма: 195




blink.gif ВЫ ЧО? Какой "подождите..."???
Пока будет "подождите", я яваскриптом обновлю 100500 раз страницу и засру всю базу.
А если речь о деньгах? Я с удовольствием "оплачу" множество, множество, множество раз в тот момент, когда буду видеть "Оплата прошла успешно, подождите, сейчас Вы будет перенаправлены..."

Короче, я в расстроенных чуйствах ушел. huh.gif


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16113
Пользователь №: 6543
На форуме: 8 лет, 8 месяцев, 22 дня
Карма: 303

Трезвый :
6 лет, 6 месяцев, 1 день


Цитата (AllesKlar @ 26.04.2017 - 13:20)
Пока будет "подождите", я яваскриптом обновлю 100500 раз страницу и засру всю базу.
Ну вот на, обновляй:
<?php

$token = md5(microtime(true));

if (isset($_COOKIE['token'], $_POST['token']) && $_COOKIE['token'] === $_POST['token']) {
// Обработка

setcookie('token', $token, time() + 100500);
header('location: /'); // Можно вернуть обратно, если другой обработчик
exit();
}

setcookie('token', $token, time() + 100500);

?>
<form action="" method="post">
<
input name="token" type="hidden" value="<?=$token;?>" />
<
input name="text" type="text" value="" /><br />
<
input name="go" type="submit" value="Go!" />
</
form>


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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16113
Пользователь №: 6543
На форуме: 8 лет, 8 месяцев, 22 дня
Карма: 303

Трезвый :
6 лет, 6 месяцев, 1 день


И уж если на то пошло, то это не от F5 защита должна быть, если ты JS боишься. Кроме него еще есть CURL как минимум, а уж если денег касается, то и более продвинутые примочки. Так что сессия тут как слону припарка. В таких случаях более серьёзные транзакции нужны, нежели перетасовка из одного кармана в другой.


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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3691
Пользователь №: 38635
На форуме: 3 года, 5 месяцев, 29 дней
Карма: 195




Цитата (twin @ 26.04.2017 - 15:29)
Ну вот на, обновляй:

Не коректный пример.
Читай топик сначала :)

Обновлять - это было к:
Цитата
header("refresh: 10, url=этот же файл");


Цитата (twin @ 26.04.2017 - 15:36)
И уж если на то пошло, то это не от F5 защита должна быть, если ты JS боишься. Кроме него еще есть CURL как минимум, а уж если денег касается, то и более продвинутые примочки. Так что сессия тут как слону припарка. В таких случаях более серьёзные транзакции нужны, нежели перетасовка из одного кармана в другой

Отговорка. Нигде не сказано, что задача была на "фото любимой собаки на хоумпаге".
С кукисами ясна идея.

Ты мне говоришь: зачем гонять сессию?
Я говорю (1), зачем гонять лишние данные туда-сюда?
Я тебе говорю (2): ты вот этот кусок будешь везде за собой таскать?
if (isset($_COOKIE['token'], $_POST['token']) && $_COOKIE['token'] === $_POST['token']) {
// Обработка


Я в любом месте любого скрипта просто спроошу
$data = $_SESSION['POST'];
и всё, у меня отовсюду доступ к данным, мне не нужно морочиться и в каждом скрипте копипастить один и тот же код.

Короче, холивар. Я попался тебе, вампиреныш, фиг тебе, а не кровь :D
Для остальных, уже перечислены все возможные методы.


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16113
Пользователь №: 6543
На форуме: 8 лет, 8 месяцев, 22 дня
Карма: 303

Трезвый :
6 лет, 6 месяцев, 1 день


Цитата (AllesKlar @ 26.04.2017 - 14:50)
Не коректный пример.
Почему? Как раз корректный. ТС описал тоже самое, только с сессией. А сессия в таком случае невыгодна, кукис лучше.
Цитата (AllesKlar @ 26.04.2017 - 14:50)
Отговорка. Нигде не сказано, что задача была на "фото любимой собаки на хоумпаге".
Какая жо это отговорка. Вопрос был про защиту от повторной отправки, а не от кросспостинга или как он там называется. Вот оплата точно притянута зауши. Потому что если работаешь с деньгами, там совсем другие принципы. Авторизация однозначно, двухфакторное подтверждение крайне желательно, проверка состояния счета при каждом запросе, и так далее. Какие нафиг сессии, какие редиректы. Детский сад.
Цитата (AllesKlar @ 26.04.2017 - 14:50)
Я говорю (1), зачем гонять лишние данные туда-сюда?
Я тебе говорю (2): ты вот этот кусок будешь везде за собой таскать?
В том и дело, что никакие данные не таскаются. В отличие от. Что касается этого куска, так я на коленке написал. А так то в любом уважающем себя фреймворке механизм токенов реализован. Не хочется самому писать, выдерни какой понравится. Хоть на сессиях кстати, как в Ларавеле или той же Симфонии, что на куках, как в Yii. На куках интереснее, если посещаемость большая, ибо загадишь сервак сессиями, тем паче они у тебя по нескольку метров. smile.gif


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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 388
Пользователь №: 40589
На форуме: 2 года, 6 месяцев, 22 дня
Карма: 22




если именно защита от повторной случайноq отправки - то почему бы просто не блокировать отправку на уровне js? у меня на всех формах всегда стоит блокировка кнопки "отправить" после нажатия.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15383
Пользователь №: 4190
На форуме: 9 лет, 4 месяца, 20 дней
Карма: 470




Цитата (depp @ 27.04.2017 - 10:57)
то почему бы просто не блокировать отправку на уровне js?

Это хорошо, если ты данные аяксом отправляешь. Тогда да, на уровне JS всё отлично сработает. Но если форма отправляеться с полной перезагрузкой страницы, скажем так "чистым ПХП", то тогда JS бессилен будет.


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Santehnick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 264
Пользователь №: 26735
На форуме: 6 лет, 3 месяца, 18 дней
Карма: 15




На POST запрос принято выдавать 301 код ответа с перенаправлением на эту же страницу или на другую, вместо 200 OK, чтобы решить проблему повторного отправления.

Можно в любом фреймворке посмотреть реализацию
https://github.com/yiisoft/yii2-app-advance...roller.php#L126

Если отсюда http://www.yiiframework.com/doc-2.0/yii-we...efresh()-detail пойти в глубь то в конце придем к тому, что устанавливается 301 код ответа.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) 1 [2]  Ответ в темуСоздание новой темыСоздание опроса