Jump to content
  • 0

Защита от автообновления


rus
 Share

Question

Добрый день!

Подскажите пожалуйста, как кроме header: location можно избавиться от автообновления и добавления инфы в базу?

Есть вот такой код:

<?php
if ($_GET['title'] == '' || $_GET['small_text'] == '' || $_GET['full_text'] == '')
{
echo "<h1>Вы ввели не всю информацию, поэтому она не может быть добавлена в базу!</h1>";
}
else
{
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == 'true')
{
echo "<h1>Информация успешно занесена в базу!</h1>";
}
else
{
echo "<p>Ошибка в скрипте! Информация не добавлена!</p>";
}
}
?>

Если обновить страницу, то инфа опять занесется в базу.

Edited by rus
Link to comment
Share on other sites

Recommended Posts

  • 0

Я не понимаю, зачем так мудрить? Что решается при использовании гетом? Это действительно оправданое требование?

в своей админке работаю с пост-формами

при отправке скрипт

a) проверяет корректность данных

б) если данные некорректны выдает инфу что именно не так, подставляя значения в форму

в) если корректны - в базу (если не вставилось - сообщение об ошибке

u) и header("Location: ?s={$_POST['s']}&ok"); - перенаправление на ту же страницу избавляет от переменных пост (но данные в форму вставляются уже из базы по переменной s строки записи в базе) + маркер &ok в урле, что все ок для спокойствия души

Link to comment
Share on other sites

  • 0
Я не понимаю, зачем так мудрить? Что решается при использовании гетом? Это действительно оправданое требование?

в своей админке работаю с пост-формами

при отправке скрипт

a) проверяет корректность данных

б) если данные некорректны выдает инфу что именно не так, подставляя значения в форму

в) если корректны - в базу (если не вставилось - сообщение об ошибке

u) и header("Location: ?s={$_POST['s']}&ok"); - перенаправление на ту же страницу избавляет от переменных пост (но данные в форму вставляются уже из базы по переменной s строки записи в базе) + маркер &ok в урле, что все ок для спокойствия души

С постом я бы справился худо бедно, мне просто не хочется использовать несколько файлов для каждой операции.

Представь себе что помимо занесения в бд данных, есть еще их обновление и удаление, что ж мне теперь множить на каждую операцию файлы?

UPD: - можно было бы конечно и в одном файле обрабатывать данные, но проблема в том, что переменные одинаковые... хотя их конечно можно и изменить, либо как-то идентифицировать... вобщем уже чайник кипит. B)

З.Ы. вот как-то так получилось, но срабатывает через раз, а именно:

нажал сабмит - данные занеслись,

нажал F5 - показал ошибку,

опять нажал обновить - данные опять занеслись... и так в цикле :)

<?php
if (!isset($_SESSION['flag']) || $_SESSION['flag']==false) {
if ($_GET['title'] == '' || $_GET['small_text'] == '' || $_GET['full_text'] == '')
echo 'нет данных';
$_SESSION['flag'] = true;
}
else
{
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
echo "<h1>Информация успешно занесена в базу!</h1>";
$_SESSION['flag']=false;
}
?>

Edited by rus
Link to comment
Share on other sites

  • 0
Вобщем твой вариант не пашет, что я не так делаю?

Ошибку выводит что нет данных, но при этом все равно заносит инфу в бд.

$_SESSION['flag']=false;
if ($_SESSION['flag']==false)
{
if ($_GET['title'] == '' || $_GET['small_text'] == '' || $_GET['full_text'] == '')
echo 'нет данных';
$_SESSION['flag']=false; //Оно у тебя по условию тут и так false зачем присваивать ?

//да и вообще к чему ты это ? а если у тебя у формы нет но флаг = true ? то это условие не сработает. Продумай логику!!!
}

if (!$_SESSION['flag']==true) //Второй раз спрашивать не надо если первое условие не верно, то верно второе, соответственно ставим ELSE
{
//Если flag = true то как раз мы не добавляем в базу потому что это маркер того что уже добавили в этой сессии
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
{
echo "<h1>Информация успешно занесена в базу!</h1>";
$_SESSION['flag']=true;
}
}
else
{
echo "<h1>Ошибка в скрипте! Информация не добавлена!</h1>";
//Не понял род ошибки ?
}

Буду пробовать другие варианты...

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

Edited by LunatiK
Link to comment
Share on other sites

  • 0
С постом я бы справился худо бедно, мне просто не хочется использовать несколько файлов для каждой операции.
так и с постом это легко делается: в гет не забываем подсовывать переменные, по которым определяется операция

