image

PHP - somo la 48: Jinsi ya kuzuia hacking kwenye sytem ya kujisajili na ku login

Katika somo hili utajifunza jinsi ambavyo utaweza kutengeneza mfumo wa kuisajiki na ku login, kisha kuangalia usalama wa mfumo kwa kuzuia sql injection.

Katika somo hili utakwenda kujifunza jinsi ya kuzuia injection. Nitakueleza jinsi ambavyo nimefanya mabadiliko ya kiusalama kutoka kwenye somo lililotangulia. Hivyo basi hakikisha umelielewa vyema somo lililotangulia pia uwe umefanyia mazoezi.

 

MABADILIKO YA KIUSALAMA:-

  1. Katika kujisajili

  2. Kwenye login na register form nimeongeza kipengele cha required maana yake kama atatuma empty form itakataa. N ahata akituma kwenye php code hataona chochote maana tumetumia isset()  na empty() tulisha jifunza kuhusu isset() function na inavyofanya kazi. Hi ya empty ni sawa na hii isset.

 

  1. Atakapoanza kujisajili na kutuma data kwanza zitakaguliwa kama ni empty hatapata action yeyote. Endao data zitakuwa zipo kwanza zitaangaliwa ni lazima jina liwe na angalau character 4 kama ni chini ya hapo atapata meseji itakayimtaka aoneze caracter kwenye jina. Endapo jitakuwa ni zaidi ya 4hatuw aitakayofuata ni kuangalia kama password ina character kuanzia 6, endapo zipo chini ya hapo atapata meseji inayomtaka aongeze character. 

 

  1. Endapo zitakuwa kuanzia 6 hatuwa inayofuata ni kuangalia kama email ina character kuanzia 8, endapo zitakuwa pungufu ya hizo atapata ujumbe unaomtaka arekebishe email yake. Endapo zitakuwa kuaznia 8 hatuwa inayofuata ni ku sanitize email. 

 

  1. Tunafanya sanitizing ili kuondoa code ambazo zipo kwenye email ambazo zinaweza kufanya injection. Endapo itafaulu kwenye sanitizing itafanyiwa validation kuona kweli ni email iliyo sawa kimpangilio. Endapo itafeli kwenye validation na sanitizing atapata ujumbe unaohitaji kuangalia vyema email. 

 

  1. Baada ya kukamilika uchunguzi wa email hatuwa nyingine ya muhimu ni kuangalia je mtumiaji mwenye email kama hiyo yupo kwenye database. Endapo email hiyoimeshatumia kaba atapata ujumbe kuwa mtumiaji mwenye email hiyo yupo hivyo abadili email. Kufanya hivi tuta select count(id) ili kuangalia je kuna id ngap zenye email hiyo.kama jibu ni 0 maana yake hakuna hiyo email kwenye databse hivyo ataendelea na usajili. Kuhusu ku count() tulishajifunza kwenye mafunzo ya qsl level 1 na mafunzo ya php level 2.

 

  1. Hatuwa inayofuata ni ku encrypt email baada ya kuwa ipo sawa. Tafadhali  pitia somo la ku encrypt ili upate kuelewa vyema. Email ikiwa encrypted maana yake haitakuwa katika sura ya kawaida. Baada ya ku encrypt email sasa ni muda wa kucheza na jina.  Nimeongeza mafaili mawili ya ecription na decription ili kupunguza kuandika code hizi kila sehemu. Kisha nime include mafaili hayo kila panapohitajika.

 

  1. Jina nalo litapitia hatuwa kama hizo za kusanitize,na ku validate, kisha ku encrypt. Halafu na password yenyewe haina valifdation ili tutaifanyia hashing moja kwa moja. Tulisha zungumzzia somo hili kw aurefu zaidi. Katika njia zilizofundishwa hapa tutatumia password_hash().

 

  1. Kipengele kilichoongezeka ni uniqu_id kwenye column za database. Tofauti na id kutakuwa na uniqu_id ambayo ni string zilizo hashed kwa kutumia sha1(). Hii itatusaidia katika ku view taarifa za user kuwa unique na sio rahisi kujuwa user mwingine.

 

  1. Baada ya hapo tutatumia prepared query kusajili watumiaji wapya kwenye database. Endapo kila kitu kitakuwa sawa basi mtumiaji atapelekwa kwenye ukurasa wa ku login.

 

