Доброго времени суток! Делаю на сайте страницу смены пароля для случаев, когда пароль от аккаунта забыт. Собственно сделал страницу, где мы вводим логин/email пользователя. На Email пользователя падает письмо со ссылкой, перейдя на которую мы меняем пароль. Так вот, у меня есть логин, соль, идентификатор пользователя. Каким-то образом хочется сделать временный токен для доступа к странице смены пароля. Башка как-то слабо сегодня варит, может Вы что-то подскажете?
Вместе с логином, солью и т.д. можно записывать дату получения токена. При заходе на страницу, проверять, не истёк ли срок
В ссылке одним из параметров слать токен, случайно сгенеренный. Остальное - у предыдущего оратора. Хранишь его в бд с датой. Потом смотришь, есть ли в базе такой-то токен. Если есть, не протух ли он. Не протух? Окей, регаемся!
Так то да, все верно, а если чуть более глубоко помыслить? Зачем нам что-либо записывать в бд? Мне кажется, что можно придумать такую ссылку, где нам не потребуется что-то куда-то записывать.
Можно. Например посылать в ссылке дату, в открытом или в зашифрованном виде. Но тогда у пользователя будет шанс обойти ограничение.
Нет, не придумать. Любая проверка подразумевает некий шаблон для сравнения, эталон, правило. Если обе стороны проверки удовлетворяют правилу, все работает. В противном случае - найдут ушлые люди закономерности генерации твоей волшебной ссылки-несущей-в-себе-нужные-но-хитро-спрятанные-данные и наводнят тебя боты. В лучшем случае. Никогда не доверяй тому, что пришло от клиента. Никогда. Это закон. Клиент - твой враг. Это хитрый человек. Это злой человек. Он умнее и хитрее тебя, всегда думай только так. Он может подделать любые входящие данные. Единственный способ защиты - проверка на стороне сервера, основанная на сравнении, а не вычислениях на основе полученных данных. Добавлено спустя 45 секунд: Если в открытом, то толку? Если в закрытом(сдается мне, имелось ввиду не шифрование, а хэширование), то на стороне сервера ты как ее будешь обратно конвертить? Брутфорсом? Не усложняйте себе жизнь. Не хочешь писать в БД, пиши в файлик. Данные, требующие валидацию, несущие факт валидации внутри себя - это такой же абсурд, как запароленный наглухо системник с закриптованными винтами, у которого на внутренней стороне крышки висит листок со всеми паролями и ключами. Тебе достаточно будет одного умника, который догадается заглянуть внутрь. Всего одного.
Мда, задачка. По поводу клиента все верно, конечно. По сути, если хорошенько подумать, запись в бд - тоже плохо.
Человек получает данные бд, соответственно получает возможность изменить пароль любого пользователя со свеженьким токеном.
Чего? Давай проведем эксперимент. Есть у меня проект в альфатесте закрытом. Я тебе туда в личку скинул инвайт, сгенеренный для твоего ника. Ну...представь, что ты ввел уже свои данные и надо просто закончить регистрацию, а инвайт - это токен в ссылке. Параллельно, я создам инвайт для пользователя VasyaPupkin, чтобы в системе было неактивированное приглашение. Когда активируешь через свой инвайт Васю, дай знать. З.Ы. Инвайты одноразовые. Активируешь свой - больше им воспользоваться будет нереально. Если, конечно, в БД правки не внести руками.
Погоди, ты мне сейчас описал такую схему: Пишем пользователю (неважно какой, главное, чтобы уникальный) токен и дату истечения срока действия токена. Так? Одноразовый токен, или нет - это уже не совсем важно, поскольку, если будем ставить 0 или 1, или же будем удалять токен, то все-равно злоумышленник, завладевший данными бд будет знать информацию обо всех токенах. Далее исход следующий: злоумышленник мониторит появление новых токенов и при появлении свежих - просто заходит на страницу смены пароля с одним из них... По моему очевидно. UPD: а по поводу инвайтов, не совсем удачный пример, т. к. я не собирался с помощью "своего" токена пытаться ломать "не свои" аккаунты. UPD: ну или я чего-то не понимаю... Добавлено спустя 24 минуты 9 секунд: Итак, Господа, вопрос пока в статусе "НЕ РЕШЕННЫЙ", если есть предложения - озвучиваем))
Опять началось... "Если злоумышленник завладел бд". Если у бабушки будет хрен, она будет дедушкой. Если ты пролюбил доступ к базе - ты пролюбил все. А то деньги в коробочку, коробочку в сейф, сейф в стену....а вдруг стену украдут? Проблема эта была решена давным давно. Тот факт- что ты не можешь принять решение, не основанное на магии, не знкчит, что оно неверное.
Ну как сказать, выбрать из двух зол - это одно. Я то конечно могу сделать так как изначально задумал, а могу и писать токен в бд. Но может есть еще варианты) А по поводу доступа к бд - это на самом деле довольно серьезно. Вот скажем, ты ведь не хранишь пароли в базе? Ты делаешь хэш пользователя и ложишь в таблицу. Зачем ты это делаешь? Правильно, чтобы злоумышленник изрядно попотел, прежде чем получить доступ хотя бы к одному (повторюсь - к "одному") из аккаунтов. Почему-то в этом случае ты думаешь о том, что данными бд могут завладеть. А тут получается дырочка то куда поприличнее. Получив доступ к бд - ты, по сути, не напрягаясь получаешь доступ ко всем аккаунтам, которые требуют восстановления пароля. Вообщем, я на самом деле не отказываюсь от записи токена в бд, просто развиваю идею (как обойти описанную мной проблему и т. д.).
нет не важно куда ты засунешь токен, но если у тебя есть к нему доступ, то у того, кто завладел твоим серваком, тоже будет доступ туда.
Хочешь супер-секурности, завязывай токен на хэше айпишника, юзерагента и какой-то волшебной секретной куки. Восстаноыление пароля в 99% случаев проходит с того же устройства и браузера, что и запрос на восстановление. Тогда злоумышленник не сможет сходу подделать входящие данные, зная ответные. Но. У ТЕБЯ УЖЕ ЛЕВЫЙ ТИП В СЕРВАКЕ ШАРИТСЯ. Он не будет ловить людей на смене паролей. Он поставит тебе сниффер, который будет отдавать ему пароли до их обработки при логине. Ты войдешь на сайт под свою учетку, а он узнает пароль. Это гораздо легче, быстрее и эффективней.
Весельчак? Лично мне по барабану как, хоть приснилось человеку, мне все-равно. Добавлено спустя 4 минуты 50 секунд: Заметь, о том, что кто-то шарится у меня на серваке я не говорил)) Это уже такие крайности, что мама не горюй. Добавлено спустя 16 минут 45 секунд: Ребят, я все прекрасно понял. Вы мне предложили вариант, от которого я, кстати, не отказывался, вроде. Вариант хороший. На данный момент, в контексте своего приложения, я думаю как это наиболее грамотно реализовать. Есть ли еще варианты реализации или нет - покажет время. Комментарий Ke1eth меня немного смутил. Абсолютно не понимаю к чему этот спектакль... Если Вам, Ke1eth, не нравится то, что некоторые могут себе позволить поразмышлять над поставленной задачей - это далеко не факт, что Вы можете ворваться в топик и тупо, извиняюсь, засрать его своей гениальностью и ЧСВ. Но, я этот топик создавал с той целью, чтобы рассмотреть различные варианты, взвесить все за и против и выбрать один из них. Я дико извиняюсь, если я кого-то обидел, кроме Ke1eth, естественно. Просто решение хочется рассмотреть с разных ракурсов. И если я пытаюсь рассуждать о той или иной уязвимости - пожалуйста, не рассматривайте это как оскорбление в свой адрес. Тема не закрыта. Добавлено спустя 8 минут 51 секунду: Сов. верно.
Стоп. Ты сам начал строить свое рассуждение отталкиваясь от злоумышленника, который у тебя дергает БД. А потом бац - это крайности. Взаимоисключающие параграфы. А ты прикинь тот факт, что люди, которые занимаются этим дольше тебя, уже тоже давно все рассмотрели, и не одну страницу форума исписали на эту тему и просто так говорить не будут тебе такие вещи.
Боженька, за что мне это))) Вот ты мне это сейчас с какой целью говоришь, я не пойму?)) Братик, я знаю, что тысяча форумов исписана, и что я далеко не самый лучший в мире, и что у Вас тут побольше опыта, чем у меня (и это чистая правда, говорю без преувеличений)... Алсо... Наверняка я сейчас блесну умом. Получить данные бд - далеко не факт, что ты имеешь доступ к управлению сервером - так? блин... Вы че, дампа с базы никогда не снимали? Спиздили дамп - вот тебе доступ к данным твоей бд... Я же говорю русским языком - неважно как злоумышленник получил доступ к бд( ), просто есть факт того, что у него есть спискок токенов и срок годности этих токенов. Зачем заострять внимание на том, как он получил данные из базы? Не это является задачей... И еще раз намекну на один маленький нюанс - большинство разработчиков зачем-то хранят в базе хэш вместо того, чтобы хранить пароль в его первоначальном виде... Вопрос - зачем? Может быть потому, что база может быть нагло спи...кхм. И еще, вдогонку, меня не поджимают сроки - мне просто интересен факт существования "безопасного" способа сменить пароль. Не парься, не заморачивайся - это вариант, когда мне фиолетово на решение. UPD: Ну, мне никогда не в тягость было перечитать историю сообщений... Итак: Вт апр 15, 2014 16:13 Что-то не видно ничего, что бы говорило о том, что я сказал что-то по поводу левого типа на моем сервере)))
1) Потому что доступ к базе может иметь более одного администратора и не хотелось бы светить свой пароль даже другу. 2) Потому что пользователям спокойнее, когда они знают, что даже администратор не может слить их пароли налево. 3) Ну cпизди нагло мою БД. Давай. Учитывая, что она наружу вообще не светит ни одним портом и без доступа к серверу ты ничего не сделаешь. Казалось бы, при чем тут "левый тип на серваке". Если у тебя на сервере проходной двор - надо калиточку закрыть, а не придумывать систему, которая автоматически будет хватать нежеланных гостей за пятку и выкидывать на дорогу. А если ты пролюбил доступ к серверу, то сам себе буратино. Там никто не будет пасти тех, кто меняет пароль. Там открывается кард-бланш и будет великим счастьем, если ты обнаружишь это более менее вовремя. Хочешь страдать от навязчивых идей - страдай, твое право.
Я вот не пойму, с чего ты взял, что я имею ввиду, что у меня кто-то на сервере? UPD: вот скажи мне, у тебя пароли в каком виде хранятся?
В виде соли и двух хэшей, связь и генерация которых определяются функцией, доступной для изменения в конфигах. Потому что, повторюсь, если у админа руки не из задницы, база не будет светить через интернет, и, единственный способ в нее залезть - через скрипт с сервера, который нельзя залить, если нет к серверу допуска, при условии, опять же, что владелец сервера не рукожоп и не пролюбил FTP.
Блин, у животного на вашей аватарке такие умные глаза... Честно признаюсь, Вы меня ставите просто в тупик...
Чем? Тем, что вы не знаете, как работает сервер БД, и что такое локальная сеть? Или тем, что если мнение расходится с вашим, оно априори не может быть верным? Вы знаете домен моего сайта. Вы можете разрезолвить его в IP. Стучитесь, попробуйте достучаться до базы. И это не мое ноу-хау, это обычное, совершенно естественное положение дел.