header("Location: ?s={$_POST['s']}&action=edit&ok"); и т.п.

т.е. разделите, что постом, что гетом передаете, можно и одновременно, ведь никто не мешает прописать

<form name="form" method="post" enctype="multipart/form-data" action="">

а действие вешать на ссылки (сколько действий - столько ссылок)

<a href='java script:form.submit();' onclick='form.action="?a=s&action=edit";'>

Link to comment
Share on other sites

  • 0
С постом я бы справился худо бедно, мне просто не хочется использовать несколько файлов для каждой операции.

Представь себе что помимо занесения в бд данных, есть еще их обновление и удаление, что ж мне теперь множить на каждую операцию файлы?

а развязку выборку мы сделать при этом не можем в одном файле обработчике ? что мешает ? передал параметром дополнительным что ты с данными хошь сделать, а скрипт тебя понял и сделал :)

UPD: - можно было бы конечно и в одном файле обрабатывать данные, но проблема в том, что переменные одинаковые... хотя их конечно можно и изменить, либо как-то идентифицировать... вобщем уже чайник кипит. B)

Не босякуй успокойся, куда тебе торопится ? всёж просто, определись с идеей и доделай её не понравится сделаешь по другому.

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

Link to comment
Share on other sites

  • 0
а развязку выборку мы сделать при этом не можем в одном файле обработчике ? что мешает ? передал параметром дополнительным что ты с данными хошь сделать, а скрипт тебя понял и сделал :)

Не босякуй успокойся, куда тебе торопится ? всёж просто, определись с идеей и доделай её не понравится сделаешь по другому.

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

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

Если форма заполнена - все тоже самое, при каждом обновлении страницы, выводятся: не обновлять и информация добавлена, при этом соответственно инфа добавляется в бд так же через раз.

<?php
if (!isset($_SESSION['flag']) || $_SESSION['flag']==false) {
if (empty($_POST['title']) || empty($_POST['small_text']) || empty($_POST['full_text'])){
echo 'нет данных';
}
else
{
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
{
echo '<h1>Информация успешно занесена в базу!</h1>';
}
}
$_SESSION['flag'] = true;
}
else{
echo 'Не обновлять!';
$_SESSION['flag'] = false;
exit();
}
?>

Link to comment
Share on other sites

  • 0

С подобной ситуацие столкнулся когда писал опросник.

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

Поэтому вариант с сесиями, на мой взгляд, не решит всех проблем.

Edited by CoDy
Link to comment
Share on other sites

  • 0
С подобной ситуацие столкнулся когда писал опросник.

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

Поэтому вариант с сесиями, на мой взгляд, не решит всех проблем.

Не путайте куки и сессии!!! Сессиии хранятся на сервере, а куки у клиента !!!

Rus, я так и не понял что ты там в последнем посту спрашивал.

нам (всмысле вам :) ) нужно чтоб: 1. небыло пустых полей 2. чтоб небыло повторно отправленной формы:

Логика тут:

if (empty($_POST['title']) || empty($_POST['small_text']) || empty($_POST['full_text'])){ echo 'нет данных';}
elseif ($_SESSION['flag'] == false) {
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
$_SESSION['flag'] = true;
} else {Echo "Данные уже добавлялись!!!";}

не тестил, но вроде логически верно. перед тем как копировать, почитайте и разберитесть что куда

Link to comment
Share on other sites

  • 0
Rus, я так и не понял что ты там в последнем посту спрашивал.

нам (всмысле вам B) ) нужно чтоб: 1. небыло пустых полей 2. чтоб небыло повторно отправленной формы:

Логика тут:

if (empty($_POST['title']) || empty($_POST['small_text']) || empty($_POST['full_text'])){ echo 'нет данных';}
elseif ($_SESSION['flag'] == false) {
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
$_SESSION['flag'] = true;
} else {Echo "Данные уже добавлялись!!!";}

не тестил, но вроде логически верно. перед тем как копировать, почитайте и разберитесть что куда

Да, именно так и надо сделать.

Спасибо, обязательно почитаю, если возникнут вопросы - напишу, хорошо?

Ещё один совет: для отладки добавь условие с session_destroy() чтоб можо было нормально работать, всмысле при нужде обнулять и начинать сначало.

Разрушение сессии точно не нужно, так как разлогинивает сразу же и выбрасывает на индекс. :)

Link to comment
Share on other sites

  • 0
Не путайте куки и сессии!!! Сессиии хранятся на сервере, а куки у клиента !!!

А я и не путаю.

