За последние 24 часа нас посетили 22672 программиста и 1211 роботов. Сейчас ищут 778 программистов ...

токены

Тема в разделе "Прочие вопросы по PHP", создана пользователем dapperkop, 15 апр 2014.

  1. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Доброго времени суток!

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

    Собственно сделал страницу, где мы вводим логин/email пользователя. На Email пользователя падает письмо со ссылкой, перейдя на которую мы меняем пароль.

    Так вот, у меня есть логин, соль, идентификатор пользователя. Каким-то образом хочется сделать временный токен для доступа к странице смены пароля. Башка как-то слабо сегодня варит, может Вы что-то подскажете?
     
  2. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    Вместе с логином, солью и т.д. можно записывать дату получения токена.
    При заходе на страницу, проверять, не истёк ли срок
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    В ссылке одним из параметров слать токен, случайно сгенеренный. Остальное - у предыдущего оратора. Хранишь его в бд с датой. Потом смотришь, есть ли в базе такой-то токен. Если есть, не протух ли он. Не протух? Окей, регаемся!
     
  4. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Так то да, все верно, а если чуть более глубоко помыслить? Зачем нам что-либо записывать в бд? Мне кажется, что можно придумать такую ссылку, где нам не потребуется что-то куда-то записывать.
     
  5. Николай12

    Николай12 Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    47
    Симпатии:
    0
    Можно. Например посылать в ссылке дату, в открытом или в зашифрованном виде. Но тогда у пользователя будет шанс обойти ограничение.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Нет, не придумать. Любая проверка подразумевает некий шаблон для сравнения, эталон, правило. Если обе стороны проверки удовлетворяют правилу, все работает. В противном случае - найдут ушлые люди закономерности генерации твоей волшебной ссылки-несущей-в-себе-нужные-но-хитро-спрятанные-данные и наводнят тебя боты. В лучшем случае.

    Никогда не доверяй тому, что пришло от клиента. Никогда. Это закон. Клиент - твой враг. Это хитрый человек. Это злой человек. Он умнее и хитрее тебя, всегда думай только так. Он может подделать любые входящие данные. Единственный способ защиты - проверка на стороне сервера, основанная на сравнении, а не вычислениях на основе полученных данных.

    Добавлено спустя 45 секунд:
    Если в открытом, то толку? Если в закрытом(сдается мне, имелось ввиду не шифрование, а хэширование), то на стороне сервера ты как ее будешь обратно конвертить? Брутфорсом?

    Не усложняйте себе жизнь. Не хочешь писать в БД, пиши в файлик.

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

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Мда, задачка. По поводу клиента все верно, конечно. По сути, если хорошенько подумать, запись в бд - тоже плохо.
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    чем?
     
  9. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Человек получает данные бд, соответственно получает возможность изменить пароль любого пользователя со свеженьким токеном.
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Чего? Давай проведем эксперимент. Есть у меня проект в альфатесте закрытом. Я тебе туда в личку скинул инвайт, сгенеренный для твоего ника. Ну...представь, что ты ввел уже свои данные и надо просто закончить регистрацию, а инвайт - это токен в ссылке. Параллельно, я создам инвайт для пользователя VasyaPupkin, чтобы в системе было неактивированное приглашение. Когда активируешь через свой инвайт Васю, дай знать.

    З.Ы. Инвайты одноразовые. Активируешь свой - больше им воспользоваться будет нереально. Если, конечно, в БД правки не внести руками.
     
  11. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Погоди, ты мне сейчас описал такую схему: Пишем пользователю (неважно какой, главное, чтобы уникальный) токен и дату истечения срока действия токена. Так?

    Одноразовый токен, или нет - это уже не совсем важно, поскольку, если будем ставить 0 или 1, или же будем удалять токен, то все-равно злоумышленник, завладевший данными бд будет знать информацию обо всех токенах.

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

    UPD: а по поводу инвайтов, не совсем удачный пример, т. к. я не собирался с помощью "своего" токена пытаться ломать "не свои" аккаунты.

    UPD: ну или я чего-то не понимаю...

    Добавлено спустя 24 минуты 9 секунд:
    Итак, Господа, вопрос пока в статусе "НЕ РЕШЕННЫЙ", если есть предложения - озвучиваем))
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    четы ты морочишься. сделай таблицу.
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Опять началось... "Если злоумышленник завладел бд". Если у бабушки будет хрен, она будет дедушкой. Если ты пролюбил доступ к базе - ты пролюбил все. А то деньги в коробочку, коробочку в сейф, сейф в стену....а вдруг стену украдут?

    Проблема эта была решена давным давно. Тот факт- что ты не можешь принять решение, не основанное на магии, не знкчит, что оно неверное.
     
  14. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Ну как сказать, выбрать из двух зол - это одно. Я то конечно могу сделать так как изначально задумал, а могу и писать токен в бд. Но может есть еще варианты)

    А по поводу доступа к бд - это на самом деле довольно серьезно. Вот скажем, ты ведь не хранишь пароли в базе? Ты делаешь хэш пользователя и ложишь в таблицу. Зачем ты это делаешь? Правильно, чтобы злоумышленник изрядно попотел, прежде чем получить доступ хотя бы к одному (повторюсь - к "одному") из аккаунтов. Почему-то в этом случае ты думаешь о том, что данными бд могут завладеть.

    А тут получается дырочка то куда поприличнее. Получив доступ к бд - ты, по сути, не напрягаясь получаешь доступ ко всем аккаунтам, которые требуют восстановления пароля.

    Вообщем, я на самом деле не отказываюсь от записи токена в бд, просто развиваю идею (как обойти описанную мной проблему и т. д.).
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    нет
    не важно куда ты засунешь токен, но если у тебя есть к нему доступ, то у того, кто завладел твоим серваком, тоже будет доступ туда.
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Хочешь супер-секурности, завязывай токен на хэше айпишника, юзерагента и какой-то волшебной секретной куки. Восстаноыление пароля в 99% случаев проходит с того же устройства и браузера, что и запрос на восстановление.

    Тогда злоумышленник не сможет сходу подделать входящие данные, зная ответные. Но. У ТЕБЯ УЖЕ ЛЕВЫЙ ТИП В СЕРВАКЕ ШАРИТСЯ. Он не будет ловить людей на смене паролей. Он поставит тебе сниффер, который будет отдавать ему пароли до их обработки при логине. Ты войдешь на сайт под свою учетку, а он узнает пароль. Это гораздо легче, быстрее и эффективней.
     
  17. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Пажалуста, пажалуста расскажи мне как? Я хочу знать! Я джва года ждал этого!
     
  18. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Весельчак? Лично мне по барабану как, хоть приснилось человеку, мне все-равно.

    Добавлено спустя 4 минуты 50 секунд:
    Заметь, о том, что кто-то шарится у меня на серваке я не говорил)) Это уже такие крайности, что мама не горюй.

    Добавлено спустя 16 минут 45 секунд:
    Ребят, я все прекрасно понял. Вы мне предложили вариант, от которого я, кстати, не отказывался, вроде. Вариант хороший.

    На данный момент, в контексте своего приложения, я думаю как это наиболее грамотно реализовать. Есть ли еще варианты реализации или нет - покажет время.

    Комментарий Ke1eth меня немного смутил. Абсолютно не понимаю к чему этот спектакль... Если Вам, Ke1eth, не нравится то, что некоторые могут себе позволить поразмышлять над поставленной задачей - это далеко не факт, что Вы можете ворваться в топик и тупо, извиняюсь, засрать его своей гениальностью и ЧСВ.

    Но, я этот топик создавал с той целью, чтобы рассмотреть различные варианты, взвесить все за и против и выбрать один из них.

    Я дико извиняюсь, если я кого-то обидел, кроме Ke1eth, естественно. Просто решение хочется рассмотреть с разных ракурсов. И если я пытаюсь рассуждать о той или иной уязвимости - пожалуйста, не рассматривайте это как оскорбление в свой адрес.

    Тема не закрыта.

    Добавлено спустя 8 минут 51 секунду:
    Сов. верно.
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Стоп. Ты сам начал строить свое рассуждение отталкиваясь от злоумышленника, который у тебя дергает БД. А потом бац - это крайности. Взаимоисключающие параграфы.
    А ты прикинь тот факт, что люди, которые занимаются этим дольше тебя, уже тоже давно все рассмотрели, и не одну страницу форума исписали на эту тему и просто так говорить не будут тебе такие вещи.
     
  20. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Боженька, за что мне это))) Вот ты мне это сейчас с какой целью говоришь, я не пойму?)) Братик, я знаю, что тысяча форумов исписана, и что я далеко не самый лучший в мире, и что у Вас тут побольше опыта, чем у меня (и это чистая правда, говорю без преувеличений)...

    Алсо... Наверняка я сейчас блесну умом. Получить данные бд - далеко не факт, что ты имеешь доступ к управлению сервером - так? блин... Вы че, дампа с базы никогда не снимали? Спиздили дамп - вот тебе доступ к данным твоей бд... Я же говорю русским языком - неважно как злоумышленник получил доступ к бд(
    ), просто есть факт того, что у него есть спискок токенов и срок годности этих токенов. Зачем заострять внимание на том, как он получил данные из базы? Не это является задачей...

    И еще раз намекну на один маленький нюанс - большинство разработчиков зачем-то хранят в базе хэш вместо того, чтобы хранить пароль в его первоначальном виде... Вопрос - зачем? Может быть потому, что база может быть нагло спи...кхм.

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

    UPD:
    Ну, мне никогда не в тягость было перечитать историю сообщений... Итак:
    Вт апр 15, 2014 16:13
    Что-то не видно ничего, что бы говорило о том, что я сказал что-то по поводу левого типа на моем сервере)))
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    1) Потому что доступ к базе может иметь более одного администратора и не хотелось бы светить свой пароль даже другу.
    2) Потому что пользователям спокойнее, когда они знают, что даже администратор не может слить их пароли налево.
    3) Ну cпизди нагло мою БД. Давай. Учитывая, что она наружу вообще не светит ни одним портом и без доступа к серверу ты ничего не сделаешь. Казалось бы, при чем тут "левый тип на серваке". Если у тебя на сервере проходной двор - надо калиточку закрыть, а не придумывать систему, которая автоматически будет хватать нежеланных гостей за пятку и выкидывать на дорогу. А если ты пролюбил доступ к серверу, то сам себе буратино. Там никто не будет пасти тех, кто меняет пароль. Там открывается кард-бланш и будет великим счастьем, если ты обнаружишь это более менее вовремя.

    Хочешь страдать от навязчивых идей - страдай, твое право.
     
  22. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Я вот не пойму, с чего ты взял, что я имею ввиду, что у меня кто-то на сервере?

    UPD: вот скажи мне, у тебя пароли в каком виде хранятся?
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    В виде соли и двух хэшей, связь и генерация которых определяются функцией, доступной для изменения в конфигах.

    Потому что, повторюсь, если у админа руки не из задницы, база не будет светить через интернет, и, единственный способ в нее залезть - через скрипт с сервера, который нельзя залить, если нет к серверу допуска, при условии, опять же, что владелец сервера не рукожоп и не пролюбил FTP.
     
  24. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Блин, у животного на вашей аватарке такие умные глаза...

    Честно признаюсь, Вы меня ставите просто в тупик...
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Чем? Тем, что вы не знаете, как работает сервер БД, и что такое локальная сеть? Или тем, что если мнение расходится с вашим, оно априори не может быть верным?

    Вы знаете домен моего сайта. Вы можете разрезолвить его в IP. Стучитесь, попробуйте достучаться до базы. И это не мое ноу-хау, это обычное, совершенно естественное положение дел.