Здравствуйте, при изучении php, встречаются задачи типа Код (Text): <form action="test.php" method="POST"> <p>Введите логин: <input type="text" name="logname" /></p> <p>Введите пароль: <input type="text" name="pasname" /></p> <input type="submit" value="Отправить"> </form> но мне надо что-то типа Код (Text): <form action="test.php" method="POST"> <p>Это логин: <input type="text" name="logname" /></p> <p>Это пароль: <input type="text" name="pasname" /></p> <input type="submit" value="Показать"> </form> т.е. нажимая на кнопку "Показать" выполняется программа test.php, там берётся логин и пароль и вставляются в эти пустые поля т.е. например при авторизации и поиске логина, если находится, то выводилось бы приветствие на этой же странице с указанием имени и фамилии, которые берутся из бд
Добрый день! Очень странно. Пароль обычно вводится в поле <input type="password">. Обычно после успешного захода выводят приветсвие. Вы изобретаете что-то для взлома? Удачи!
Доброе утро, Причём тут взлом, я хочу понять сам механизм вывода данных на ту же страницу с которой был сделан запрос, и не важно пароль-не пароль, можно вообще просто пустое поле и кнопка, при нажатие которой в этом поле появляется текст...
@tmpnik Вы используете форму с перенапралением на другую страницу test.php. Логичнее показывать имя и фамилию из БД, в test.php... Ну а если, как Вы хотите, видеть значения, на той же странице, где и отправляете. Пробуйте в test.php записывать нужные значения в глобальную переменную, потом делайте перенаправление на страницу ввода информации, ну и там через isset показывайте эту глобальную переменную...Но всё это как то не логично...
Спасибо за ответ, но мне бы понять простейшее, поиск в БД будет полегче(с SQL работал в других языках програм.), т.к. оказывается есть форма с перенапралением на другую страницу, а какие есть ещё формы, а как отличить форму с перенаправлением и с оставлением на этой же странице.. Возьми любой учебник PHP, курс и т.д., одно и потому типы переменные и т.д., а до самого интересного как-то и не дойдёшь, пока не прочитаешь весь этот талмуд.. Т.е. просто форма поле кнопка и действие на этой же форме
Обычно форма, всегда подразумевает отправку... Если Вам нужно действие, на этой же странице, то лучше type кнопки сменить на "button", и смотреть в сторону JS. Но опять же, если Вы говорите про форму авторизации, то нужно перенаправление...
Добрый день! Значит, Вы неудачно сформулировали задачу и наверняка знаете, что пароли принято шифровать и некому нельзя показывать. Допустим, есть таблица в БД. PHP: INSER INTO `test` (`user_id`, `username`, `password`, `gender`, `firstname`, `lastname`) VALUES (1, 'test', '*AF31C6CBDECD88726D0A9B3798C71EF41F1624D5', 'Mr', 'Petr', 'Ivanov'); Вот "сам механизм вывода данных на ту же страницу, с которой был сделан запрос" PHP: <?$mysqli = new mysqli('127.0.0.1:3306','root','','test'); if(isset($_SERVER["PHP_AUTH_PW"])) { $query = $mysqli -> prepare("SELECT gender, firstname, lastname FROM test WHERE username = ? AND password = ?"); $query -> execute([$_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]]); $result = $query -> get_result(); $row = $result-> fetch_assoc(); if($row) $row["status"] = 1; else $row["status"] = 0; header('Content-Type: application/json; charset=utf-8'); echo json_encode($row); exit; } ?> <html> <header> <script src="2.5.3-crypto-sha1.js"></script> //2.5.3-crypto-sha1.js from https://code.google.com/archive/p/crypto-js/downloads <style> body{ font-family: arial; font-size: 18px} body + div{padding-top: 20px} input{ display: block; margin-top: 20px; font-size: 16px; } </style> </header> <body> <div align=center> <form> <h2>Вход</h2> <input type="text" name="logname" placeholder="Введите логин" required /> <input type="password" name="pasname" placeholder="Введите пароль" required/> <input type="submit" value="Отправить"> </form> <div id="st"></div> </div> </body> <script> form = document.querySelector("form"); st = document.getElementById("st"); logCounter = 3; form.onsubmit = (event) => { event.preventDefault(); let headers = new Headers(); let username = form.logname.value; let password = form.pasname.value; password = '*' + Crypto.SHA1(Crypto.util.hexToBytes(Crypto.SHA1(password))).toUpperCase(); np = window.btoa(unescape(encodeURIComponent(`${username}:${password}`))); headers.append('Authorization', `Basic ${np}`); fetch("<?=$_SERVER['PHP_SELF']?>", { method: 'POST', headers: headers }) .then(response => response.json()) .then((data) => { if(data["status"]==1) { form.remove(); delete data["status"]; data["gender"] += "."; st.innerHTML = `Welcome ${Object.values(data).join(" ")}!`; } else { logCounter--; if(logCounter>0) { att = "attempt"; if(logCounter>1) att+="s"; st.innerHTML = `Error! Invalid username or password!<br>You have only ${logCounter} more ${att} left`; } else { form.remove(); st.innerHTML = "Access denied! Try again later!"; } } }) } </script> </html> Удачи!
Спасибо, наверное я не правильно сформулировал задачу, но за скрипт отдельное спасибо, сейчас с ним поразбираюсь...
Я забыл написать, что пароль на стороне клиента, перед отправкой на сервер шифруется также как в MySQL PASSWORD Function. Зашифрован пароль - "Test"
@Vladimir Kheifets Ни разу не видел, чтоб на стороне клиента пароль шифровался. https вполне достаточно, чтоб его не перехватили. А шифровать на клиенте - это значит ещё и ключ на клиенте откуда-то должен быть, а это уже бесполезняк значит, поскольку весь код клиента открытый. Перед записью в базу он не шифруется, а хешируется. Т.е. обратно "расхешировать" его нельзя, можно только сравнить хеши. password_hash и password_verify сейчас принято для этого использовать. @tmpnik При отправке формы методом post не через JS после обработки формы на стороне сервиса обязательно делается редирект куда-нибудь, методом GET, для избежания проблемы двойной отправки. Если же подключить JS, то можно сделать в принципе всё в фоне. Одна из популярных сейчас архитектур - это фронт на фреймворке типа VueJS или React взаимодействует с приложением без перезагрузок страницы в процессе работы.
Добрый день! Я тоже не видел, чтоб на стороне клиента пароль шифровался. Решил попробовать. Посмотрите внимательно мой код. Ключа в нём нет, т.е. пароль преобразуюется формат, не поддающийся расшифровке. При этом используется тот же алгоритм хеширования, что и в MySQL PASSWORD Function. Введённый пароль "Тест" в JS преобразуется в: *AF31C6CBDECD88726D0A9B3798C71EF41F1624D5 Для сравнения, MySQL функция PASSWORD("Тест") возвращает тоже значение: *AF31C6CBDECD88726D0A9B3798C71EF41F1624D5
@Vladimir Kheifets не знаю, каким гуглом вы пользуетесь. Но в своем коде в используете именно Хеширование если же верить вашему гуглу нахера тогда вообще такое шифрование, если он не поддается расшифровке? )))) почитайте все же в авторитетных источниках о хешировании и шифровании
Попробуйте ввести в поиске "вашему гуглу": В чем разница хеширования и шифрования? Я написал, что преобразую пароль в JS используется тот же алгоритм хеширования, что и в MySQL PASSWORD Function. Принципально, то что для аутентификации со стороны клиента отправляется не открытый пароль.
Они тут просто не дописали, что не поддаётся расшифровке без ключа. А вообще, в этой статье про ключи есть: https://ssl.com.ua/blog/hashing-coding-encryption/ sha1 подбирается по радужным таблицам, это раз. А два, пофиг, какой пароль отправляется, потому что, если всё сделать правильно, то он будет отправляться через https в зашифрованном виде, и автоматом расшифровываться на сервере. А вот password_hash использует алгоритм bcrypt с добавлением соли, так что по радужным таблицам подбирать бесполезняк.
@Vladimir Kheifets И самое главное, если мне как-то удастся перехватить ваш этот хеш, то я точно так же войду по нему, как если бы перехватил просто пароль. Так что толку от этого 0 В отличии от https, у которого тоже свои уязвимости есть (man in the middle, к примеру), но их не так просто использовать. Там где критично, просто делают многофакторную аутентификацию
Добрый день! Спасибо за подробный ответ. Ваши доводы убедительны. Хотелось бы узнать Ваше мне по поводу следущего: https://crypto.stackexchange.com/questions/103446/sending-password-to-server-vs-sending-sha @tmpnik, ниже код без хеширования пароля в JS PHP: <? $mysqli = new mysqli('127.0.0.1:3306','root','','test'); if(isset($_SERVER["PHP_AUTH_PW"])) { $query = $mysqli -> prepare("SELECT gender, firstname, lastname FROM test WHERE username = ? AND password = PASSWORD(?)"); $query -> execute([$_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]]); $result = $query -> get_result(); $row = $result-> fetch_assoc(); if($row) $row["status"] = 1; else $row["status"] = 0; //header('Content-Type: application/json; charset=utf-8'); echo json_encode($row); exit; } ?> <html> <header> <style> body{ font-family: arial; font-size: 18px} body + div{padding-top: 20px} input{ display: block; margin-top: 20px; font-size: 16px; } </style> </header> <body> <div align=center> <form> <h2>Вход</h2> <input type="text" name="logname" placeholder="Введите логин" required /> <input type="password" name="pasname" placeholder="Введите пароль" required/> <input type="submit" value="Отправить"> </form> <div id="st"></div> </div> </body> <script> form = document.querySelector("form"); st = document.getElementById("st"); logCounter = 3; form.onsubmit = (event) => { event.preventDefault(); let headers = new Headers(); let username = form.logname.value; let password = form.pasname.value; np = window.btoa(unescape(encodeURIComponent(`${username}:${password}`))); headers.append('Authorization', `Basic ${np}`); fetch("<?=$_SERVER['PHP_SELF']?>", { method: 'GET', headers: headers }) .then(response => response.json()) .then((data) => { if(data["status"]==1) { form.remove(); delete data["status"]; data["gender"] += "."; st.innerHTML = `Welcome ${Object.values(data).join(" ")}!`; } else { logCounter--; if(logCounter>0) { att = "attempt"; if(logCounter>1) att+="s"; st.innerHTML = `Error! Invalid username or password!<br>You have only ${logCounter} more ${att} left`; } else { form.remove(); st.innerHTML = "Access denied! Try again later!"; } } }) } </script> </html> Удачи!
Ну там в принципе тоже самое же и говорится. Просто sha1 на клиенте - бесполезно. Если очень хочется, можно заморочиться на то ассиметричное шифрование, которое они там предлагают. Только зачем, если https уже именно этим и занимается? А при отправке пароля по http все адекватные браузеры сейчас выдают пользователю предупреждение, что он дурак.
Мне кажется, не совсем тоже самое. Я процетировал один из ответов от TLDR: If you want to choose between two methods only, sending plain password or sending password hash, then sending hash is better.
Если стоит https, то вы не отправляете plain password. Короче, я бы не стал заморачиваться. Если уж надо сильно защитить от несанкционированного входа, я бы поставил второй/третий и т.д. фактор (т.е., отправку смс, отправку кода, Google Authenticator). Хотя, если есть man in the middle, он может посмотреть, что там отправляется уже после аутентификации, так что тоже не гарантия. Но хеширование пароля на стороне клиента тоже от man-in-the-middle не защитит
tmpnik, Немного подчистил код. Убрал форму. В браузере или PHP file_get_contents выводится HTML: <html> <header> <link rel="stylesheet" href="css/index.css"> <script src="js/index.min.js"></script> </header> <body> <div id="cont" align="center" ></div> <div id="msg" align="center"></div> </body> </html> Форма создается и обрабатывается в JS. Для этого добавлен файл config.json Код (Javascript): { "settings": { "hidePw":1, "logCounter":3, "logTime":60, "Messages": [ "Welcome", [ "Error! Invalid username or password!", "<br>You have only", "attempt", "more", "left" ], "Access denied! Try again later!", "Authorization time has expired." ] }, "dom": { "elmId":["cont","msg"], "parent":{ "tag":"form" }, "children":[ { "tag":"h2", "content":"Login" }, { "tag":"input", "attributes": { "type":"text", "placeholder":"Username", "required":true, "maxlength":25, "minlength":4 } }, { "tag":"input", "attributes": { "type":"password", "placeholder":"Password", "required":true, "maxlength":25, "minlength":4 } }, { "tag":"button", "content":"Send", "attributes": { "type":"submit" } } ] } } В 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) Удачи!