Автор Тема: Осоляване на парола в регистрационна система  (Прочетена 3248 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
В базата данни имаш зашисана криптираната парола като стринг (нещо от тоя сорт $2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a), и сега трябва да провериш, дали аджеба има такъв потребител, с абсолютно същия стринг записан като парола. Това въпросно нещо, вместо с md5, не може ли да стане по този начин?

Код: PHP
  1. $sql = "SELECT *
  2.        FROM `" . USERS_TABLE . "`
  3.        WHERE user_name = '$user_name'
  4.            AND user_pass = '" . password_hash($user_pass, PASSWORD_DEFAULT) . "'";
  5.  
  6. $result = mysqli_query($connect, $sql);

С това което си ми дал само рефрешва и не се логва, пробвал съм го вече. Друга идея?
Сега ще опитам с примера на ХанКрум макар и да не разбирам кое къде е...

--------

По-този начин не става,пробвал съм го и само рефрешва страницата. Други идеи имаш ли ?

Ето пример:
Код: PHP
  1. if (\password_verify($pass, $res['pass']) === true) {
  2. // логване
  3. } else {
  4. // нелогване
  5. }
като $pass е от логинформата, $res['pass'] е хеша е от базата-данни.

Какъв е този $res['pass'] ? От къде е това $res ?
« Последна редакция: 15 Юни 2016, 22:41:29 от Avalanche »

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Праща ми го два пъти. Извинявам се! ... :@

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 269
  • Публикации: 2595
  • meow
Какво значи "само рефрешва и не се логва"?

Рефрешва се защото така си казал:

Код: PHP
  1. if ($row = mysqli_fetch_array($result)) {
  2.     $_SESSION['user_id'] = $row['user_id'];
  3.     $_SESSION['user_name'] = $row['user_name'];
  4.     $_SESSION['user_avatar'] = $row['user_avatar'];
  5.     $_SESSION['user_mail'] = $row['user_mail'];
  6.     header("Location: index.php");
  7. }

Нямаш логика която да ти движи логина, какво очакваш да се случи? Дай един var_dump($_SESSION) и виж какво ще излезе (стига да си я пуснал със session_start(), разбира се)...
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
само това ми дава ... array(0) { }
Имам сешън старт в отделен файл деклариран най-отгоре във файла global.inc.php
« Последна редакция: 15 Юни 2016, 23:02:00 от Darnel »

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 120
  • -Получени: 73
  • Публикации: 994
  • Кибик
Май се учиш да скачаш преди да си се научил да ходиш. Написал съм ти кое какво е. И това, което съм ти дал не е готово решение, а пример!
« Последна редакция: 17 Юни 2016, 10:55:42 от HanKrum »
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 269
  • Публикации: 2595
  • meow
Щом се рефрешва страницата, значи намира запис в базата данни (имаш на лице потенциален логин). Остава само да си реализираш това в кода, използвай exit функцията за да спреш рефреша и да може да си провериш променливите и кода с var_dump.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Щом се рефрешва страницата, значи намира запис в базата данни (имаш на лице потенциален логин). Остава само да си реализираш това в кода, използвай exit функцията за да спреш рефреша и да може да си провериш променливите и кода с var_dump.
Не рефрешва. Изкарва ми грешката за невалидни потребител и парола...
Exit къде да го използвам точно в кой ред ми е мисълта?

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 120
  • -Получени: 73
  • Публикации: 994
  • Кибик
Първо,  htmlspecialchars ти е напълно излишно! Защо? Защото юзернейма няма да го вземаш от POST директно, че да хо показваш, защото е глупаво, паролата ще бъде сравнена с хеша от базата-данни и там не те бърка какви хтмл-и е въвел логващия се.
Второ, sql-a за логин не трябва да е така както си написал:
Код: PHP
  1. $sql = "SELECT * FROM `".USERS_TABLE."` WHERE user_name = '$user_name' AND user_pass = '".md5($user_pass)."'"
,
а трябва да е:
Код: PHP
  1. $sql = "SELECT user_pass FROM `".USERS_TABLE."` WHERE user_name = '$user_name';"
, защото ти трябва записания хеш за да го провериш с password_verify.
Трето, изнеси си всички проверки и нормализации и валидации във функции, така по-лесно се чете и редактира.
Четвърто, проверявай си, дали правилно си инклуднал файловете и какво получаваш на изхода с var_dump.
Пето,
Код: PHP
  1.  htmlspecialchars($_POST['user_avatar'])
глупаво е да филтрираш линк до снимка или снимка по този начин.
Шесто, не смесвай PHP код с HTML.
Има още страшно много, но дано си разбрал поне това ;)
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Ювиги Хане. Започвам съвсем отначало знанията си тъй-като преди време започнах да скачам преди още да съм проходил както ти се изрази. Ще опитам да направя всичко стъпка по стъпка както си ми го обяснил. Наясно съм че не трябва да смесвам двата езика но това е за първо време докато си оправя знанията и започна да работя нормално. Благодаря ти наистина много както и на Аваленч. Ще поправя кода и ще споделя резултата.

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Пробвах , мъчих се и нищо не стана.
Ще предоставя моя код и ще помоля за редакция така че да разбера как точно става всичко.
Вкарвам в базата записания хеш от пост заявката а в логин формата не мога да направя така че да взема и да сравня хеша просто не мога да го разбера за това и моля за редакция по кода ми :)

