Поругайте мои мысли (проверка данных)

five

Новичок
Поругайте мои мысли (проверка данных)

Добавляю к сайту сервис "сменить email", вроде сделал, но возник у меня вопрос: а верно ли я сделал?

Когда пользователь хочет сменить email:
1) генерится уникальная строка на основе: md5(id юзер+мыло+"секретная фраза"), "секретная фраза" в url не передается
2) все это впихивается в url и отсылается юзеру письмом, например: /index.php?uid=1&newemail=email@email&secret=md5(id юзер+мыло+"секретная фраза")

При получении такой ссылки проверяем:
1) а заданы ли все параметры, если нет - отлуп
2) проверяем $_GET[secret']==md5($_GET['uid'].$_GET['email']."секретная фраза") - если совпало, пускаем дальше, если нет - отлуп

Могут ли где-нибудь тут быть подводные камни?

Спасибо.
 

rotoZOOM

ACM maniac
1. Если до этого юзер не задал e-mail куда идет письмо?
2. Совсем не обязательно все эти параметры хранить в url. Достаточно только id юзера + hash (секретная фраза), а новый e-mail хранить в БД вместе с uid + hash.
3. У тебя получается сменить e-mail можно введя в URL одну строчку. То есть теоретически кулхацкерам достаточно каким то образом заполучить только эту "секретную фразу", и после этого они махом могут сменить e-mail всем пользователям.
 

five

Новичок
Автор оригинала: rotoZOOM
1. Если до этого юзер не задал e-mail куда идет письмо?
как это не задал. при регистрации мыло обязательный параметр

Автор оригинала: rotoZOOM
2. Совсем не обязательно все эти параметры хранить в url. Достаточно только id юзера + hash (секретная фраза), а новый e-mail хранить в БД вместе с uid + hash.
дергать базу из-за этого... можно конечно, но мои мысли навеяны этой записью http://spectator.ru/technology/web-building/user_registration

Автор оригинала: rotoZOOM
3. У тебя получается сменить e-mail можно введя в URL одну строчку. То есть теоретически кулхацкерам достаточно каким то образом заполучить только эту "секретную фразу", и после этого они махом могут сменить e-mail всем пользователям.
ну если кулхацкер получит доступ к серверу и вытащит эту секретную фразу, то админу навешают таких люлей, что мало не покажется. у нас строгое разделение: админ - админит, а я программлю.
 

confguru

ExAdmin
Команда форума
лучше так... ты же знаешь что посылаешьт :)
/check.php?s=md5(id юзер+мыло+"секретная фраза")

P.S. Я вообще бы сделал хеш никчему не привязанный .. он нужен только
для клика при получении :)
 

kode

never knows best
и ещё, передавай данные постом :3 userid нужно получать из кукиша. Блин такие простые и очевидные вещи даже рассказывать лень.
 

five

Новичок
Автор оригинала: admin
лучше так... ты же знаешь что посылаешьт :)
/check.php?s=md5(id юзер+мыло+"секретная фраза")
P.S. Я вообще бы сделал хеш никчему не привязанный .. он нужен только
для клика при получении :)
а как я юзнаю, на какое мыло юзер хочет сменить старое? т.е. "новое мыло" надо где-то хранить. опять база?

-~{}~ 11.07.08 12:16:

Автор оригинала: kode
и ещё, передавай данные постом :3 userid нужно получать из кукиша. Блин такие простые и очевидные вещи даже рассказывать лень.
наверное я туплю, но как я сформированный url передам постом?
сформированный url пересылается в письме, получив которое, пользователь должен перейти по этому url, т.е. подтвердить "смену мыла"
 

kode

never knows best
неправильный подход. Вы пытаетесь пойти лёгким путём, а лёгкий путь - гемороя путь :)

Правильно было бы сделать например так

Пользователь посылает из формы новый емаил, он пишется в БД id|userid|newemail|activationcode

пользователю приходит письмо:

http://myhost.com/newemail/confirm/[activationcode]/