Сессия - файл с данным, который хранится на сервере. Сколько поситителей Вашего сайта , столько и таких файлов. Сопоставления пользователя и файла, в котором храниться его сессионные данные, осуществляется посредством установки кука с именем PHPSESSID(по defoult настройкам), при вызове функции session_start().

Если сеанс связи с сайтом будет происходить через браузер в котором отключены куки то о таком механизме как сессии нужно забыть: нет кука - нет возможности определить файл с данными сессии для данного сеанса

Edited by CoDy
Link to comment
Share on other sites

  • 0
А я и не путаю.

Сессия - файл с данным, который хранится на сервере. Сколько поситителей Вашего сайта , столько и таких файлов. Сопоставления пользователя и файла, в котором храниться его сессионные данные, осуществляется посредством установки кука с именем PHPSESSID(по defoult настройкам), при вызове функции session_start().

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

да ? :) что-то я в жизни своей упустил. но даже если всё это правда ,человеку с отключёнными куками тогда делать в интернете нечего, он не где не сможет авторизоваться, я таких людей не видел и не встречал. куча сервисов в интернете для них недоступна.

P.S. Пойду читать доки, и подтверждать для себя сказанное вами. (самнения ещё пока остались)

CoDy, признаю свои провалы в знаниях.

Link to comment
Share on other sites

  • 0

Немного покопавшись, понял что надо еще немного внести изменений.

Дело в том, что таким образом добавится инфа только один раз, а последующая инфа с другими значениями пришедшими из той же формы уже не добавятся, вот... в связи с этим, пришла такая идея:

присваивать именно этой сессионной переменной случайным образом rand(); либо srand(); айди и проверять, если после обновления страницы айди изменился, то хз... что-то надо сделать.... а вот что, ума не приложу. :)

Edited by rus
Link to comment
Share on other sites

  • 0
Немного покопавшись, понял что надо еще немного внести изменений.

Дело в том, что таким образом добавится инфа только один раз, а последующая инфа с другими значениями пришедшими из той же формы уже не добавятся, вот... в связи с этим, пришла такая идея:

присваивать именно этой сессионной переменной случайным образом rand(); либо srand(); айди и проверять, если после обновления страницы айди изменился, то хз... что-то надо сделать.... а вот что, ума не приложу. :)

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

Тогда предлагаю обратить внимание на сообщение #19

Int, в нём предлагает использовать функцию времени после каждой отправки в базу и выдерживать интервал, т.е. если прошло с последнего поста меньше n-секунд, то сидим ждём. если больше, то всё нормально.

Хотя если ты подробно опишешь про свои данные и их назначение может можно будет придумать и ещё что-нибудь

тупо: если кликать не вломак:

<a href="?add=new">Хочу ещё добавить</a>

<?
if ($_GET['add']=="new") {$_SESSION['flag'] = false;}
?>

и как новенькая ...

Link to comment
Share on other sites

  • 0
Хотя если ты подробно опишешь про свои данные и их назначение может можно будет придумать и ещё что-нибудь

Хех, да тут все просто. Эта форма для создания нового раздела.

Из титла будет формироваться страница.html (путем преобразования русских в латиницу без модреврайт) + заголовок + название раздела, а краткий и полный тексте это содержание контента.

Link to comment
Share on other sites

  • 0
человеку с отключёнными куками тогда делать в интернете нечего

Согласен. Только с одной поправкой: "Нормальному" человеку.

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

Обсуждаемая тут тема, как мне кажется, больше относится к безопасности создаваемого кода.

Link to comment
Share on other sites

  • 0
Согласен. Только с одной поправкой: "Нормальному" человеку.

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

Обсуждаемая тут тема, как мне кажется, больше относится к безопасности создаваемого кода.

да , безопастность ... но мы то можем это проверить прочитав переменную в куках и сравнить её с реальной сессией. так что это всё фантазии, но не бесполезные :)

Хех, да тут все просто. Эта форма для создания нового раздела.

Из титла будет формироваться страница.html (путем преобразования русских в латиницу без модреврайт) + заголовок + название раздела, а краткий и полный тексте это содержание контента.

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

Link to comment
Share on other sites

  • 0
а зачем тогда база ? для редактирования статичных страниц ? тогда в базе полюбому должно быть это уникальное имя, соответственно при добавлении проверяй: либо наличие файла с именем , либо наличия записи в базе

Да, к стати верное замечание! :)

Пробовал вот так:

elseif ($_SESSION['flag'] == false) {
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text') WHERE `title`='{$_SESSION['flag']}'");
if ($result == true)
echo '<h1>Информация успешно занесена в базу!</h1>';
$_SESSION['flag'] = true;
}

Не то... все равно пишет что данные уже добавлялись.

