Логин на сайт по файлу

    В одном моем проекте, который я делал для массового пользователя, понадобилось сделать режим восстановления пароля без использования email-a. Я долго думал как же это сделать и в конце концов возникла идея создать логин по файлу (токен), имея который пользователь может зайти на сайт и сменить забытый пароль. Скачать готовый скрипт с комментариями можно тут.
    Если у вас возникнут вопросы пишите, постараюсь на них ответить :)

    Комментарии 42

    • НЛО прилетело и опубликовало эту надпись здесь
        0
        Недоделанная (каюсь я ленив) доска объявлений :)
        • НЛО прилетело и опубликовало эту надпись здесь
        0
        Не, ну если бы я пароль забыл, то через полтора года какой там я файл закачивал, точно бы не вспомнил.
          0
          ничто не мешает в имени файла задать адрес сайта ;)
            0
            И куда вы его предлагаете положить пользователям, чтобы через полтора года не забыть, где он?
              –3
              да хотя бы на рабочий стол, или в папку мои документы.
                +5
                вы шутник :)
                  +1
                  Вы с ума сошли, 1.5 года неизвестно для чего захламлять рабочий стол неизвестно чем. Это без учета переустановок системы и разных компов у одного пользователя.
                  +2
                  Выслать на почту?
                    –1
                    Которой кстати может и не быть, именно из за этого все и задумывалось :)
                      +2
                      Думаете, у многих пользователей интернета нет электронной почты? :)
                      –1
                      Вот это действительно прекрасная идея.
                        0
                        флешдрайв с ключами? другое дело, что такой флеш драйв полюбому будет шифрован, а значит пароль может забыться :)
                  0
                  Вообще идея показалась интересной, но не в плане того, что пользователю дается ключ, с помошью которого он может восстановить пароль, а как генератор случайных чисел для ключа, которым будут шифроваться данные. Например вебмани кипер и опера мини при установке предлагают случайным образом подолбить по клавиатуре, а могли бы просто попросить закачать случайный файл (для мобильника проблематичнее, но это только пример таких приложений).
                    0
                    ага. И у половины «случайным» файлом будет первая картинка из виндовс галереи
                      +3
                      сужу по своему проекту: тематика такая, что у нас при регистрации обязательно указание фото. Так вот у 20% тех, кто вместо фотки грузит какую либо другую картинку, этой картинкой оказывается хвост синего кита ))
                    0
                    Секретный вопрос не легче сделать было? Или идентификацию пользователя, для восстановления пароля по номеру мобильного телефона?
                      0
                      Everything changes, да к тому же ваш номер мобильного телефона и, скорее всего, ваш ник знают как минимум ваши друзья ;)
                        0
                        Я и хочу сказать, что все меняется, сколько раз за год пользователь может переустановить ОС, особенно если это win xp, и забыть про ваш ключ…

                        И что, что мои друзья знают мой номер?

                        При регистрации пользователь вводит и подтверждает по смс свой номер телефона, пароль приходит на номер телефона… и ни кто его ни видит, кроме этого самого пользователя…
                          0
                          И мыло они знают, это не мешает восстанавливать пароль по мылу. Суть не в том, чтобы для авторизации или смены пароля вводить свой номер, а в том, чтобы на номер приходил ключ для смены пароля.
                            0
                            кто знает, друзья? так пароль то откуда они знают?
                          –2
                          Признаю, я балбес, до этого не додумался :)
                          +10
                          При беглом просмотре кода — ужасно.

                          1. Гораздо удобнее, если пользователь сам выберет файл из имеющихся на его компьютере. На сервере достаточно хранить MD5.

                          2.
                          // генерируем число
                          $x=rand(0,99999);
                          // переводим его в МД5
                          $new_token=md5($x);


                          Всего 99999 вариантов ключа для получения доступа к аккаунту. Есть в РНР для таких случаев полезная функция uniqid

                          3.
                          // создаем новый файл токена и открываем его на запись
                          $new_token_file=fopen("token_$login.txt", w);
                          // добавляем в токен созданные значения
                          $var="$login;$new_token;";
                          // пишем файл
                          fwrite($new_token_file,$var);
                          // закрываем записаный файл
                          fclose($new_token_file);


                          Слишком много букв. Можно написать file_put_contents(«token_$login.txt», "$login;$new_token;")

                          4.
                          // получаем загруженный файл
                          $userfile = $_FILES['userfile'];
                          $userfile_tmp = $_FILES['userfile']['tmp_name'];
                          // считываем инфу с него
                          $read=file_get_contents($userfile_tmp);


                          Нет проверки на код ошибки загруженного файла.

                          5.
                          //разделяем значения
                          $x=split (";", $read);
                          // получаем значения из массива
                          $login=$x[0];
                          $token=$x[1];


                          Йоу! Во-первых, This function has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged. Во-вторых, есть такая функция как explode. В-третьих, использовать подобное регулярное выражение как минимум глупо. В-четвёртых, нет проверки на ошибки.

                          6.
                          $read=file_get_contents($userfile_tmp);
                          //разделяем значения
                          $x=split (";", $read);
                          // получаем значения из массива
                          $login=$x[0];
                          $token=$x[1];
                          //считываем с базы
                          $sql=mysql_query("SELECT * FROM az_user WHERE user_login='$login'");


                          На каждом углу пишут большими буквами про escape подставляемых значений, но мы продолжаем плодить говнокод, ага.
                            0
                            Предположим, что сайт хакнут. Зная алгоритм создания файла, он будет спокойно логиниться и вы ничего с этим не сделаете, т.к. сменить алгоритм нельзя.
                              +1
                              Чтобы хакнуть сайт достаточно подставить SQL-выражение вместо логина в генерируемый текстовый файл. :--)
                                0
                                Мне просто понравилось, что я хакую сайт, скачиваю себе одну таблицу ДБ и у меня появляется возможность за секунду зайти под любым пользователем. Никаких расшифровок хешей. Классная защита, однако.
                              0
                              Даже если пользователь не забудет какой файл надо закидывать, даже если у него не упадет файловая система или жесткий диск, ему придется таскать файл с собой, потому что восстановить пароль может понадобиться и на другом компьютере, где разумеется этого файла не будет
                                +4
                                Идея идеей, но вот конечная реализация бредовая.
                                  0
                                  идея нормальная. вопрос в ее целесообразности для конкретного проекта. вот никто же не против хранить на флешке или где-нибуть ключ от вебмани или какого-нибуть из интернет-банков.
                                    0
                                    ну так зачем дла банков велосипед придумывать? у них клиент-банковские системы и так дают хранить файлы на съемных носителях :)
                                    0
                                    SELECT WHERE name=$_POST['name'] — Harder, Better, Faster, Stronger.

                                    Идея конечно хороша, но что если в файлике не хранить никакой текстовой информации, а, например, графическую (дада, все поняли, куда я веду...:) )?
                                    0
                                    А почему бы пользователю просто не записать свой пароль? Уровень безопасности ровно тот же получается, а пользоваться проще.
                                      0
                                      хм. 99999 вариантов мало.

                                      Можно написать скрипт, который быстро сгенерит нам 99999 токенов ваших и в каждый подставит логин admin (наверняка такой есть :) ), ну или проанализировать сайт и найти хоть какой-нить логин. Крайний случай — проверить топ10 логинов — admin, administrator, adm, root, vasya :) ну вы поняли.

                                      А затем тупо прогнать все варианты и все. Доступ получен.

                                      Решение:
                                      Нужно тогда делать больше вариаций — это РАЗ.
                                      И защиту от брута — это ДВА.

                                      — $login=$x[0];
                                      — а где проверка на SQL-инъекцию? $login же потом просто вставляется в запрос.
                                      Нужно тогда в токен добавить еще контрольную сумму всего файла, чтоб туда ничего лишнего не запихнули.
                                        +5
                                        А еще есть такая штука — авторизация по SSL сертификатам ;)
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                            0
                                            да да. только про x509 хотел написать :)
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                            0
                                            Я делал логин по файлу для банковской системы.
                                            Там даже несколько иначе было… Вся БД шифровалась 256-битным ключом из файла. Ни при какомм желании посмотреть чужие записи нельзя.
                                            Файлик вшивался в флешечку, писался плагинчик для IE/FF, который при заходе на сайт коннектился к ключу.
                                            Вот так просто и удобно. Никуда ничего вводить не надо, файлик искать не надо. Только имей при себе ключ и заходишь на сайт быстро и удобно.
                                            но есть проблемки… Если потерял ключ… То это конец. Но, конечно, на моей флешке хранились все шифровки, так что восстановить ключ проблем небыло, но втык люди получали. За месяц тестирования «втык» получили четыре человека =)
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                            • НЛО прилетело и опубликовало эту надпись здесь

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое