Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Еще раз безопасность и проверка даты/времени, Юзеры как-то обходят мою защиту... 
:(
    Опции темы
KonstRuctor
Дата 23.12.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Привет всем!
Есть форма загрузки фотки, можно загружать фото только вошедшим юзерам, и только 1 раз в 24 часа.
Что-то в моем скрипте есть сбой, который позволяет эту защиту обойти.
Как? Не пойму. Где копать: в скрипте проверки, али вообще в классе авторизации?
На локальной машине, да и на реальном сайте мне обойти скрипт не удается -- работает верно.
А вот некоторые юзеры обходят, однако...
Приведу пока мой скрипт проверки, может дело в нем. Итак:
Код

if ( $security->is_auth ( ) ) // если юзер вошел. считаем, что класс работает нормально
{
// в базе post_date -- дата добавления фотки, хранится в виде DATETIME
// $user_id возвращает класс авторизации. считаем, что класс работает нормально
$query = "SELECT MAX(post_date) as lastdate
                 FROM table
                 WHERE user_id = '". $user_id ."' ";
$res6 = $sql->query($query);
$data = mysql_fetch_array($res6);
$last_date = $data["lastdate"];
   if ( $last_date )  //в базе есть фотки этого юзера
   {
       $last_add_date = strtotime($last_date);   //фото добавили в базу, секунды
       $now = time();                                           //метка времени для текущей даты
       $now_date = date("Y-m-d H:i:s");
       $delta = 60*60*24;                            //дельта в секундах
       $next_add_date = $last_add_date + $delta;       //время добавления следующей фотки в секундах
       $wait = $next_add_date-$now;                  //ждать в секундах
       $wait_hours = $wait/3600;                     //ждать в часах с десятыми
       $wait_hours_floor = floor($wait_hours);       //ждать в часах ближайшее меньшее
       $wait_hours_floor_dec = $wait_hours-$wait_hours_floor;       //ждать -- десятичное
       $wait_plus_minutes = ceil($wait_hours_floor_dec*60);         //ждать -- минуты к часу
       $seconds_from_add = $now-$last_add_date;                     //секунды от добавления

       if ( $seconds_from_add > $delta )
       {
        display_form();  // функция вывода формы добавления новой фотки
       }
       else
       {
        echo "<div><h1>ВНИМАНИЕ!</h1>
                  <p>Можно добавлять не более 1 фото в 24 часа.<br /><br />
                  Ваше последнее фото добавлено: <b>".$last_date."</b><br />
                  Сейчас: <b>".$now_date."</b><br />
                  Новое фото Вы сможете добавить через: <b>".$wait_hours_floor." час. ".$wait_plus_minutes." мин.</b>
                  </p></div>\n";
       }
   }
   else display_form();
}
else getaway();

Где искать ошибку? Спасибо
PM MAIL WWW ICQ   Вверх
Рыжий
Дата 23.12.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: 2
Всего: 20



KonstRuctor, Как-то ты странно дату проверяешь. 
Код

$last_add_date = strtotime($last_date);

Я так понимаю дата хранится в формате varchar/timestamp? Ну это хорошо, преобразовываем его в UNIX-время, а дальше я бы сделал:
Код

$day = time()-86400; //получим время сутки назад 86 400 - секунд в сутках
if ($last_add_date >= $day)  die('Ошибочка'); 

Код писал прямо тут, поэтому могут быть ошибки, но смысл я надеюсь понятен.
PM MAIL ICQ   Вверх
Wolf1994
Дата 23.12.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: 7
Всего: 29



Не вижу сложности в обходе защиты. Если не перезагружать страницу, а кликнуть в браузере на "возврат" / нажать на BackSpace, то форма повторно загрузится из кэша и можно будет закачать ещё одну фотку. Защищать нужно не только форму, но и е обработку.

Это сообщение отредактировал(а) Wolf1994 - 23.12.2008, 16:42
PM MAIL WWW   Вверх
KonstRuctor
Дата 23.12.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



У меня такой алгоритм:

1) Юзер вошел под своим именем? -- показываем форму
2) Все поля заполнены верно? -- аплоад фотки + запись в базу (дата, имя файла, user_id, название фотки)
3) запись в базу успешная?
Код