2. Katika ku login

  1. Kama ilivyo kwenye html formkuna required ni lazima taarifa ziwe zimejazwa. Na hata kama hajajaza tumetumia isset() kuangalia kama ni empty

 

  1. Bada ya hapo hatuwa ya kwanza ni ku sanitize jina na kuvalidate. Endapo itafeli atatakiwa kuangaliajian ikifanikiwa hatuwa ya pili ni ku encrypt jina. Tunafanya hivi ili kwamba tujeweza kulinganisha jina hili na lile ambalo tayari lipo kwenye databse ambalo nalo ni encrypted. Kwakuwa hatuhitaji email ku log in hivyo tumepunguza kazi.

 

  1. Sasa tunatakiwa kwanza tuangalie je kwenye database tuna mtu ama watu wenye jina kama hilo. Kufanya hivi tutatumia count(id) ambazo zina jina kama hilo. Endapo jibu ni 0 maana yake mtumiaji huyo hayupo hivyo ahakikishe jina lake. Ikiwa jibu ni tofauti na 0 maana yke jina hilo lipo.

 

  1. Hatuwa inayofuata ni kuhakikisha password. Kufanyanhivi kw akuwa ndia ya ku hash password tumetumia password_hash() basi ku verify tutatumia password_verify(). Tulisha jifunza habari hii kwenye masomoyaliopita. Endapo passowrd iliyokuwepo kwenye database ni sawa na password hii tulio ihash baada ya mtumiaji kuingiza zipo swa basi taanza ku start session, ili kwenda kwenye log in.

 

  1. Ili kuanzisha session kuna faili jipya nimeongeza ambalo lina function ya kustart session. Faili hili nimeli include mwanzo mwa kila faili.tulisha jifunza kuhusu session katika masomoyaliopita. Session inabeba taarifa ambazo utahitaji zitumike kwenye page za website yako. Kwa mfano kubeba jina la mtumiaji popote alipo kwenye hiyo website. Session yetu hapo inabeba jina na id. Jina kwa ajili ya utambulishi na id kwa ajili ya ku view profile. Function ya kuanzisha session session_start()

 

  1. Kila kitu kikiwa sawa atapelekwa kwenye dash boarda ambayo itamtambuwa kwa session ya jina lake. Kwenye dashboard hakuna mabadiliko makubwa sana. Ila kwa kuwa data zetu tume zi encrypt kwenye database basi hapa tutatikiwa ku decryp ili tuweze kuzisoma vinginevyo hatutazielewa.

 

  1. Mabadiliko mengine yamefanyika kwenye view user kwenye dashboard yako. Kwanza nimetumia .htaccess faili ili kuondoa view.php?id=2 badala yake iwe /2 kisha baada ya kutumia id sasa nimetumia uniqu_id ambayo tumeingez akwenye databse. Hii itasaidia endapo umeshea profile ya mtu basi asiweze kujuwa pfrofile nyinginekwa kubadili id maaba kubadili uniqu_id na kupatia ni sawa na kugesi password.

 

JINSI YA KUANGALIA SESSION

Katika dashboard endapo mtu hajaloh in atakutana na ujumbe utakaomtaka a log in. hapi ni kwa kuwa kwanz atumeangalia je session ipo endapo sesstion ipo basi data zitaonekana vinginevyo ataambiwa login. 

 

Kufanya hivi tutatumia isset() ambapo ndani yake tutaweka session yetu tuliokuja nayo kwenye login. Sasa ili kuangalia kama session haipo tutatumia ! kwa kuwa isset yenyewe inaangalia uwepo na ukiweka ! maana yake unaangalia kinyume chake. Hivyo tutasema endapo hakuna session basi log in vinginevyo onyesha data

if(!isset($_SESSION['username'])):?>

<b><a class="btn btn-primary btn-lg" href="login.php">Login</a></b>

<?php else: ?>

// hapa zinakaa code ambazo zitaonekana kama session ipo

 

Mwisho wa ambapo unahitaji data zionekane kwa mwene session utaeka <?php endif; ?>

Kumaanisha hapa ndipo mwisho wa condition yetu ya IF kwenye isset(). Kwa kufanya hivi pia utaweza kuchaguwa ni user gani aende kwenye page fulani. Kwa mfano unaweza anzisha session yenye user status, ukasema kama status ni 0 basi aende user page na endapo status ni 1 aende kwenye admin page

 

