Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита от автодобавлений
 
 автор: shest   (08.01.2007 в 03:23)   письмо автору
 
 

Подскажите пожалуйста как обработать такую ситуацию: пользователь заполняет форму , вписывает код на картинке и отправляет данные, загружается другая страница с его данными. Теперь, если воспользоваться возвратом браузера назад, то данные в форме те же, тот же код на картинке. Пользователь опять нажимает кнопку и так можно до сотни за минуту добавить.

   
 
 автор: ols   (08.01.2007 в 04:02)   письмо автору
 
   для: shest   (08.01.2007 в 03:23)
 

Такого быть не может. сесия уже должна уничтожится после проверки данных.

   
 
 автор: targa   (08.01.2007 в 04:19)   письмо автору
 
   для: ols   (08.01.2007 в 04:02)
 

>>Такого быть не может. сесия уже должна уничтожится после проверки данных.
Может. Он ни слова не сказал о сессиях.
Браузер послушно повторно отправляет данные, POST или GET неважно (кстати возврат необязательно делать, достаточно обновить страницу - F5), скрипт-обработчик берет и добавляет их.
Можно перед добавлением проверять в таблице наличие записи с такими же параметрами. Если такой записи нет - добавляем, есть - ничего не делаем.

   
 
 автор: Shest   (08.01.2007 в 11:28)   письмо автору
 
   для: targa   (08.01.2007 в 04:19)
 

Это проблематично, тем более что у меня не bd а файлы.
Ещё есть какой- нибудь способ?

   
 
 автор: golovdinov   (08.01.2007 в 12:33)   письмо автору
 
   для: Shest   (08.01.2007 в 11:28)
 

Можно использовать промежуточный файл, в котором будут производиться все действия, как например на форумах VBulletin.
А для надежности можно в него поставить сразу заголовок (header ("Location: ....")) и никакого сообщения не выводить. Если поступить таким образом, то обновляй, не обновляй - ничего не получится, а если вернуться назад, то браузер выдаст страницу с чистой формой =)

   
 
 автор: Shest   (08.01.2007 в 13:22)   письмо автору
 
   для: golovdinov   (08.01.2007 в 12:33)
 

А вот кстати идея: в файле сохранять сессию пользователя и проверять, сколько от текущей сессии было сообщений. Если более напр.2 -запрещать

   
 
 автор: cheops   (08.01.2007 в 14:28)   письмо автору
 
   для: shest   (08.01.2007 в 03:23)
 

Хм... а что он добавляет? Вроде его после авторизации направляют на его личные данные? При этом происходит какая-то регистрация в базе данных?

   
 
 автор: golovdinov   (08.01.2007 в 15:52)   письмо автору
 
   для: cheops   (08.01.2007 в 14:28)
 

Есть еще вариант (правда с БД. может кому пригодится, я сам лично так у себя сделал): когда пользователь добавляет сообщение, добавлять запись в БД с IP пользователя и временем. получается своеобразный "таймер":


CREATE TABLE table_timer (
       time TINYTEXT,
       user_ip TINYTEXT
) TYPE=MyISAM;




<?

$time 
300// время "таймера" в секундах
$ip $_SERVER['REMOTE_ADDR']; // ip адрес пользователя

// Удаляем все записи в которых истек "таймер"
@mysql_query ("DELETE FROM table_timer WHERE time < ". ( time() - $time ));

// Скрипт. добавляющий запись (самый простой пример =)
if ($_POST['text'] != "") {

    
// Проверяем не установлен ли таймер на пользователя
    
$get_timer = @mysql_num_rows (mysql_query ("SELECT * FROM table_timer WHERE user_ip = '$ip'"));
    if (
$get_timer 0) {
                print 
"Вы не можете добавлять соощения так часто!";
                exit ();
    }

     
$add = @mysql_query ("INSERT INTO table_content VALUES ('".$_POST['text']."')");

     if (
$add) {
           print 
"Запись добавлена!";
           
// Добавляем запись в таблицу с "таймером"
           
@mysql_query ("INSERT INTO table_timer VALUES ('".time()."', '$ip')");
     }
}

?>


основной плюс этакого способа - это то что он всегда работает.

   
 
 автор: Shest   (08.01.2007 в 21:46)   письмо автору
 
   для: golovdinov   (08.01.2007 в 15:52)
 

Можно ещё проще


//Инициация сессии
session_start();

Теперь вернуться браузером на страницу не удастся.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования