Դաս 80 – PHP: Encrypting Passwords

0

Առաջին script-ը, որին պետք է նայեք`

<?PHP

$uname = “”;

$pword = “”;

$errorMessage = “”;

if ($_SERVER[‘REQUEST_METHOD’] == ‘POST’) {

          require ‘../../configure.php’;

          $uname = $_POST[‘username’];

          $pword = $_POST[‘password’];

          $database = “login”;

          $db_found = new mysqli(DB_SERVER, DB_USER, DB_PASS, $database );

          if ($db_found) {                

                   $SQL = $db_found->prepare(‘SELECT * FROM login WHERE L1 = ?’);

                   $SQL->bind_param(‘s’, $uname);

                   $SQL->execute();

                   $result = $SQL->get_result();

                   if ($result->num_rows > 0) {

                             $errorMessage = “Username already taken”;

                   }

                   else {

                             $phash = password_hash($pword, PASSWORD_DEFAULT);

                             $SQL = $db_found->prepare(“INSERT INTO login (L1, L2) VALUES (?, ?)”);

                             $SQL->bind_param(‘ss’, $uname, $phash);

                             $SQL->execute();

 

                             header (“Location: login.php”);

                   }

          }

          else {

                   $errorMessage = “Database Not Found”;

          }

}

?> 

          <html>

          <head>

          <title>Basic Signup Script</title>

          </head>

          <body>

<FORM NAME =”form1″ METHOD =”POST” ACTION =”signup.php”>

Username: <INPUT TYPE = ‘TEXT’ Name =’username’  value=”<?PHP print $uname;?>” >

Password: <INPUT TYPE = ‘TEXT’ Name =’password’  value=”<?PHP print $pword;?>” >

<P>

<INPUT TYPE = “Submit” Name = “Submit1”  VALUE = “Register”>

</FORM>

<P>

<?PHP print $errorMessage;?>

          </body>

          </html>

 Դուք կարող եք փորձարկել այն: Կտեսնեք հասարակ login էջ username-ի  և գաղտնաբառի համար նախատեսված textbox-երով, ինչպես նաև Register button: Դա կունենա հետևյալ տեսքը՝

signup_page

Գրե՛ք username-ը և  գաղտնաբառը և հիշեք, քանի որ դրանք Ձեզ պետք են գալու login էջի համար:

Սեղմե՛ք կոճակը գրանցվելու համար և կտեսնեք էջին արտատպված “item inserted” :

signup_page2

Բացե՛ք signup.php script-ը և նայեք կոդին: (Դա կգտնեք Ձեր կողմից ներբեռնված ֆայլերի մեջ): Այս form-ի HTML-ը կարող եք գտնել էջի ներքևում: Այն չունի ոչ մի առանձնահատուկ բան, բայց ուշադրություն դարձրեք, որ HTML Body section-ում կա PHP արտատպված հայտարարություն՝

<?PHP print $errorMessage;?>

Սա օգտատերերին error message-ներ ցուցադրելու համար է՝

Script- առաջին տողը մի քանի փոփոխականներ սահմանելու համար է՝

$uname = “”;
$pword = “”;
$errorMessage = “”;

Կոդի հաջորդ մասում մենք ստուգում ենք  արդյոք form-ը POSTED արվել է, թե՞ ոչ: (արդյոք Register button-ը սեղվե՞լ է):

if ($_SERVER[‘REQUEST_METHOD’] == ‘POST’) {
}

Այնուհետև մենք textbox-երից վերցնում ենք username-ը և գաղտնաբառը՝

$uname = $_POST[‘username’];
$pword = $_POST[‘password’];

Եվ փորձում ենք կապվել դատաբազայի և սերվերի հետ՝

require ‘../../configure.php’;
$database = “login”;
$db_found = new mysqli(DB_SERVER, DB_USER, DB_PASS, $database );

Այժմ մենք ունենք երկու խումբ dot/dot/slash մինչև require configure.php-ն: Դա այն պատճառով է, որ մենք մեզ համար ստեղծել ենք folder, որտեղ պահվում են login script-երը: Այնուամենայնիվ,  login credential-ները root folder-ում պահելը լավ միտք չէ: Մեր login credential-ները root folder-ից դուրս են,  և ունենք երկու խումբ dot/dot/slash:

Մեր գրած դատաբազայում $db_found կոչվող փոփոխականը ճիշտ կլինի:  Դա մենք կստուգենք հաջորդ տողերում՝

if ($db_found) {
}

else {

$errorMessage = “Error logging on”;

}

Եթե դատաբազան չի գտնվում, ապա որոշակի տեքստ ավելանում է error հաղորդագրության փոփոխականին: Եթե դատաբազան գտնվում է, մենք սահմանում ենք prepared statement՝

$SQL = $db_found->prepare(‘SELECT * FROM login WHERE L1 = ?’);

$SQL->bind_param(‘s’, $uname);
$SQL->execute();

Ուշադրություն դարձրեք SQL-ին առաջին տողում՝

SELECT * FROM login WHERE L1 = ?

Մենք ուզում ենք նշել միայն L1 column-ը, որը username-ն է: Մենք պիտի համոզվենք, որ այս column-ը ունի unique value,  ինչը նշանակում է, որ չեն կարող լինել երկու մարդ միևնույն username-ով: Դա անելու համար մենք պետք է  SQL query-ից ստանանք արդյունքները՝

$result = $SQL->get_result();

Եթե որևէ արժեքներ վերադարձվել են, ապա մենք գիտենք, որ  username-ը զբաղված է:  Այսպիսով, մենք կարող ենք ցուցադրել հաղորդագրությունը՝

if ($result->num_rows > 0) {

$errorMessage = “Username already taken”;

}

Եթե ոչ մի արժեք չի վերադարձվում, ապա մենք կարող ենք առաջ  գնալ և դատաբազային  username ավելացնել:

else {

$phash = password_hash($pword, PASSWORD_DEFAULT);

$SQL = $db_found->prepare(“INSERT INTO login (L1, L2) VALUES (?, ?)”);
$SQL->bind_param(‘ss’, $uname, $phash);
$SQL->execute();

print “item inserted”;

}

Նոր կոդի առաջին տողում մենք սահմանում ենք encryption՝

$phash = password_hash($pword, PASSWORD_DEFAULT);

password_hash PHP ֆունկցիայի փակագծերի մեջ մեզ պետք է որոշակի տեքստ encrypt անելու համար: Ստորակետից հետո Դուք հստակեցնում եք encryption algorithm-ը, որը ցանկանում եք կիրառել: Կարող եք օգտագործել կամ PASSWORD_DEFAULT կամ PASSWORD_BCRYPT:  PASSWORD_DEFAULT-ը տալիս է Ձեզ bcrypt algorithm: Խորհուրդ է տրվում Ձեր դատաբազայում ստեղծել 255 նիշ երկարությամբ field: Այս երկու ալգորիթմների մասին ավելի մանրամասն ինֆորմացիա ստանալու համար նայե՛ք այստեղ՝

http://php.net/manual/en/function.password-hash.php

Հենց որ password_hash-ը արել է իր գործը, այն կամ կվերադարձնի Ձեզ hashed (and salted) գաղտնաբառը կամ կվերադարձնի  false, եթե ինչ որ բան սխալ է:

Երբ մենք ունենք hashed password, մենք կարող ենք սահմանել մեկ այլ prepare statement՝

$SQL = $db_found->prepare(“INSERT INTO login (L1, L2) VALUES (?, ?)”);
$SQL->bind_param(‘ss’, $uname, $phash);
$SQL->execute();

header (“Location: login.php”);

 SQL տողը հետևյալն է՝

INSERT INTO login (L1, L2) VALUES (?, ?)

$SQL->bind_param(‘ss’, $uname, $phash);

Մեզ մնում է միայն իրականացնել և արտատպել որևէ բան՝

$SQL->execute();
header (“Location: login.php”);

Վերջին տողը վերաուղղորդում է օգտատիրոջը դեպի login էջ: Եթե վերցրել եք օգտատիրոջ email հասցեն, ապա կարող եք նրան տեղեկացնել, որ ամեն ինչ հաջող է ընթացել: Սակայն պետք չէ ուղարկել նրանց նոր գաղտնաբառը պարզունակ տեքստով:

Հարգելի ընթերցող, խնդրում ենք չմոռանալ like տալ մեր ֆեյսբուքյան էջին, քանի որ նորությունների մեծ մասը առաջինը տեղադրվում է հենց այնտեղ։ Ինչպես նաև հետևեք մեզ այլ սոցիալական ցանցերում և, իհարկե, գրանցվեք մեր բլոգում։

Share.