Forum. MyNuke.ru
Forum. MyNuke.ruСообщения за сегодняПерсональные сообщения

Навигация  
Вернуться   Forum. MyNuke.ru > Учимся > PHP&MySQL
Ник
Пароль
Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Alie вне форума      Старый Перезапись данных при нажатии Refresh... #1  
Alie
Участник+
Регистрация: 20.03.2006
Сообщения: 153


Пожаловаться на это сообщениеОтветить с цитированием

Посмотреть профиль Отправить персональное сообщение для Alie Найти все сообщения от Alie Добавить Alie в список друзей  
25.10.2006, 15:15

При нажатии на refresh на странице оператора данные перезаписываются в БД...

Написала модуль с формой записи данных в БД. Принцип работы следующий:
Код:
function main(){ global $module_name; echo "<form action='modules.php?name=$module_name&op=operator' method=POST> <input type=TEXT VALUE='$var1' name=var1> <input type='submit' name='submit' VALUE='Submit'> "; } function operator ($var1){ global $prefix,$var1; $var1 = strip_tags($var1); $result=$db->sql_query("insert into " . $prefix . "_table values ('$var1')"); if ($result){ echo "Your $var1 has been saved into database"; }else{ echo "Attention! Your $var1 wasn't saved"; } switch($op) { case "default": main(); break; case "operator": operator($var1); break; }


Всё просто замечательно работает кроме одного ньюанса: когда пользователь нажимает refresh после оповещения оного о том, что его переменная была занесена в БД запись происходит по-новой! и в новую строку таблицы. Другими словами, за пять минут зловредный пользователь может конкретно засорить базу данных.
Решила я во избежание повторной записи добавить команду sleep в код функции оператора:
Код:
function operator ($var1){ global $prefix,$var1; $var1 = strip_tags($var1); $result=$db->sql_query("insert into " . $prefix . "_table values ('$var1')"); if ($result){ echo "Your $var1 has been saved into database"; sleep(30); }else{ echo "Attention! Your $var1 wasn't saved"; }

не помогло. Вместо переадресации выдаёт Page cannot be displyed хоть в БД всё записывается. Но выход не очень....

Переадресация через n время тоже не поможет - нужно чтоб пользователь успел прочитать оповещение о том, что $var1 записан и при этом не нажал refresh - способ отпал.

Пробовала прибегнуть проверке заполнения полей формы и их проверкой в операторе:
Код:
function operator ($var1){ global $prefix,$var1; if(empty($var)){ echo "Error! Empty row!"; }else{ $var1 = strip_tags($var1); $result=$db->sql_query("insert into " . $prefix . "_table values ('$var1')"); //Очищаем поле ввода $var1 unset = ($var1); } if ($result){ echo "Your $var1 has been saved into database"; }else{ echo "Attention! Your $var1 wasn't saved"; }


Всё равно записывает, хотя поле по идее должно очистится ещё до того, как выводится оповещение об удачной записи $var1 в БД....

Как решить этот вопрос?
Заранее большое спасибо за внимание и помощь!

P.S. На данный момент я использую дополнительную функцию для решения проблемы:

Код:
function success(){ global $var1, $module_name; echo "Your $var1 has been saved into database"; }

А так-же добавила в операторе автоматическую переадресацию пользователя в новую функцию строкой
Код:
header ('location: modules.php?name=$module_name&op=success');

и соответственно вписала новый case в switch

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

Может кто подскажет метод без дополнительных функций?

Последний раз редактировалось Alie, 25.10.2006 в 15:47.

Alexander-V-Sh вне форума      Старый #2  
Аватара для Alexander-V-Sh
Alexander-V-Sh
Бывалый
Регистрация: 19.04.2006
Сообщения: 352


Пожаловаться на это сообщениеОтветить с цитированием

Посмотреть профиль Отправить персональное сообщение для Alexander-V-Sh Посетить домашнюю страницу Alexander-V-Sh Найти все сообщения от Alexander-V-Sh Добавить Alexander-V-Sh в список друзей  
25.10.2006, 18:19

Я эту проблему решал через header location. Но там перебраска стоит в функцию, где отображаются все записи, поэтому писать "Ваше сообщение добавлено" не было не обходимости, и так увидит.
Цитата Другими словами, за пять минут зловредный пользователь может конкретно засорить базу данных.

Обновляя страницу можно, но можно и заново писать, т.е. жать не рефлешь, а назад и Ок, назад и ОК. Эффект пачти тот же.

Поэтому тут лучше сделать перед записью в базу проверку на IP (естессно записывать IP каждого отправителя) или сделать запись в куки.
Тут в зависимости от того что отправляет пользователь и как часто ему разрешено это делать.

Комментарии сделаны так у меня:
//Запрашиваем из базы IP последнего отправителя для данной статьи
$result4 = $db->sql_query("SELECT sid, date, host_name FROM ".$prefix."_comments WHERE (sid='$sid') ORDER BY date DESC LIMIT 0,1");
$row4 = $db->sql_fetchrow($result4);
$sidf = intval($row4['sid']);
$datef = $row4['date'];
$ipf = $row4['host_name'];

$ip = $_SERVER["REMOTE_ADDR"];//определяем IP того кто отправляет сейчас

$post = time()-3600;//Уточняем время
$post2 = Date("Y-m-d H:i:s", $post);
if (($sidf=$sid) AND ($ipf=$ip) AND ($datef>$post2)) {
$result = 6;
$look1 = "Вы уже оставили комментарий к этой статье.";
}

Тоесть подрят нельзя отправить 2 комментария подрят. Можно спустя время, или после того, как то другой напишит комментарий.
Если нужно, чтобы всего 1 раз с этого IP отсылалось, то запросить в базу IP отправителя, и если там такое есть, то отказ.

Варианты, где можно посмотреть запись по кукам - Модуль опросов (точно незнаю) или рейтинг к статьям (тут точно есть).

Alie вне форума      Старый #3  
Alie
Участник+
Регистрация: 20.03.2006
Сообщения: 153


Пожаловаться на это сообщениеОтветить с цитированием

Посмотреть профиль Отправить персональное сообщение для Alie Найти все сообщения от Alie Добавить Alie в список друзей  
25.10.2006, 18:32

Ха! Действительно голосование стоило-бы поковырять
Правда там один глюк есть - накрутить голоса можно очень просто ;) но это не столь важно. Пошла делать.

Alie вне форума      Старый #4  
Alie
Участник+
Регистрация: 20.03.2006
Сообщения: 153


Пожаловаться на это сообщениеОтветить с цитированием

Посмотреть профиль Отправить персональное сообщение для Alie Найти все сообщения от Alie Добавить Alie в список друзей  
27.10.2006, 02:30

С IP и вправду проблем никаких не возникло, а вот со временем - глюк
Код:
function main(){ global $module_name; //Записываем timestamp $p_time = time(); echo "<form action='modules.php?name=$module_name&op=operator' method=POST> <input type=TEXT VALUE='$var1' name=var1> //Добавляем переменную в форму <input type='hidden' name='p_time' value='$p_time'> <input type='submit' name='submit' VALUE='Submit'> "; }

Код:
operator ($var1){ global $prefix,$var1; //Устанавливаем flood контроль $p_aviable = time()-60; //Если не прошло 60 секунд - выдаёт ошибку Error! Time flood control! if($p_aviable < $p_time){ echo "Error! Time flood control!"; }else{ $var1 = strip_tags($var1); $result=$db->sql_query("insert into " . $prefix . "_table values ('$var1')"); } if ($result){ echo "Your $var1 has been saved into database"; }else{ echo "Attention! Your $var1 wasn't saved"; }

В БД timestamp записывается, а вот flood контроль не работает... $var1 одинаково успешно заносится хоть по прошествию 60 -и секунд, хоть до этого периода.

Alexander-V-Sh вне форума      Старый #5  
Аватара для Alexander-V-Sh
Alexander-V-Sh
Бывалый
Регистрация: 19.04.2006
Сообщения: 352


Пожаловаться на это сообщениеОтветить с цитированием

Посмотреть профиль Отправить персональное сообщение для Alexander-V-Sh Посетить домашнюю страницу Alexander-V-Sh Найти все сообщения от Alexander-V-Sh Добавить Alexander-V-Sh в список друзей  
27.10.2006, 14:02

function operator ($var1, $p_time) - добавить время в функцию.
global $prefix; - тут вар не нужен, если она не глобальная
Должно помоч.

А вообще, лучше записывайте в БД и IP и время.
Эта проверка если и поможет, так только от обновления страницы. А флудить можно и подругому.
Вернул страницу назад - нажал Субмит, назад и Субмит.
За минут 5-10 можно с 500 записей сделать.
---
Еще как совет - включите отображение Notice'ов. Придется помучаться (ибо их полно там). Но зато все ошибки будете видеть на экране. Какая переменная не определена и т.д.

Последний раз редактировалось Alexander-V-Sh, 27.10.2006 в 14:21.

Alie вне форума      Старый #6  
Alie
Участник+
Регистрация: 20.03.2006
Сообщения: 153


Пожаловаться на это сообщениеОтветить с цитированием

Посмотреть профиль Отправить персональное сообщение для Alie Найти все сообщения от Alie Добавить Alie в список друзей  
27.10.2006, 17:13

зделала всё как ты пишешь... просто в примере ошибок наделала:) бывает...

вывожу суть проблемы:

В этом варианте запись происходит вне зависимости от установленого лимита... (Обратите внимание на знак "меньше").
Код:
$aviable_t = time()-60; $sql = "SELECT id, uip, post_t FROM ".$prefix."_ordering ORDER BY id DESC LIMIT 0 , 1"; $result2 = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result2)) { $xip = filter($row['uip'], nohtml); $xtime = intval($row['post_t']); if($aviable_t < $xtime AND $xip == $uip){ echo "Error! Flood Control!"; }


Здесь - не записывает вовсе (Обратите внимание на знак "больше"):
Код:
$aviable_t = time()-60; $sql = "SELECT id, uip, post_t FROM ".$prefix."_ordering ORDER BY id DESC LIMIT 0 , 1"; $result2 = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result2)) { $xip = filter($row['uip'], nohtml); $xtime = intval($row['post_t']); if($aviable_t > $xtime AND $xip == $uip){ echo "Error! Flood Control!"; }


Причём по отдельности оба условия работают:

Код:
if($aviable_t < $xtime){ echo "Error! Time limit"; }


Код:
if($xip == $uip){ echo "Error! Same IP adress"; }

Последний раз редактировалось Alie, 27.10.2006 в 20:08.

Alie вне форума      Старый #7  
Alie
Участник+
Регистрация: 20.03.2006
Сообщения: 153


Пожаловаться на это сообщениеОтветить с цитированием

Посмотреть профиль Отправить персональное сообщение для Alie Найти все сообщения от Alie Добавить Alie в список друзей  
29.10.2006, 15:10

Всем спасибо! Разобралась до конца сама

Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу сделать бекап базы данных Statist Установка 1 04.06.2006 18:34
незащищенная передача данных Jay Безопасность 2 19.12.2005 20:06


Часовой пояс GMT +4, время: 19:07.


На Верх
Рейтинг@Mail.ru