Имам сял
Код: MySQL
  1. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
  2. SET time_zone = "+00:00";
  3.  
  4. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  5. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  6. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  7. /*!40101 SET NAMES utf8mb4 */;
  8.  
  9.  
  10. CREATE TABLE `users` (
  11.   `user_id` int(11) NOT NULL,
  12.   `user_name` varchar(150) NOT NULL,
  13.   `hash` varchar(300) NOT NULL,
  14.   `user_mail` varchar(150) NOT NULL,
  15.   `user_avatar` varchar(255) NOT NULL DEFAULT 'profiles/avatars/noava.png',
  16.   `user_active` int(1) NOT NULL DEFAULT '0',
  17.   `registered` datetime NOT NULL
  18. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  19.  
  20.  
  21. ALTER TABLE `users`
  22.   ADD PRIMARY KEY (`user_id`);
  23.  
  24.  
  25. ALTER TABLE `users`
  26. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  27. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  28. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

register.php
Код: PHP
  1. <?php
  2. include('Global/global.inc.php');
  3.  
  4. if (isset($_SESSION['user_name'])) {
  5.         header("Location: index.php");
  6. }
  7.  
  8. include('Global/View/view.register.php');
  9.        
  10. //Set error as false
  11. $error = FALSE;
  12.        
  13. //Check if signup form is send
  14. if (isset($_POST['signup'])) {
  15.         $user_name = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_name']));
  16.         $user_pass = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_pass']));
  17.         $hash = password_hash($user_pass, PASSWORD_DEFAULT);
  18.         $user_repass = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_repass']));
  19.         $user_mail = mysqli_real_escape_string($connect, $_POST['user_mail']);
  20.         $user_avatar = mysqli_real_escape_string($connect, $_POST['user_avatar']);
  21.        
  22. //Check if username is already in use
  23. $user_check = mysqli_query($connect, "SELECT user_name FROM ".USERS_TABLE." WHERE user_name='$user_name'");
  24. $do_user_check = mysqli_num_rows($user_check);
  25.  
  26. //If email is already in use
  27. $email_check = mysqli_query($connect, "SELECT user_mail FROM ".USERS_TABLE." WHERE user_mail='$user_mail'");
  28. $do_email_check = mysqli_num_rows($email_check);
  29.  
  30. //Display Errors
  31. if($do_user_check > 0){
  32.         $error = TRUE;
  33.         echo '<font color=\'red\'>Username is already in use!</font><br />';
  34. }
  35.  
  36. //Checking username lenght
  37. if (mb_strlen($user_name, 'UTF-8') < 6 && mb_strlen($user_name, 'UTF-8') > 100) {
  38.         $error = TRUE;
  39.                 echo '<font color=\'#FF0000\'>Username must be minimum of <b>6</b> and maximum of <b>100</b> characters</font><br />';
  40. }
  41.  
  42. if($do_email_check > 0){
  43.         $error = TRUE;
  44.         echo '<font color=\'red\'>Email is already in use!</font><br />';
  45. }
  46. else {
  47.        
  48. //Username can contain only alpha character and space
  49. if (!preg_match("/^[a-zA-Z0-9]+$/", $user_name)){
  50.         $error = TRUE;
  51.                 echo '<font color=\'#FF0000\'>Name must be only with alphabets and space</font><br />';
  52. }
  53.  
  54. //Check email is valid
  55. if (!filter_var($user_mail, FILTER_VALIDATE_EMAIL)) {
  56.         $error = TRUE;
  57.                 echo '<font color=\'#FF0000\'>Invalid Email Adress. Please enter a valid email adress</font><br >';
  58. }
  59.        
  60. //Checking password lenght
  61. if (mb_strlen($user_pass, 'UTF-8') < 6 && mb_strlen($user_pass, 'UTF-8') > 250) {
  62.         $error = TRUE;
  63.                 echo '<font color=\'#FF0000\'>Password must be minimum of <b>6</b> characters and maximum of <b>250</b></font><br />';
  64. }
  65.  
  66. //Cheking Passwords match
  67. if ($user_pass != $user_repass) {
  68.         $error = TRUE;
  69.                 echo '<font color=\'#FF0000\'>Passwords doesn\'t match</font><br />';
  70. }
  71.  
  72. //If we no have error query will send to datebase
  73. if (!$error) {
  74.         if(mysqli_query($connect, "INSERT INTO `".USERS_TABLE."` (user_name, hash, user_mail, user_avatar) VALUES('$user_name', '$hash', '$user_mail','$user_avatar ')")) {
  75.             echo "<font color=\'green\'>Successfully Registered! </font><br /><a href='signin.php'>Click here to Sign in</a><br />";
  76.         } else {
  77.             echo "<font color=\'red\'>invalid registration!</font>";
  78.         }
  79.     }  
  80. }
  81. }

login.php
Код: PHP
  1. <?php
  2. include('Global/global.inc.php');
  3.  
  4. if(isset($_SESSION['user_name'])!='') {
  5.     header("Location: index.php");
  6. }
  7.  
  8. include('Global/view/view.login.php');
  9.  
  10. //check if form is submitted
  11. if (isset($_POST['signin'])) {
  12.  
  13.     $user_name = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_name']));
  14.     $user_pass = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_pass']));
  15.         $result = mysqli_query($connect, "SELECT * FROM `" . USERS_TABLE . "` WHERE user_name = '$user_name' AND user_pass = '$user_pass'");
  16.  
  17.         if (empty($user_name) || empty($user_pass)) {
  18.                 echo "empty fields";
  19.         }
  20.                 if ($row = mysqli_fetch_array($result)) {
  21.                         $_SESSION['user_id'] = $row['user_id'];
  22.                         $_SESSION['user_name'] = $row['user_name'];
  23.                         $_SESSION['user_avatar'] = $row['user_avatar'];
  24.                         $_SESSION['user_mail'] = $row['user_mail'];
  25.                        
  26.                         header("Location: index.php");
  27.                        
  28.                 }
  29.         else {
  30.  
  31.         echo 'Invalid Username or Password!<br />';
  32.     }
  33. }

index.php
Код: PHP
  1. <?php
  2. include('Global/global.inc.php');
  3.  
  4. if (isset($_SESSION['user_name'])) {
  5.         $user_id = $_SESSION['user_id'];
  6.         $user_name = $_SESSION['user_name'];
  7.         $user_avatar = $_SESSION['user_avatar'];
  8.                 echo "Welcome, ".$user_name."<br /><br />
  9.                 <a href='profile.php?user_id=".$user_id."' alt='' target='_blank'>View Profile</a><br /><br />
  10.                 <img src='".$user_avatar."' alt='".$user_avatar."' width='150' height='150'><br /><br />
  11.                 <form action='signout.php' method='POST'><input type='submit' name='signout' value='Sign Out'></form>";
  12. } else {
  13.         echo '<br /><br /><a href="signin.php">Sign in</a><br /><br /><a href="signup.php">Sign Up</a>';
  14. }
  15.  
« Последна редакция: 16 Юли 2016, 20:25:31 от Avalanche »

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Съжалявам за няколкото натрупани поста но понеже нямам отговор и си решавам проблема сам се получава така.
И така проблема ми е решен с малко разчовъркване.
Ето го и редактирания логин.пхп

Код: PHP
  1. <?php
  2. include('Global/global.inc.php');
  3.  
  4. if(isset($_SESSION['user_name'])) {
  5.     header("Location: index.php");
  6. }
  7.  
  8. include('Global/view/view.login.php');
  9.  
  10. //check if form is submitted
  11. if (isset($_POST['signin'])) {
  12.  
  13.     $user_name = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_name']));
  14.     $user_pass = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_pass']));
  15.         $result = mysqli_query($connect, "SELECT * FROM `" . USERS_TABLE . "` WHERE user_name = '$user_name'");
  16.  
  17. //Now we check if we have empty fields
  18.         if (empty($user_name) || empty($user_pass)) {
  19.                 echo "empty fields";
  20.         }
  21. //Check password hash from db and login deatils
  22.                 if ($row = mysqli_fetch_array($result)) {
  23.                         $hashed = $row['hash'];
  24.                        
  25.                 //if password verify = true
  26.                         if (password_verify($user_pass, $hashed)) {
  27.                                 $_SESSION['user_id'] = $row['user_id'];
  28.                                 $_SESSION['user_name'] = $row['user_name'];
  29.                                 $_SESSION['user_avatar'] = $row['user_avatar'];
  30.                                 $_SESSION['user_mail'] = $row['user_mail'];
  31.                                
  32.                                 header("Location: index.php");
  33.                         }
  34.  
  35.                 }
  36.         else {
  37.  
  38.         echo 'Invalid Username or Password!<br />';
  39.     }
  40. }

Какво направих? Просто направих проверката на password_verify коректно а именно да сравнява паролата от логин заявката с хеша от базата данни и ако те са еднаки да се впише и естествено се вписва.
« Последна редакция: 16 Юли 2016, 20:24:46 от Avalanche »