CODE ZOTE HIZI HAPA

Code nimezihost hapa unaweza kuipitia website ila hakikisha unapojisajili hautumii email yako ya ukweli maana hii ni kwa ajilii ya majaribio https://mafunzo-php.epizy.com/ 

 

DATABASE kwenye id usisahau kuweka AI yaani Auto Increment

CREATE TABLE `users` (

  `id` int(11) NOT NULL,

  `username` varchar(50) NOT NULL,

  `email` varchar(50) NOT NULL,

  `password` varchar(255) NOT NULL,

  `status` int(1) NOT NULL,

  `uniqu_id` varchar(255) NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

INSERT INTO `users` (`id`, `username`, `email`, `password`, `status`, `uniqu_id`) VALUES

(22, 'c/F9XAOt', 'c/F9XAOtwGrr2Du9CWDORw==', 'e6e061838856bf47e1de730719fb2609', 1, '31bd5c8e2ba6cd0dbe9694c3517806da'),

(23, 'f/5nVBQ=', 'f/5nVBSY4Wnr0Dz/RGzM', 'e6e061838856bf47e1de730719fb2609', 1, 'c91dc55703dec21e97a1f14422b7c551'),

(24, 'aftwVAix', 'aftkWg+Y52Dn0D7/RGzM', '$2y$10$fad/ovBL5Ks8C092ixTV4O113JdrpwtSFkQYCzUlCr9k2Wx3SJRN6', 1, '33c6085f77ddec004aeba153fab13bfdeb0872cb'),

(25, 'aftwVAix8Q==', 'aftkWg+pwGrr2Du9CWDORw==', '$2y$10$ONfgN57G1PArvG4u2x6ju.Kgd6qQm.SF1.FJSVvrv4Zpg8VuD0VIC', 1, '90c841e1e74754cd524f5bc012b3f2bf1fb20b96'),

(26, 'ePxhWxc=', 'ePxhWxe+wGr10Ta2QzOPSTJt', '$2y$10$FQgeRwv7h24P7rS.gKi22eXAMPkKX55Xm9QDYclyG94Ek13MYtb5.', 1, 'ba3942282f8a35b325208a7ad7b33277564b787d'),

(27, 'bfVhUhO25Q==', 'bfVhUg63wGrr2Du9CWDORw==', '$2y$10$unD8wsT1lV2WUd9mqKJC/OT//urWXij/eJc6yboMNu7yn02M73vnS', 1, 'b18d6b961917d9e0e3791b7b1d35df75e3d9b114');

 

MUINEKANO WA MAFAILI YOTE:

 

  1. config.php

<?php

$servername = "localhost";

$username = "root";

$password = "";

$dbname = "sql";

// Kufanya connection

$conn = new mysqli($servername, $username, $password, $dbname);

 

// Kuangalia connection

if (mysqli_connect_error()) {

   die("you are not connected: ");

}

?>

 

  1. dashboard.php

<?php

include 'config.php';

include 'session.php';

?>

<html lang="en">

<head>

   <meta charset="utf-8">

   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

   <link rel="icon" href="favicon.ico">

   <title>Dashboard</title>

</head>

<body>

<?php

//kwa ajili ya kuangalia kama session imeanzishwa

if(!isset($_SESSION['username'])):?>

<b><a class="btn btn-primary btn-lg" href="login.php">Login</a></b>

<?php else: ?>

<?php include 'menu.php';?>

<?php

   $name = $_SESSION['username'];

   echo "Karibu"." ". $name;

?>

<table>

   <th>ID</th>

   <th>name</th>

   <th>Email</th>

   <th>View</th>

   <?php

   $myId =$_SESSION['id'];

   $status = 1;

   //select user wote wenye Id isiyofanana na yako. Kwa maana jna lako halitakuwepo kwenye list.

   //pia user ambaye ststus yake ni tofauti na 1 hatokuwepo kwenye list. Unaweza kutumia njia hii kuselect user maalumy

   $sql = $conn->prepare("SELECT * FROM users where id!=? and status =?");

 

   //s ni string, i ni int

   $sql->bind_param("ii",$myId, $status);

   $sql->execute();

   $result = $sql->get_result();

   while ($row =$result->fetch_assoc())

   {

       ?>

       <tr>

           <td><?php echo $row['id']; ?></td>

           <td><?php

               //decrypting jina

               $data = $row['username'];

               include 'decription.php';

                echo $decryption; ?>

           </td>

 

           <td><?php

               //decrypting email

               $data = $row['email'];

               include 'decription.php';

               echo $decryption; ?></td>

           <td><a href="<?php echo $row['uniqu_id']; ?> ">view</a> </td>

       </tr>

    <?php

   }

?>

</table>

<?php endif; ?>

</body>

</html>

 

  1. decryptio.php

<?php

 

$options = 0;

 

$cipher = "AES-128-CTR";

 

$decryption_iv = '1234567891011121';

 

$key = "Bong_cc293";

 

$decryption=openssl_decrypt ($data, $cipher,

   $key, $options, $decryption_iv);

 

  1. encrypt.php

<?php

//encrypt user id

$cipher = "AES-128-CTR";

 

$iv = openssl_cipher_iv_length($cipher);

$options = 0;

 

$encryption_iv = '1234567891011121';

 

$key = "Bong_cc293";

 

$encryption = openssl_encrypt($data, $cipher,

   $key, $options, $encryption_iv);

 

?>

 

  1. index.php

<html lang="en">

<head>

   <meta charset="utf-8">

   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

   <title>Login form</title>

   <link rel="icon" href="favicon.ico">

   <link rel="stylesheet" href="bootstrap.css">

   <link rel="stylesheet" href="style.css">

</head>

<body>

<h1 style="text-align: center">LOGIN AND REGISTRATION SYSTEM</h1>

<label></label>

<a href="login.php">

<button class="butn">Login</button></a><br><br>

<label></label>

<a href="register.php">

<button class="butn">Register</button></a><br><br>

<p style="text-align: center"><i >With love from <a href="https://bongoclass.com">Bongoclass</a> </i></p>

</body>

</html>

 

  1. login.php

 

<html lang="en">

<head>

   <meta charset="utf-8">

   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

   <title>Login form</title>

   <link rel="stylesheet" href="bootstrap.css">

   <link rel="stylesheet" href="style.css">

   <link rel="icon" href="favicon.ico">

</head>

<body>

<br><br>

 

<form method="post" action="login-script.php">

   <label for="name">User Name</label>

   <input type="text" id="name" placeholder="write your name" name="name" required="required"><br><br>

 

   <label for="password">Password</label>

   <input type="text" id="password" placeholder="write your password" name="password" required="required"><br><br>

 

   <label></label>

   <input type="submit" value="Login" name="login"><br><br>

   <p>You don't have an Account? <a href="register.php">Register</a> </p>

</form>

</body>

</html>

 

  1. login-script.php

<html lang="en">

<head>

   <meta charset="utf-8">

   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

   <title>Login form</title>

   <link rel="icon" href="favicon.ico">

   <link rel="stylesheet" href="bootstrap.css">

   <link rel="stylesheet" href="style.css">

   <style>

       b{text-align: center;

           color: red;

           font-family: "system-ui";

           font-size: 250%;

       }

   </style>

</head>

<body>

<?php

include 'config.php';

include 'session.php';

if (isset($_POST['login']) && !empty($_POST['login'])) {

//prepare variable

   $name = ($_POST['name']);

   $password = ($_POST['password']);

   $status = 1;

 

//uchujwaji wa jina au sanitization

//name2 ni jina ambalo limefanyiwa sanitization

   $name2 = filter_var($name, FILTER_SANITIZE_STRING);

   //uthibitishwaji wa jina au validation

   if (preg_replace('/[A-Za-z0-9-_]/', '', $name2)) {

       echo "<b>Andika jina vizuri</b>";

   } else {

       //ecrypt jina

       $data = $name2;

       include 'encrypt.php';

       //name3 ni jina ambalo tayari encrypted

       $name3 = $encryption;

 

       //Angalia kama jina alioweka mtumiji lipo kwenye database

       //tutatumia njia ya kuhesabu, kama itatoka 0 maana yake jina hilo halipo kabisa

       //tutaselect solumn zote ambazo tunazihitaji hapa

       $sql = $conn->prepare("SELECT count(id) as total_user, username, password, id, email FROM users where username = ?");

       //s ni string, i ni int

       $sql->bind_param("s", $name3);

       $sql->execute();

       $result = $sql->get_result();

       while ($row = $result->fetch_assoc()) {

           //varibale kutokana na data tulizozipata kwenye database

           $total_user = $row['total_user'];

           $userId = $row['id'];

           $username = $row['username'];

           $email = $row['email'];

           $saved_password = $row['password'];

 

           //hesabu kama kuna watumiaji wenye jina hilo.

           // Ikiwa ni sawa sawa na 0 maana hakuna mtumiaji huyo

           if ($total_user == 0) {

               echo "<b>Umekosea jina, hakuna mtumiaji huyo</b>";

           } else {

&">...



Kama unahitaji kuuliza maswali Bofya hapa





           

Je! umeipenda hii post?
Ndio            Hapana            Save post

Rajabu Tarehe 2024-05-10 14:53:23 Topic: PHP Main: Project File: Download PDF     Share On Facebook or Whatsapp Imesomwa mara 466


Sponsored links
👉1 Sira ya Mtume Muhammad (s.a.w)     👉2 Kitabu cha Afya     👉3 Madrasa kiganjani     👉4 Simulizi za Hadithi Audio     👉5 kitabu cha Simulizi     👉6 Kitau cha Fiqh    

Post zifazofanana:-

PHP somo la 52: Aina za access modifire na zinavyotofautiana.
Katika somo hili utakwenda kujifunza kuhusu access modifier ili kuweza kuthibiti nama ya kuzitumia properties kwenye class. Soma Zaidi...

PHP somo la 64: Jinsi ya kutengeneza database na kuingiza data kwa kuumia PDO
Katika somo hili utakwenda kujifunza jinsi ya kutumia PDO kutengeneza database, kuteneneza table na kuingiza data moja na zaidi ya moja. Soma Zaidi...

PHP - somo la 41: Jinsi ya kufanya hashing kwenye PHP
Katika somo hili utajifunza jinsiya kufanya hashing taarifa muhimu kama password. Kufanya hashing kunaongeza usalama wa taarifa za waumiaji kwenye blog yako. Soma Zaidi...

PHP somo la 49: utangulizi wa Object Oriented Programming katika PHP
Huu ni mwendelezo wa mafunzo ya PHP na hapa tunaaza rasmi advanced PHP. tutakwenda kuingia ndani zaidi kwenye PHP. Ni vyema kabla ya kuanza course hii ya advanced PHP uwe una uelewa wa kutosha kuhusu mafunzo yetu ya PHP. Soma Zaidi...

PHP BLOG - somo la 12: Jinsi ya kutumia prepared statement kwenye kusoma post za blog
Katika somo hili tutakwenda kutumia prepared ststement kwenye ku fetch data kutoka kwenye database. Soma Zaidi...

PHP somo la 83: Server Variables
Katika somo hili utakwend akujifunza kuhusu server variables Soma Zaidi...

PHP somo la 61: jinsi ya kufanya loop kwenye class kw akutumia foreach loop
Katika somo hili utakwenda kujifunza concept ya iteration kwenye PHP OOP hapa tutakwenda kuiona jinsi inavyofanya kazi pamoja na foreach loop Soma Zaidi...

PHP somola 78: Cookie Headers
Katika somo hili utakwenda kujifunza kuhusu Cookie Headers Soma Zaidi...

PHP - somo la 29: Jinsi ya kaundika function kwenye php
Katika somo hili utakwenda kujifundisha kuhus matumizi ya function kwenye php. Pia utajifunza jinsi ya kuandika function Soma Zaidi...

PHP - somo la 10: Jinsi ya kundika condition statement if, ifelse na switch case
Katika somo hili utakwenda kujifunza kuhusu condition statements if, ifelse na switch case. Hata utajifunza jnsi ya kuziandika na zinavyofanya kazi Soma Zaidi...

PHP - somo la 38: Jinsi ya ku upload mafaili zaidi ya moja kwa kutumia PHP
katika somo hili utajifunza jinsi ya ku upload multiple file yaani mafaili mengi kwa wakati mmoja kwa kutumia PHP Soma Zaidi...

PHP somo la 56:class interface na polymorphism kwenye PHP OOP
Katika somo hili utakwenda kujifunza concept ya interface na concept ya polymorphism kwenye PHP OOP. Soma Zaidi...