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 {

&">...



           

Je! umeipenda hii post?
Ndio            Hapana            Save post

Kama unahitaji kuuliza maswali Bofya hapa

Mwandhishi Tarehe 2023-10-19 Download PDF     Share On Facebook or Whatsapp Imesomwa mara 190


Download our Apps
👉1 Kitabu cha Afya     👉2 Kitau cha Fiqh     👉3 kitabu cha Simulizi     👉4 Madrasa kiganjani    

Post zifazofanana:-

PHP BLOG - somo la 3: Jinsi ya kutengeneza table kwenye databse kwa ajili ya blog
Hapa utajifunza jinsi ya kutengeneza table ambayo tutaitumia kwenye blog yetu Soma Zaidi...

PHP - somo la 16: Jinsi ya kufuta tabale na database kwa kutumia php
Katika somo hili utajifunza jinsi ya kufuta table ya databse kwa kutumia PHP. Pia utajifunza jinsi ya kututa database yeto Soma Zaidi...

PHP somo la 57: class traits kwenye PHP
Katika somo hili utakwenda kujifunza concept ya traits kwenye OOP. hii itakusaidia ku solve baadhi ya changamoto zinazotokana na inheritance Soma Zaidi...

PHP - somo la 3: Maana ya variable na inavyoandika kwenye PHP
Katika somo hili utakwenda kujifunza kujusu PHP variable, maana yake na sheria za uandishi wa variable Soma Zaidi...

PHP - somo la 21: Jinsi ya kutafuta kitu kwenye database kwa mutumia PHP
Katika somo hili utakwenda kujifundisha jinsi ya kutafuta taarifa maalumu kwenye database kwa kutumia PHP Soma Zaidi...

PHP BLOG - somo la 9: Jinsi ya ku edit poost
Katika somo hil utawenda kujifunza jinsi ya ku edit post kwenye databse Soma Zaidi...

PHP - somo la 47: Jifunze kuhusu sql injection na kuizuia
Katika somo hili utajwenda kujifunza jinsi ya kuzuia hacking kwenye website yako Soma Zaidi...

PHP - somo la 1: Maana ya PHP na jinsi inavyofanya kazi
Katika somo hili utakwenda kujifunza maana ya PHP na jinsi inavyofanya kazi Soma Zaidi...

PHP somo la 60: namespace na matumizi yake kwenye PHP
Katika somo hili utakwendakujifunza concept ya namespaces na jinsi inavyosaidi kwenye OOP Soma Zaidi...

PHP somo la 19: Jinsi ya kudhibiti mpangilio wa data baada ya kuzisoma
Katika somo hili utajifunza kupangilia data wakati wa kuzisoma kwenye database kw akutumia PHP 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 - somo la 22: Kutafuta jumla, wastani na idani ya vitu kwenye database kw akutumia PHP
Katika somo hili utakwenda jifunza jinsi ya kuhesabu row kwenye database, kutafuta wastani wa taarifa kwenye database na kutafuta idadi yake. Soma Zaidi...