if ( $result )
{
header("Location: /thankyou.php?e=foto_added");
exit(0);
}

В файле thankyou.php мы говорим юзеру "спасибо" и кидаем его автоматом к его фоткам:
Код

echo "спасибо";
echo "<script Language=\"JavaScript\">setTimeout(\"document.location='/user_fotos.php'\", 4000);</script>";


ВОПРОС: при такой логике можно ли нажатие кнопки BACK браузера добавлять 10000 фоток в обход моей защиты?
PM MAIL WWW ICQ   Вверх
Wolf1994
Дата 23.12.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: 7
Всего: 29



Если непосредственно при upload'e не проверяется дата, то можно загрузить сколько угодно фотографий.
PM MAIL WWW   Вверх
KonstRuctor
Дата 23.12.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Вот ведь Ешкин кот
Реально выручил. Спасибо!
Я думаю применить пери проверке метод, озвученный Рыжим.
У него как-то короче все выходит.
Лады. Спасибо!
PM MAIL WWW ICQ   Вверх
Рыжий
Дата 23.12.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: 2
Всего: 20



Цитата(KonstRuctor @ 23.12.2008,  19:21)
У меня такой алгоритм:

1) Юзер вошел под своим именем? -- показываем форму
2) Все поля заполнены верно? -- аплоад фотки + запись в базу (дата, имя файла, user_id, название фотки)
3) запись в базу успешная?
Код

if ( $result )
{
header("Location: /thankyou.php?e=foto_added");
exit(0);
}

В файле thankyou.php мы говорим юзеру "спасибо" и кидаем его автоматом к его фоткам:
Код

echo "спасибо";
echo "<script Language=\"JavaScript\">setTimeout(\"document.location='/user_fotos.php'\", 4000);</script>";


ВОПРОС: при такой логике можно ли нажатие кнопки BACK браузера добавлять 10000 фоток в обход моей защиты?

Я бы сделал:
1) Юзер залогинился успешно? -- показываем форму
2) Все поля заполнены верно?  -- идем к шагу 3, нет - заставляем заполнить все верно
3) Проверяем, имеет ли пользователь право добавлять фото? -- Если да: аплоад фотки + запись в базу (дата, имя файла, user_id, название фотки)
3) запись в базу+загрузка фото успешная? 
Далее - как у тебя.
PM MAIL ICQ   Вверх
KonstRuctor
Дата 24.12.2008, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



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

Кстати, как я ни старался, ни ИЕ6,7, ни Оперой, Ни ФФ3, ни Хромом, ничем не смог моделировать
нажатие кнопки BACK браузера!! Ни на локальном компе, ни на реально работающем сайте!
Как говорит Wolf1994, можно загружать сколько угодно... ?
Не выходит! Нажимаю Back, форму показывает заполненную, все -- кроме имени файла, само собой.
Выбираем новый файл, жмем ОК, тут же скрипт выдает ошибку -- тот самый экран, на котором говорится сколько ждать.
Ничего не понимаю.

НО спасибо, я сделал вторую проверку на дату -- там, где у меня идет стандартная проверка заполненности полей.
Теперь враг не пройдет!

Такой алгоритм, как ты, Рыжий, предлагаешь мне замутить уже сложно...
Там уже столько if -- else... вошел-нет, забанен-нет, есть фото в базе-нет, если есть, то свежие ли-нет... возникли ошибки-нет
Брррр. Перелопачивать скрипт уже неохота!

Спасибо. Тема почти закрыта, только интересно, что ж у меня кнопка BACK не пашет.
PM MAIL WWW ICQ   Вверх
Wolf1994
Дата 24.12.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: 7
Всего: 29



Цитата(KonstRuctor @  24.12.2008,  04:34 Найти цитируемый пост)
Спасибо. Тема почти закрыта, только интересно, что ж у меня кнопка BACK не пашет. 

F5 ещё даёт схожий результат, тогда "back" не нужен )
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0798 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.