WHERE `title`='{$_SESSION['flag']}'

Может неправильный запрос?

Edited by rus
Link to comment
Share on other sites

  • 0

В приведённом куске не видно при каких обстаятельствах у тебя выводит сообщение что «данные уже добавлялись»

"INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text') WHERE `title`='{$_SESSION['flag']}'"

бред какой-то , MYSQL ругаться должен

ВЫБРАТЬ что-то из ТАБЛИЦЫ ГДЕ (условие)

или

ОБНОВИТЬ в ТАБЛИЦЕ УСТАНОВИТЬ поле=значение ГДЕ (условие)

Но никак не логично

ДОБАВИТЬ В ТАБЛИЦУ (поля) ЗНАЧЕНИЯ (значение) ГДЕ ... У нас нету Где, мы её ещё не создали

Link to comment
Share on other sites

  • 0
бред какой-то , MYSQL ругаться должен

Да, действительно бред. Не ругается B)

Пробовал так:

<?php
$HTTP_SESSION_VARS['flag'];
if (empty($_POST['title']) || empty($_POST['small_text']) || empty($_POST['full_text'])){
echo 'нет данных';
}
elseif ($_SESSION['flag'] == false) {
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
echo '<h1>Информация успешно занесена в базу!</h1>';
$_SESSION['flag'] = true;
}
else {
$query = mysql_query ("SELECT title FROM pages WHERE title='{$_SESSION['flag']}' LIMIT 1");
if ($query == true)
$_SESSION['flag'] = false;
echo 'Данные уже добавлялись!!!';
}
?>

Так же, через раз: то заносит инфу в бд, то выдает ошибку - Данные уже добавлялись.

З.Ы. я еще не надоел? Нутром чую что я на правильном пути, но пока не доходит до меня. :)

Link to comment
Share on other sites

  • 0
Да, действительно бред. Не ругается :)

Пробовал так:

<?php
$HTTP_SESSION_VARS['flag']; // Это чё за атавизм ? php3 ? да и смысл какой в этом движении ?
//8<—-Вырезанно как лишнее—-8<—
$query = mysql_query ("SELECT title FROM pages WHERE title='{$_SESSION['flag']}' LIMIT 1"); // а в title разве у тебя $_SESSION['flag'] заносится ? и поле в таблице boolen ? и для чего {} <- эти скобки ?
if ($query == true)
$_SESSION['flag'] = false;
echo 'Данные уже добавлялись!!!';
}
?>

Так же, через раз: то заносит инфу в бд, то выдает ошибку - Данные уже добавлялись.

З.Ы. я еще не надоел? Нутром чую что я на правильном пути, но пока не доходит до меня. B)

Конца пока не вижу B) но тебе повезло B) я ещё пока добрый

Link to comment
Share on other sites

  • 0
$HTTP_SESSION_VARS['flag'];

это так, на всякий случай, хотя наверное можно и без регистрации. B)

//8<—-Вырезанно как лишнее—-8<—

вот тут не понял, почему лишнее?

$query = mysql_query ("SELECT title FROM pages WHERE title='{$_SESSION['flag']}' LIMIT 1");

тут нужно просто понимание, а я понимаю это так:

select - выбрать, title - поле тайтл, from pages - из таблицы пейджес, WHERE title - где тайтл сравнивается с сессионной переменной flag.

Можешь разъяснить что не так?

UPD:

на сколько я понял, запрос должен быть примерно таким?

SELECT title FROM pages WHERE title='$title'

Добавил еще:

Фуф... разобрался наконец то, решил использовать пример Int , получилось вот так:

<?php
if (empty($_POST['title']) || empty($_POST['small_text']) || empty($_POST['full_text'])) {
echo '<h1>Вы должны заполнить все поля!</h1>';
exit();
}
if (isset($_SESSION['flag']) && (time()-$_SESSION['flag'] < 15)) {
echo '<h1>Защита от случайного обновления!</h1>';
}
else {
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
echo '<h1>Информация успешно занесена в базу!</h1>';
$_SESSION['flag']=time();
}
?>

Не знаю, но может кому пригодится B)

Говорю спасибо всем кто помогал, а особенно Lunatiku и Int :)

Edited by rus
Link to comment
Share on other sites

  • 0
это так, на всякий случай, хотя наверное можно и без регистрации. :)

есть функция session_register(), там для регистрации через запятую и перечисляешь свои переменные.

вот тут не понял, почему лишнее?

Это чтоб много букв не городить убрал, лишнее , в смысле для рассмотрения.

Фуф... разобрался наконец то, решил использовать пример Int , получилось вот так:

Молодец!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy