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 Download PDF     Share On Facebook or Whatsapp Imesomwa mara 284


Sponsored links
👉1 Madrasa kiganjani     👉2 kitabu cha Simulizi     👉3 Kitau cha Fiqh     👉4 Kitabu cha Afya    

Post zifazofanana:-

PHP somo la 75: Content-Type Header
Katika somo hili utakwenda kujifunza kuhusu content-type header. Soma Zaidi...

PHP somo la 54: class constant kwenye php
Katika somo hili utakwenda kujifunza jinsi ya kutumia constatnt kwenye class. Soma Zaidi...

PHP - somo la 39: Jinsi ya kutengeneza mafaili na mafolda kwenye server kwa kutumia PHP
Katika somo hili utakwenda kujifunza jinsi ya kuzungumza na server ili kutengeneza mafaili, mafolda, kufuta na ku edit kwa kutumia PHP. Soma Zaidi...

PHP - somo la 44: Nini cURL na ni yapi matumizi yake?
Katika somo hilibutajifunza maana ya cURL pamoja na matumini yake Soma Zaidi...

PHP - somo la 4: Aina za data zinazotumika kwenye PHP
Katika somo hili utakwenda kujifunza aina za data ambazo hutumika kwenye PHP Soma Zaidi...

PHP somo la 73: Maana ya http header
Katika somo hili utakwenda kujifunza kuhusu http header, maana yake na jinsi ya kusoma taarifa zilizopo kwenye http header. Soma Zaidi...

PHP somo la 66: Jinsi ya ku edit data na kufuta kwenye database kwa kutumia PDO
Katika somo hili utakwenda kujifunza jinsi jinsi ya ku edit ama ku update data na kuzifuta kwenye database kwa kutumia PDO 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 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 45: Jinsi ya kutuma sms kwa kutumia PHP
Katika soko hili takwenda kujufunza jinsi ya kutuma sms kwa kutumia PHP. Hii itasaidia kama unataka kutuma OTP yaqni Onetime password Soma Zaidi...

PHP BLOG - somo la 10: Jinsi ya kufanya sanitization
Katika somo hili utajifunza jinsi ya kufanya sanitization kwenye user input ili kuzuia sql injection kwenye database. 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...