Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как реализовать систему бан'а пользователя?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
skk
Отправлено: 11 Февраля, 2012 - 09:59:59
Post Id


Новичок


Покинул форум
Сообщений всего: 37
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




День добрый, столкнулся с такой проблемой:
Нужно реализовать систему бана для пользователя на определенный срок и unlim бан ( т.е. навсегда ).

Подскажите пожалуйста как это можно реализовать? Желательно подробнее про логику "срока бана". Или если есть возможность залинкуйте на какой-нибудь мануал. Заранее благодарен.
 
 Top
Wolf Bloody
Отправлено: 11 Февраля, 2012 - 12:23:10
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




Реализовать не сложно. Допустим у тебя пользователь N залочися. Ты в БД в какую нить строчку с его ID ставишь время до которого он залочен, или ставишь какой нибудь параметр типо forever. И потом пишешь скрипт который будет по базе бегать и смотреть данный параметр. Если время подошло, чистишь эту ячейку и он опять в игре, если стоит forever то оставляешь. И данный скрипт настраиваешь на автозапуск 2 раза скажем в день, сутра и вечером. Я так думаю. НО это чисто мое ИМХО!
 
 Top
OrmaJever
Отправлено: 11 Февраля, 2012 - 12:45:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




В бд в таблице с пользователями добаить одно timestamp поле (`bane` например), изначально при регистрации пользователей в это поле пишется NULL, если пользователю кидают бан то в это поле писать дату окончания бана, Ну и на каждой стрнице куда заходит этот пользователь проверть есть ли у него бан ( `bane` > NOW() ).
Это примерная схема.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
skk
Отправлено: 11 Февраля, 2012 - 12:51:04
Post Id


Новичок


Покинул форум
Сообщений всего: 37
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Спасибо.
Я просто с автозапуском плохо знаком. Можно ли сделать следующее:
Пользователь логинится - и проверяется его дата бана, если она прошла - то мы чистим бан, а если нет, то делаем кое-что другое?
 
 Top
DlTA
Отправлено: 11 Февраля, 2012 - 14:06:38
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




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

правла от понятия "пожизненный" бан лучше отказаться, заменив его сверх долгосрочным.
 
 Top
skk
Отправлено: 14 Февраля, 2012 - 10:49:33
Post Id


Новичок


Покинул форум
Сообщений всего: 37
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




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

в силу каких обстоятельств?)
 
 Top
Zuldek
Отправлено: 14 Февраля, 2012 - 11:12:52
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




skk пишет:
Цитата:
правла от понятия "пожизненный" бан лучше отказаться, заменив его сверх долгосрочным.

в силу каких обстоятельств?)

Ну например хотябы в силу того что придется держать в базе дополнительное поле для бана навсегда. А так вы можете использовать уже существующее поле просто проставив там большое значение.

Опять же не уточнили о каком бане идет речь. В примерах выше показывалась логика бана зарегистрированного пользователя. При этом ничто не помешает ему зарегистрировать новый аккаунт. В этом случае можно включить опцию бана по ip-адресу. Для максимального усложнения жизни забаненому:
1. Прикрываем отдельный Ip или целый диапазон
2. Смотрим принадлежит ли ip прозрачному прокси, если прозрачен - смотрим не забаненный ли ip сидит под ним. Если да, то баним проксю.
3. Если прокся анонимная и непрозрачная, сверяем Ip с доступным нам списком бесплатных прокси (такое умеют делать например форумы на phpbb). Если Ip есть в списке то не пускаем такого пользователя.
4. Если приложение ориентировано на пользователей определенной страны, например РФ, то по Ip отрубаем все остальные. Так вы отрежете доступ к большинству бесплатных прокси, которыми может воспользоваться забаненый юзер.

(Отредактировано автором: 14 Февраля, 2012 - 11:20:04)

 
 Top
OrmaJever
Отправлено: 14 Февраля, 2012 - 11:35:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Zuldek пишет:
Ну например хотябы в силу того что придется держать в базе дополнительное поле для бана навсегда. А так вы можете использовать уже существующее поле просто проставив там большое значение.

Зачем дополнительной поле? (Текущая дата + 100 лет) это не пожизненый? Подмигивание
Вобще так маницуляции с датой в mysql не сложны.
CODE (SQL):
скопировать код в буфер обмена
  1. NOW() /* текущее время */
  2. NOW() + INTERVAL 1 HOURS /* на час вперёд */

что бы например выдать бан на месяц в запросе написать так
CODE (SQL):
скопировать код в буфер обмена
  1. NOW() + INTERVAL 1 MONTHS

Для сравнения всё ещё проще
CODE (SQL):
скопировать код в буфер обмена
  1. UNIX_TIMESTAMP(`date_row`) < NOW()

Ну и конечно же поле должно быть timestamp


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 14 Февраля, 2012 - 12:00:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




OrmaJever пишет:
UNIX_TIMESTAMP(`date_row`) < NOW()

И целых 2 пути к оптимизации:
0) now() ставит крест на кэше запросов
1) по результатам функций индексы не строятся


Datetime или timestamp тип.

OrmaJever пишет:
(Текущая дата + 100 лет) это не пожизненый?

Для timestamp - прям-таки его полное отсутствие Подмигивание


-----
PostgreSQL DBA
 
 Top
OrmaJever
Отправлено: 14 Февраля, 2012 - 12:18:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Мелкий пишет:
Для timestamp - прям-таки его полное отсутствие

ай да Огорчение Ну даже если дать бан по 38 год это целая вечность Улыбка

(Отредактировано автором: 14 Февраля, 2012 - 12:19:45)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB