За последние 24 часа нас посетил 25491 программист и 1385 роботов. Сейчас ищут 1076 программистов ...

Отобразить данные авторизации

Тема в разделе "PHP для новичков", создана пользователем tmpnik, 22 май 2024.

  1. tmpnik

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

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    Здравствуйте, при изучении php, встречаются задачи типа
    Код (Text):
    1.  
    2.  
    3. <form action="test.php" method="POST">
    4. <p>Введите логин: <input type="text" name="logname" /></p>
    5. <p>Введите пароль: <input type="text" name="pasname" /></p>
    6. <input type="submit" value="Отправить">
    7. </form>
    но мне надо что-то типа
    Код (Text):
    1.  
    2. <form action="test.php" method="POST">
    3. <p>Это логин: <input type="text" name="logname" /></p>
    4. <p>Это пароль: <input type="text" name="pasname" /></p>
    5. <input type="submit" value="Показать">
    6. </form>
    т.е. нажимая на кнопку "Показать" выполняется программа test.php, там берётся логин и пароль и вставляются в эти пустые поля
    т.е. например при авторизации и поиске логина, если находится, то выводилось бы приветствие на этой же странице с указанием имени и фамилии, которые берутся из бд
     
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    297
    Симпатии:
    58
    Адрес:
    Бавария, Германия
    Добрый день!
    Очень странно. Пароль обычно вводится в поле <input type="password">.
    Обычно после успешного захода выводят приветсвие.
    Вы изобретаете что-то для взлома?
    Удачи!
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.777
    Симпатии:
    1.325
    Адрес:
    Лень
    показывай давай ту самую "программу" )))
     
  4. tmpnik

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

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    Доброе утро, Причём тут взлом, я хочу понять сам механизм вывода данных на ту же страницу с которой был сделан запрос, и не важно пароль-не пароль, можно вообще просто пустое поле и кнопка, при нажатие которой в этом поле появляется текст...
     
  5. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    @tmpnik Вы используете форму с перенапралением на другую страницу test.php.
    Логичнее показывать имя и фамилию из БД, в test.php...
    Ну а если, как Вы хотите, видеть значения, на той же странице, где и отправляете. Пробуйте в test.php записывать нужные значения в глобальную переменную, потом делайте перенаправление на страницу ввода информации, ну и там через isset показывайте эту глобальную переменную...Но всё это как то не логично...
     
  6. tmpnik

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

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    Спасибо за ответ, но мне бы понять простейшее, поиск в БД будет полегче(с SQL работал в других языках програм.), т.к. оказывается есть форма с перенапралением на другую страницу, а какие есть ещё формы, а как отличить форму с перенаправлением и с оставлением на этой же странице..
    Возьми любой учебник PHP, курс и т.д., одно и потому типы переменные и т.д., а до самого интересного как-то и не дойдёшь, пока не прочитаешь весь этот талмуд.. Т.е. просто форма поле кнопка и действие на этой же форме
     
  7. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Обычно форма, всегда подразумевает отправку...
    Если Вам нужно действие, на этой же странице, то лучше type кнопки сменить на "button", и смотреть в сторону JS.
    Но опять же, если Вы говорите про форму авторизации, то нужно перенаправление...
     
  8. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    297
    Симпатии:
    58
    Адрес:
    Бавария, Германия
    Добрый день!
    Значит, Вы неудачно сформулировали задачу и наверняка знаете, что пароли принято шифровать и некому нельзя показывать.
    Допустим, есть таблица в БД.
    PHP:
    1. INSER INTO `test` (`user_id`, `username`, `password`, `gender`, `firstname`, `lastname`) VALUES
    2. (1, 'test', '*AF31C6CBDECD88726D0A9B3798C71EF41F1624D5', 'Mr', 'Petr', 'Ivanov');
    Вот "сам механизм вывода данных на ту же страницу, с которой был сделан запрос"
    PHP:
    1. <?$mysqli = new mysqli('127.0.0.1:3306','root','','test');
    2. if(isset($_SERVER["PHP_AUTH_PW"]))
    3. {
    4.   $query = $mysqli -> prepare("SELECT gender, firstname, lastname
    5.  FROM test WHERE username = ? AND password = ?");
    6.   $query -> execute([$_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]]);
    7.   $result = $query -> get_result();
    8.   $row = $result-> fetch_assoc();
    9.   if($row)
    10.   $row["status"] = 1;
    11.   else
    12.   $row["status"] = 0;
    13.  header('Content-Type: application/json; charset=utf-8');
    14.   echo json_encode($row);
    15.   exit;
    16. }
    17. ?>
    18. <html>
    19. <header>
    20.   <script src="2.5.3-crypto-sha1.js"></script>
    21.   //2.5.3-crypto-sha1.js from https://code.google.com/archive/p/crypto-js/downloads
    22.   <style>
    23.   body{
    24.   font-family: arial;
    25.   font-size: 18px}
    26.   body + div{padding-top: 20px}
    27.   input{
    28.   display: block;
    29.   margin-top: 20px;
    30.   font-size: 16px;
    31.   }
    32.   </style>
    33. </header>
    34. <body>
    35. <div align=center>
    36. <form>
    37. <h2>Вход</h2>
    38. <input type="text" name="logname"  placeholder="Введите логин" required />
    39. <input type="password" name="pasname" placeholder="Введите пароль" required/>
    40. <input type="submit" value="Отправить">
    41. </form>
    42. <div id="st"></div>
    43. </div>
    44. </body>
    45. <script>
    46. form = document.querySelector("form");
    47. st = document.getElementById("st");
    48. logCounter = 3;
    49. form.onsubmit = (event) => {
    50.   event.preventDefault();
    51.   let headers = new Headers();
    52.   let username = form.logname.value;
    53.   let password = form.pasname.value;
    54.   password = '*' + Crypto.SHA1(Crypto.util.hexToBytes(Crypto.SHA1(password))).toUpperCase();
    55.   np = window.btoa(unescape(encodeURIComponent(`${username}:${password}`)));
    56.   headers.append('Authorization', `Basic ${np}`);
    57.   fetch("<?=$_SERVER['PHP_SELF']?>", {
    58.   method: 'POST',
    59.   headers: headers
    60.   })
    61.   .then(response => response.json())
    62.   .then((data) => {
    63.   if(data["status"]==1)
    64.   {
    65.   form.remove();
    66.   delete data["status"];
    67.   data["gender"] += ".";
    68.   st.innerHTML = `Welcome ${Object.values(data).join(" ")}!`;
    69.   }
    70.   else
    71.   {
    72.   logCounter--;
    73.   if(logCounter>0)
    74.   {
    75.   att = "attempt";
    76.   if(logCounter>1)
    77.   att+="s";
    78.   st.innerHTML = `Error! Invalid username or password!<br>You have only ${logCounter} more ${att} left`;
    79.   }
    80.   else
    81.   {
    82.   form.remove();
    83.   st.innerHTML = "Access denied! Try again later!";
    84.   }
    85.   }
    86.   })
    87. }
    88. </script>
    89. </html>
    Удачи!
     
    tmpnik нравится это.
  9. tmpnik

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

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    Спасибо, наверное я не правильно сформулировал задачу, но за скрипт отдельное спасибо, сейчас с ним поразбираюсь...
     
  10. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    297
    Симпатии:
    58
    Адрес:
    Бавария, Германия
    Я забыл написать, что пароль на стороне клиента, перед отправкой на сервер шифруется также как в MySQL PASSWORD Function.
    Зашифрован пароль - "Test"
     
    tmpnik нравится это.
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.568
    Симпатии:
    1.757
    @Vladimir Kheifets Ни разу не видел, чтоб на стороне клиента пароль шифровался. https вполне достаточно, чтоб его не перехватили. А шифровать на клиенте - это значит ещё и ключ на клиенте откуда-то должен быть, а это уже бесполезняк значит, поскольку весь код клиента открытый.

    Перед записью в базу он не шифруется, а хешируется. Т.е. обратно "расхешировать" его нельзя, можно только сравнить хеши. password_hash и password_verify сейчас принято для этого использовать.

    @tmpnik При отправке формы методом post не через JS после обработки формы на стороне сервиса обязательно делается редирект куда-нибудь, методом GET, для избежания проблемы двойной отправки. Если же подключить JS, то можно сделать в принципе всё в фоне. Одна из популярных сейчас архитектур - это фронт на фреймворке типа VueJS или React взаимодействует с приложением без перезагрузок страницы в процессе работы.
     
    tmpnik нравится это.
  12. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    297
    Симпатии:
    58
    Адрес:
    Бавария, Германия
    Добрый день!
    Я тоже не видел, чтоб на стороне клиента пароль шифровался. Решил попробовать.
    Посмотрите внимательно мой код. Ключа в нём нет, т.е. пароль преобразуюется формат, не поддающийся расшифровке.
    При этом используется тот же алгоритм хеширования, что и в MySQL PASSWORD Function.
    Введённый пароль "Тест" в JS преобразуется в:
    *AF31C6CBDECD88726D0A9B3798C71EF41F1624D5
    Для сравнения, MySQL функция PASSWORD("Тест") возвращает тоже значение:
    *AF31C6CBDECD88726D0A9B3798C71EF41F1624D5
     
    #12 Vladimir Kheifets, 24 май 2024
    Последнее редактирование: 24 май 2024
  13. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.837
    Симпатии:
    741
    Адрес:
    Татарстан
    @Vladimir Kheifets не знаю, каким гуглом вы пользуетесь. Но в своем коде в используете именно Хеширование

    если же верить вашему гуглу
    нахера тогда вообще такое шифрование, если он не поддается расшифровке? ))))

    почитайте все же в авторитетных источниках о хешировании и шифровании
     
  14. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    297
    Симпатии:
    58
    Адрес:
    Бавария, Германия
    Попробуйте ввести в поиске "вашему гуглу":
    В чем разница хеширования и шифрования?

    Я написал, что преобразую пароль в JS используется тот же алгоритм хеширования,
    что и в MySQL PASSWORD Function.
    Принципально, то что для аутентификации со стороны клиента отправляется не открытый пароль.
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.568
    Симпатии:
    1.757
    Они тут просто не дописали, что не поддаётся расшифровке без ключа. А вообще, в этой статье про ключи есть: https://ssl.com.ua/blog/hashing-coding-encryption/

    sha1 подбирается по радужным таблицам, это раз. А два, пофиг, какой пароль отправляется, потому что, если всё сделать правильно, то он будет отправляться через https в зашифрованном виде, и автоматом расшифровываться на сервере. А вот password_hash использует алгоритм bcrypt с добавлением соли, так что по радужным таблицам подбирать бесполезняк.
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.568
    Симпатии:
    1.757
    @Vladimir Kheifets И самое главное, если мне как-то удастся перехватить ваш этот хеш, то я точно так же войду по нему, как если бы перехватил просто пароль. Так что толку от этого 0 :) В отличии от https, у которого тоже свои уязвимости есть (man in the middle, к примеру), но их не так просто использовать. Там где критично, просто делают многофакторную аутентификацию
     
  17. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    297
    Симпатии:
    58
    Адрес:
    Бавария, Германия
    Добрый день!
    Спасибо за подробный ответ. Ваши доводы убедительны.
    Хотелось бы узнать Ваше мне по поводу следущего:
    https://crypto.stackexchange.com/questions/103446/sending-password-to-server-vs-sending-sha
    @tmpnik, ниже код без хеширования пароля в JS
    PHP:
    1. <?
    2. $mysqli = new mysqli('127.0.0.1:3306','root','','test');
    3. if(isset($_SERVER["PHP_AUTH_PW"]))
    4. {
    5.   $query = $mysqli -> prepare("SELECT gender, firstname, lastname
    6.    FROM test WHERE username = ? AND password = PASSWORD(?)");
    7.   $query -> execute([$_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]]);
    8.   $result = $query -> get_result();
    9.   $row = $result-> fetch_assoc();
    10.   if($row)
    11.     $row["status"] = 1;
    12.   else
    13.     $row["status"] = 0;
    14.   //header('Content-Type: application/json; charset=utf-8');
    15.   echo json_encode($row);
    16.   exit;
    17. }
    18. ?>
    19. <html>
    20. <header>
    21.   <style>
    22.     body{
    23.       font-family: arial;
    24.       font-size: 18px}
    25.     body + div{padding-top: 20px}
    26.     input{
    27.       display: block;
    28.       margin-top: 20px;
    29.       font-size: 16px;
    30.     }
    31.   </style>
    32. </header>
    33. <body>
    34. <div align=center>
    35. <form>
    36. <h2>Вход</h2>
    37. <input type="text" name="logname"  placeholder="Введите логин" required />
    38. <input type="password" name="pasname" placeholder="Введите пароль" required/>
    39. <input type="submit" value="Отправить">
    40. </form>
    41. <div id="st"></div>
    42. </div>
    43. </body>
    44. <script>
    45. form = document.querySelector("form");
    46. st = document.getElementById("st");
    47. logCounter = 3;
    48. form.onsubmit = (event) => {
    49.   event.preventDefault();
    50.   let headers = new Headers();
    51.   let username = form.logname.value;
    52.   let password = form.pasname.value;
    53.   np = window.btoa(unescape(encodeURIComponent(`${username}:${password}`)));
    54.   headers.append('Authorization', `Basic ${np}`);
    55.   fetch("<?=$_SERVER['PHP_SELF']?>", {
    56.    method: 'GET',
    57.    headers: headers
    58.   })
    59.   .then(response => response.json())
    60.   .then((data) => {
    61.     if(data["status"]==1)
    62.     {
    63.       form.remove();
    64.       delete data["status"];
    65.       data["gender"] += ".";
    66.       st.innerHTML = `Welcome ${Object.values(data).join(" ")}!`;
    67.     }
    68.     else
    69.     {
    70.       logCounter--;
    71.       if(logCounter>0)
    72.       {
    73.         att = "attempt";
    74.         if(logCounter>1)
    75.           att+="s";
    76.         st.innerHTML = `Error! Invalid username or password!<br>You have only ${logCounter} more ${att} left`;
    77.       }
    78.       else
    79.       {
    80.         form.remove();
    81.         st.innerHTML = "Access denied! Try again later!";
    82.       }
    83.     }
    84.   })
    85. }
    86. </script>
    87. </html>
    Удачи!
     
    tmpnik нравится это.
  18. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.568
    Симпатии:
    1.757
    Ну там в принципе тоже самое же и говорится. Просто sha1 на клиенте - бесполезно. Если очень хочется, можно заморочиться на то ассиметричное шифрование, которое они там предлагают. Только зачем, если https уже именно этим и занимается? А при отправке пароля по http все адекватные браузеры сейчас выдают пользователю предупреждение, что он дурак.
     
  19. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    297
    Симпатии:
    58
    Адрес:
    Бавария, Германия
    Мне кажется, не совсем тоже самое. Я процетировал один из ответов от TLDR:
    If you want to choose between two methods only, sending plain password or sending password hash, then sending hash is better.
     
  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.568
    Симпатии:
    1.757
    Если стоит https, то вы не отправляете plain password. Короче, я бы не стал заморачиваться. Если уж надо сильно защитить от несанкционированного входа, я бы поставил второй/третий и т.д. фактор (т.е., отправку смс, отправку кода, Google Authenticator). Хотя, если есть man in the middle, он может посмотреть, что там отправляется уже после аутентификации, так что тоже не гарантия. Но хеширование пароля на стороне клиента тоже от man-in-the-middle не защитит
     
  21. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    297
    Симпатии:
    58
    Адрес:
    Бавария, Германия
    tmpnik,

    Немного подчистил код.
    Убрал форму. В браузере или PHP file_get_contents выводится
    HTML:
    1. <link rel="stylesheet" href="css/index.css">
    2. <script src="js/index.min.js"></script>
    3. <div id="cont" align="center" ></div>
    4. <div id="msg" align="center"></div>
    5. </body>
    6. </html>
    Форма создается и обрабатывается в JS.
    Для этого добавлен файл config.json
    Код (Javascript):
    1. {
    2.   "settings":
    3.   {
    4.     "hidePw":1,
    5.     "logCounter":3,
    6.     "logTime":60,
    7.     "Messages":
    8.     [
    9.       "Welcome",
    10.       [
    11.         "Error! Invalid username or password!",
    12.         "<br>You have only",
    13.         "attempt",
    14.         "more",
    15.         "left"
    16.       ],
    17.       "Access denied! Try again later!",
    18.       "Authorization time has expired."
    19.     ]
    20.   },
    21.   "dom":
    22.   {
    23.     "elmId":["cont","msg"],
    24.     "parent":{
    25.       "tag":"form"
    26.     },
    27.     "children":[
    28.       {
    29.         "tag":"h2",
    30.         "content":"Login"
    31.       },
    32.       {
    33.         "tag":"input",
    34.         "attributes":
    35.         {
    36.           "type":"text",
    37.           "placeholder":"Username",
    38.           "required":true,
    39.           "maxlength":25,
    40.           "minlength":4
    41.         }
    42.       },
    43.       {
    44.         "tag":"input",
    45.         "attributes":
    46.         {
    47.           "type":"password",
    48.           "placeholder":"Password",
    49.           "required":true,
    50.           "maxlength":25,
    51.           "minlength":4
    52.         }
    53.       },
    54.       {
    55.         "tag":"button",
    56.         "content":"Send",
    57.         "attributes":
    58.         {
    59.           "type":"submit"
    60.         }
    61.       }
    62.     ]
    63.   }
    64. }
    В config.json определяются:
    hidePw:
    integer 0 - отправлется открытый пароль
    integer 1 - подлючается файл 2.5.3-crypto-sha1.js и отправляется хешированный пароль.

    logCounter:
    integer 0 - неограниченное количество попыток входа
    integer >0 максимальное количество попыток

    logTime:
    integer 0 - неограниченное время попыток входа
    integer >0 максимальное время в сек.


    dom:

    elmId
    :
    array ld двух елементов DOM - контейнера формы и контейнера сообщений, например
    "elmId":["cont","msg"]

    Затем определяются свойства parent (form) и children елементов DOM (tagName, attributes и contentText)

    Удачи!
     

    Вложения:

    • login.zip
      Размер файла:
      4,8 КБ
      Просмотров:
      2
    tmpnik нравится это.