|
|
|
| есть форма через которую отправляется сообщение на эл. почту.
Так вот вопрос собственно: злоумышленник может посылать соообщения долго и нудно просто обновляя страницу на которую ссылается скрипт (action). Как жтого избежать? | |
|
|
|
|
|
|
|
для: neokortex
(05.06.2008 в 21:07)
| | Делать перенаправление на другую страницу (или на саму себя), после удачной отправки почты, с помощью header() или мета тега. | |
|
|
|
|
|
|
|
для: neokortex
(05.06.2008 в 21:07)
| | Добавлю, что совет sim5 делает эту процедуру просто более утомительной. На такие вещи, как отправка почты желательно добавлять CAPTCHA. | |
|
|
|
|
|
|
|
для: BinLaden
(05.06.2008 в 23:15)
| | >желательно добавлять CAPTCHA.
Вопрос был о другом, а именно, о том, что при обновлении страницы из браузера при(скорее всего) POST- передачи данных, невозможность отправить их во второй раз при обновлении страницы из браузера.
CAPTCHA немного для другого существует. | |
|
|
|
|
|
|
|
для: AcidTrash
(05.06.2008 в 23:27)
| | > Вопрос был о другом
На мой взлгяд, автору виднее
Я понимаю, в чём проблема автора и совет sim5 очень кстати, я против ничего не имею. Я лишь подчеркнул, что этого недостаточно для такого сервиса, как отправка почты. | |
|
|
|
|
|
|
|
для: BinLaden
(05.06.2008 в 23:33)
| | у меня страница контактов предположим
site.ru/mail/
в зависимости от isset($_POST[message]) выводится форма отправки
то есть попадая первый раз на страницу, пользователю загружается форма отправки сообщения с action на эту же страницу site.ru/mail/
пользователь нажимает "отправить": появляется $_POST[message] и вместо формы появляется сообщение об отправке.
Так вот если теперь обновить то можно до бесконечности отправлять сообщения
пробовал перенаправить после отправки на страницу типа site.ru/mail/?send_status=ok
все равно если обновлять уже site.ru/mail/?send_status=ok то происходит то же самое: браузер предлагает совершить повторную отправку данных.
не работает потому что action и форма -одна и та же страница?
наверное action надо сделать отдельным скриптом с перенаправлением на site.ru/mail/? | |
|
|
|
|
|
|
|
для: neokortex
(06.06.2008 в 09:44)
| | После отправки сделайте перенаправление с помощью функции header("Location: ..."); на эту же страницу, это сбросит POST-параметры. | |
|
|
|
|
|
|
|
для: neokortex
(06.06.2008 в 09:44)
| | К тому, что сказал AcidTrash, добавлю. Все очень просто, в такой последовательности:
1. В начале вашего скрипта инициализируйте переменные, которые определяют полученные из формы данные, и которые вы вставляете в фому. При первом запуске скрипта, они у вас будут пусты, а при ошибках ввода, содержать уже введенные пользователем данные. Считайте это вежливостью с вашей стороны.
2. Далее идет проверка получения формы и ее данных, если нет ошибок, то отправляйте почту и делайте перенаправление: header('location: site.ru/mail/?send_status=ok') - send_status будет опредлять, выводить вам форму по умолчанию или нет. Если send_status=ok, значит сообщение пользователю - OK! Если есть ошибки ввода, устанавливаете переменную для вывода ошибок.
3. Вывод формы по умолчанию и ошибках.
И делать отдельные страницы для проверки и вывода формы, нет необходимости. | |
|
|
|
|
|
|
|
для: BinLaden
(05.06.2008 в 23:15)
| | sim5 вообще-то правильно сказал | |
|
|
|
|
|
|
|
для: neokortex
(05.06.2008 в 21:07)
| | Я бы реализовал защиту на сессиях, которая удаляется в случае удачной отправки, или защиту с помощью картинки.
Защита с помощью картинки немного сложнее в реализации, однако это большая гарантия в безопасноти от злоумышленников. Но в то же время написав один раз защиту с помощью картинки для одного сервиса, далее можно её применять и к другим на Вашем сайте. | |
|
|
|
|
|
|
|
для: SportSoft
(06.06.2008 в 10:47)
| | спасибо | |
|
|
|
|
|
|
|
для: SportSoft
(06.06.2008 в 10:47)
| | "Защита картинкой" не спасет от F5. | |
|
|
|
|
|
|
|
для: sim5
(06.06.2008 в 11:35)
| | и даже от CTRL+R ))))) | |
|
|
|
|
|
|
|
для: sim5
(06.06.2008 в 11:35)
| | Если "защита картинкой" от F5 не спасает - надо оторвать руки кодеру, которую ее делал. После успешной отправки надо уничтожать секретное число. | |
|
|
|
|
|
|
|
для: BinLaden
(06.06.2008 в 12:37)
| | Программирование и инквизиция, понятия несовместимые, лучше без крови.) А усложнить лайф для спамера конечно можно, но ведь не всегда есть хорошо ставить капчу - нужен некий компромисс, между боязнью роботов и лишней головной болью для клиента. Согласитесь, что ситуации с отправкой письма могут быть разные, и излишяя "капчуризиция всея сайтов" не самый лучший выход зачастую? | |
|
|
|
|
|
|
|
для: sim5
(06.06.2008 в 16:26)
| | Подозревать меня в паранойе не стоит:) Я, как правило, определяю условия появления CAPTCHA. Они зависят от того, прошёл или нет пользователь аутентификацию, какая суммарная активность всех анонимных пользователей и некоторых других условий.
Сама суть в том, что Ваш способ нужен фактически лишь для создания удобства пользователю ( чтобы он не видел вопроса "Отправить POST данные?" в IE и некоторых других браузерах), но всегда должна быть другая защита - на стороне сервера.
Это можно сравнивать, примерно с органичением количества символов для ввода в <input type="text" />. Добавить атрибут "maxlength" желательно, чтобы пользователь понял, до куда его запись будет "обрезана", но любой уважающий себя разработчик добавит проверку/обработку полученной строки на сервере. | |
|
|
|
|
|
|
|
для: BinLaden
(06.06.2008 в 18:58)
| | Ну про проверку на стороне сервера и говорить не стоит, это свято. Я о том, что капча, это необходимость для таких операций как, например, регистрация. К примеру, основная масса клиентов с которыми нам приходиться работать, это женщины различного возраста и разными знаниями технологий в интернете (скажем так - его "жаргона"). Естественно у них возникает много вопросов к нам, а обращаясь, они могут допускать множество ошибок, так вот капча в этом случае, это поток излишних вопросов к нам, добавляющих нам головной боли. Можно ведь клиента "поставить на счетчик", используя ту же сессию, можно воспользоваться другими ограничениями, не обременяющими его. Простота общения с клиентом и доверие к нему, это лучше, чем его потеря - не выдержав пыток всевозможных проверок, он просто уйдет. Лучше уж мы удалим послания случайных "идиотов", чем потеряем клиента, тем более, если хочется кому-то, то его никакая капча не остановит.
Я сам иногда посещаю сайты, на которых приходиться заполнять "секретность", причем и капчей то, на некоторых сайтах, назвать это, язык не поворачиватся - просто цифирки текстом, но вот ввести правильно не получается, так уж "кодер" у себя проверяет (видимо арифметику учил плохо). Вот и думаешь, для чего это он ее поставил, если для защиты, то почему так криво, а может быть просто как дань моде? | |
|
|
|
|
|
|
|
для: sim5
(06.06.2008 в 19:26)
| | Не спорю, что некоторые CAPTCHA оставляют желать больше никогда не пересекаться с работами кодера, писавшего тест. Но я не считаю, что это не аргумент в дискуссии, поскольку это их проблемы. Если, например, в России производят ужасные автомобили, то это не значит, что в Германии аналогичная ситуация.
Моя философия такова, что CAPTCHA должна быть абсолютно везде, где есть лазейка для злоумышленников сильно навредить моему серверу или чужому. Если будет нарушена работоспособность чужого сервера или он будет завален спамом с моего - это будет нарушение законодательства.
Но, собстсвенно, судя по Вашему последнему сообщению, мы думаем об одном и том же. | |
|
|
|
|
|
|
|
для: BinLaden
(06.06.2008 в 23:23)
| | При чем тут Captcha к повторной отправке данных? Если не разбираетесь в теме, то хоть не пишите таких громких заявлений. Повторная отправка формы, это зачастую не дело рук злоумышленников, а неправильно организованный прием данных.
Captcha предназначена для запрета размещения автоматических сообщении, а не повторной отправки формы. | |
|
|
|
|
|
|
|
для: TXC
(06.06.2008 в 23:33)
| | Я уже писал выше при чем. Просьба не хамить и разобраться в теме самому. | |
|
|
|
|
|
|
|
для: sim5
(06.06.2008 в 11:35)
| | Просто нужно правильно уметь работать. А именно удалять сессию после отправки письма. А еще лучше удалять после любой отправки форм, чтобы не подбирали число с картинки. | |
|
|
|
|
|
|
|
для: neokortex
(05.06.2008 в 21:07)
| | Я в форуме сделал так:
Сохраняю в сессии случайное число,
При выводе формы передаю через невидимое поле это число.
Проверяю примерно так:
<?
if(!empty($_POST['code']) && $_POST['code']==$_SESSION['code'])
{
// Проверка остальных данных
...
// Если проверка успешна - Запись данных
...
//Если все успешно прошло
$_SESSION['code'] = rand(1000,9999);
}
?>
|
т.е. Каждая форма индивидуальна. и если даже нажать назад и снова отправить. Покажет, что форма нерабочая.
и при F5 ПОСТ-данные повторно не пройдут обработку | |
|
|
|
|
|
|
|
|
для: neokortex
(05.06.2008 в 21:07)
| | Просто удаляешь все переменные после отправки unset() главное чтоб функции правильно выводили сообщение о том что эти переменные не сущ
...die("Вы уже отправили");
|
| |
|
|
|
|
|
|
|
для: OLi
(06.06.2008 в 20:45)
| | unset() освобождает память от переменных только для текущего выполнения скрипта и только на стороне сервера. | |
|
|
|
|
|
|
|
для: BinLaden
(06.06.2008 в 22:58)
| | я так полгогаю: правильное решение - задействовать все возможные методы. | |
|
|
|
|
|
|
|
для: neokortex
(07.06.2008 в 03:13)
| | Вот именно, и такие, которые отвечают вашей текущей задаче. | |
|
|
|