там он всё и подтверждает

код активации генерится рандомно, например
$activation_code = md5(microtime());
 

five

Новичок
Автор оригинала: kode
неправильный подход. Вы пытаетесь пойти лёгким путём, а лёгкий путь - гемороя путь :)
не всегда так. и да, я пытаюсь пойти легким путем.

Автор оригинала: kode
Правильно было бы сделать например так

Пользователь посылает из формы новый емаил, он пишется в БД id|userid|newemail|activationcode

пользователю приходит письмо:

http://myhost.com/newemail/confirm/[activationcode]/

там он всё и подтверждает

код активации генерится рандомно, например
$activation_code = md5(microtime());
да, согласен. тоже вариант.

спасибо. думаю, что тему можно закрыть, дабы не флудили.
 

kode

never knows best
потому как

$_GET[secret']==md5($_GET['uid'].$_GET['email']."секретная фраза")

ломается брутофорсом раз на два.

Мы регаемся на твоём сайте.
мы знаем свой id и email

мы берём ?secret

и брутофорсим секретное слово сравнивая с полученым хешом. Примерно за неделю при достаточных мощностях секретный ключ получат.
 

five

Новичок
Автор оригинала: kode
потому как

$_GET[secret']==md5($_GET['uid'].$_GET['email']."секретная фраза")

ломается брутофорсом раз на два.

Мы регаемся на твоём сайте.
мы знаем свой id и email

мы берём ?secret

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

confguru

ExAdmin
Команда форума
Не пудрите челу мозги :)

Автор оригинала: kode
потому как

$_GET[secret']==md5($_GET['uid'].$_GET['email']."секретная фраза")

ломается брутофорсом раз на два.

Мы регаемся на твоём сайте.
мы знаем свой id и email

мы берём ?secret

и брутофорсим секретное слово сравнивая с полученым хешом. Примерно за неделю при достаточных мощностях секретный ключ получат.
 

Yuriy_S

-=PHP-Club=-
хороший программист не должен допускать таких возможностей для хацкеров..
имхо, на начальной стадии проектирования механизмов авторизации пользователей/админов необходимо предусмотреть возможность отслеживать подобные вещи и блокировать. По возможности использовать ограничение по IP-адресам/подсетям
 

kode

never knows best
Автор оригинала: Valenok
Извините, при каких таких достаточных мощностях ?
Ботнет на 100 машин устроит?

предположим 16 символов. 44 буквы англ алфавита (большие и маленькие) + 10 цифр = 54 возможных символа.

54^16 = 5227573613485916806405226496 вариантов. Но не факт что прийдётся перебирать все 5227573613485916806405226496 вариантов, результат будет примерно, я думаю, на половине :D

Но и неделя загрузки 24 часовой 100 машин это не хухры мухры. Предположим 100 машин, на каждой машине 100 тредов. Примерное время получения с контролирующей машины + подсчитывание хеша + отправка результата ~ 1 секунда. В секунду в общей сложности будет обрабатыватся примерно 10000 вариантов. за час 36000000. в день 129600000000. за неделю 907200000000.

Ну конечно это всё в теории и ещё я перегнул палку :D
 

Valenok

Новичок
5227573613485916806405226496 / 300 000 000 000
из расчёта 3 миллиарда паролей в секунду на машину получается

17425245378286389 секунд = 4840345938412 часов
= 201681080767 дней = 552550906 лет


Так что там понадобится как минимум несколько тысяч таких же кластеров гугл и наса чтоб сменить для меня мой имейл.
Дешевле заказать вынос сервера у людей в чёрном.
И ещё в англ алфавите 26 букв =)
 

five

Новичок
kruglov
согласен.

От флуда (перебор вариантов), можно попробовать поставить: http://php.spb.ru/other/_dima_noflood.php

Кстати, кто его пробовал ставить - как он в работе?
 

confguru

ExAdmin
Команда форума
five

В нашем форуме работает.. от телепортов и прочих спасает :)
 
Сверху