# Shkenca > Informatikë dhe Internet > Arti i programimit >  PHP - Mbrojtja me fjalëkalim nëpërmjet sesioneve

## PcCrack3r

Pershendetje,

Pyetja ime eshte: Si ti vej fjalkalim nje faqeje PHP ??

Po sqarohem pak. 
Ajo faqe qe dua eshte nje faqe e llojit admin.php dhe eshte nje lloj i panelit te kontrollit te nje web portali, por ate faqe mund ta hap cdo vizitor vetem nese e shtyp ne adress bar www.domain.com/admin.php, une dua qe kesaj faqeje ti vej nje fjalkalim, nese dikush e din ndonje menyre te thjeshte qe tja shtoj ne krye te ketij php skripti nje skript te vogel qe do te kerkoje fjalkalim dhe pastaj te lejoje hyrjen, le te me ndihmoje???

----------


## edspace

*Mbrojtja*
Mënyra e shpjeguar më poshtë aftëson mbrojtjen e një ose më shumë faqeve me një llogari të vetme të administratorit. Mbrojtja bëhet nëpërmjet sesioneve të PHP-së dhe administratori qëndron i identifikuar për aq kohë sa sesioni nuk ka skaduar (zakonisht 20 minuta pa hapur faqen) ose administratori nuk mbyll shfletuesin (IE, Firefox). 

E vetmja mënyrë për të sulmuar faqen, është duke gjetur ID-në e sesionit të hapur nga administratori si dhe HTTP_USER_AGENT të shfletuesit të përdorur nga administratori. Për të gjetur ID-në, sulmuesi duhet të përgjojë informacionin e shkëmbyer nga administratori ose duhet të ketë leje të hapë "cookies" në kompjuterin e administratorit. Për të gjetur HTTP_USER_AGENT, sulmuesi duhet të përgjojë rrjetin e administratorit. Me pak fjalë, skripti ofron mbrojtje relativisht të sigurtë. 

Për këtë shembull supozojmë se faqja ka adresën http://localhost/ dhe aty janë hedhur këta skedarë:
*vizitor.php* - faqja e vizitorëve të thjeshtë
*identifikohu.php* - faqja e identifikimit
*eshteAdmin.php* - skripti qe kontrollon nëse ka hyrë administratori apo jo. 
*admin.php* - faqja e administratorit

Pra, identifikimi ndjek këtë rrugë:
vizitor.php -> identifikohu.php -> eshteAdmin.php -> admin.php


*Konfigurimi*
Para se të vini në punë mbrojtjen e mësipërme, duhet kryer konfigurimi i skedarit identifikohu.php. Në krye të këtij skedari duhet shkruar emri dhe fjalëkalimi i administratorit, si dhe adresat e faqeve që hapen pas hyrjes dhe daljes së panelit të administratorit. 

Për këtë shembull kemi këtë konfigurim:


```

<?php
//**************** KONFIGURIMI *********************
 // Shkruaj emrin dhe fjalekalimin e administratorit
// Fjalekalimi duhet te shifrohet me funksionin MD5()
//         Per ta shifruar mund te perdorni funksionin MD5 te PHP-se
//         ose tek faqja http://pajhome.org.uk/crypt/md5/
define ('ADMIN_EMRI', 'admin'); 
define ('ADMIN_FJALEKALIMI', '4b14ade55cf2243661b1f2919884edfe');
 define ('HYRJA', '/admin.php');        // faqja e administratorit
define ('DALJA', '/vizitor.php');    // faqja e vizitoreve
?>


```

Vini re se fjalëkalimi është shifruar si hash me funksionin MD5. Kjo bëhet me qëllim që edhe nqs një person arrin të hapë kodin e faqes identifikohu.php, ai nuk mund të hyjë dot në panelin e administratorit sepse fjalëkalimi është i shifruar. 

Në shembullin më lart, fjalëkalimi i shifruar është '_admin2006_'. Për të shifruar një fjalëkalim tjetër, përdorni këtë faqe ose krijoni një skript të thjeshtë në PHP me kodin: 
echo md5("Fjalekalimi_im_sekret");

HYRJA është vendndodhja e faqes që hapet pas identifikimit të saktë të administratorit ndërsa DALJA është vendodhja e faqes që hapet kur administratori mbyll panelin e administratorit.


*Përdorimi*
Për të mbrojtur një faqe mjafton të shkruani një rresht të vetëm në krye të faqes:
require('eshteAdmin.php'); 

Pra, nëse duam te mbrojmë admin.php, hapDatabazen.php, fshiAnetaret.php, apo faqe të tjera të administratorit, mjafton të shkruajmë rreshtin e mësipërm në krye të çdo faqeje. 


*Skedarët*

Më poshtë është kodi i skedarëve, si dhe pamjet e tyre gjatë shfletimit. Skedarët mund të shkarkohen të gjithë sëbashku në paketën e bashkëngjitur.  

*vizitor.php*

*Kjo është faqja e vizitorëve të thjeshtë.*

Hyni në Panelin e Administratorit


```

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Faqja e Vizitor&euml;ve</title></head>
 <body>
<h2><strong>Kjo &euml;sht&euml; faqja e vizitor&euml;ve t&euml; thjesht&euml;. </strong></h2>
<p><a href="admin.php">Hyni n&euml; Panelin e Administratorit</a></p>
</body>
</html> 


```


*identifikohu.php*

Figura e bashkëngjitur.


```

<?php
 //**************** KONFIGURIMI *********************
 // Shkruaj emrin dhe fjalekalimin e administratorit
// Fjalekalimi duhet te shifrohet me funksionin MD5()
//         Per ta shifruar mund te perdorni funksionin MD5 te PHP-se
//         ose tek faqja http://pajhome.org.uk/crypt/md5/
define ('ADMIN_EMRI', 'admin'); 
define ('ADMIN_FJALEKALIMI', '4b14ade55cf2243661b1f2919884edfe');
 define ('HYRJA', '/admin.php');        // faqja e administratorit
define ('DALJA', '/vizitor.php');    // faqja e vizitoreve
  //********* MOS NDRYSHO ASGJE ME POSHTE ************
 if (isset($_POST['prano'])) {
    kontrolloIdentifikimin();     
} else if (isset($_GET['largohu'])) {
    largoIdentifikimin();
} else {
    kerkoIdentifikimin(); 
}
 //*************************************************************************
// Shfaq formularin e identifikimit
//
function kerkoIdentifikimin ($gabimi = '') {
     if ($gabimi != '') {
        $gabimi = htmlentities($gabimi);
        $gabimi = $gabimi . '<br><br>';
    }
    
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>Paneli i Administratorit</title>
    <style type="text/css">
    <!--
    .bardhe {
        color: #FFFFFF;
        font-size: x-large;
        font-weight: bold;
    }
    .gabim {color: #FF0000}
    -->
    </style>
    </head>
    <body>
    <form action="identifikohu.php" method="post" name="identifikimi" id="identifikimi">
    <table width="302" border="0" align="center" cellpadding="10" cellspacing="0">
      <tr>
        <td colspan="2" align="center" bgcolor="#990000" class="bardhe">Identifikohu</td>
      </tr>
      <tr>
        <td width="20%" bgcolor="#FEF8ED"><strong>Emri</strong></td>
        <td width="80%" bgcolor="#FEF8ED"><input name="emri" type="text" tabindex="1" maxlength="50">    </td>
      </tr>
      <tr>
        <td bgcolor="#FEF8ED"><strong>Fjal&euml;kalimi</strong></td>
        <td bgcolor="#FEF8ED"><input name="fjalekalimi" type="password" tabindex="2" maxlength="50"></td>
      </tr>
      <tr>
        <td colspan="2" align="center" bgcolor="#FEF8ED"><span class="gabim"><?=$gabimi?>
        </span>
          <input name="prano" type="submit" id="prano" tabindex="3" value="Prano">
        <input name="anulo" type="reset" id="anulo" tabindex="4" value="Anulo"></td>
      </tr>
    </table>
    </form>
    </body>
    </html>
    <?php
}
 //*************************************************************************
// Kontrollo nese vizitori shkruan emrin dhe fjalekalim e sakte
//
function kontrolloIdentifikimin() {
     $emri = isset($_POST['emri']) ? $_POST['emri'] : '';
    $fjalekalimi = isset($_POST['fjalekalimi']) ? md5($_POST['fjalekalimi']) : '';
    
    if ($emri == ADMIN_EMRI && $fjalekalimi == ADMIN_FJALEKALIMI) {
        // emri dhe fjalekalimi jane te sakte
        
        // hap sesionin dhe lejo privilegjet e administratorit
        session_start();             
        $_SESSION['ADMINISTRATOR'] = true;        
        $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
        
        // dergoje tek faqja e hyrjes (paneli i administratorit)
        Header('Location: ' . HYRJA);
        
    } else {    
        // emri ose fjalekalimi jane te gabuar
        kerkoIdentifikimin("emër ose fjalëkalim i gabuar");
    }
}
  //*************************************************************************
// Lesho privilegjet e administratorit dhe kthehu ne nje vizitor te thjeshte
//
function largoIdentifikimin() {
     require('eshteAdmin.php');                // kontrollo a eshte admin
    
    unset($_SESSION['ADMINISTRATOR']);        // hiq privilegjet e admin
    unset($_SESSION['HTTP_USER_AGENT']);
    
    Header('Location: ' . DALJA);            // dergoje tek faqja e daljes
    die();
}
?>


```

*admin.php*

Nëse personi nuk është identifikuar, hapet faqja e identifikimit. 
Nëse personi është identifikuar: 
*Kjo është faqja e administratorit.*

Mbylleni Panelin e Administratorit


```

<?php
 // A eshte administrator?
require('eshteAdmin.php'); 
  ?>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Paneli i Admnistratorit</title>
</head>
 <body>
<h2><strong>Kjo &euml;sht&euml; faqja e administratorit. </strong></h2>
<p><a href="/identifikohu.php?largohu=po">Mbylleni Panelin e Administratorit</a> </p>
</body>
</html>

```


*eshteAdmin.php*



```

<?php
 //*************************************************
// Ky skript kontrollon nese nje vizitor
// eshte identifikuar si administrator apo jo. 
// Per te perdorur skriptin, shkruani:
// require('eshteAdmin.php'); 
// 
 // mos lejo skriptin te hapet vetem
if (eregi('eshteAdmin.php', $_SERVER['PHP_SELF'])) {
    Header('Location: /index.php');
    die();
}
 session_start(); 
 // ndalo sesionet e paidentifikuar
if (!isset($_SESSION['HTTP_USER_AGENT']) || !isset($_SESSION['ADMINISTRATOR'])) {
    Header('Location: /identifikohu.php');
    die();
}
 // ndalo perdorimin e sesioneve te hapur nga dikush tjeter (session hijacking)
if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) {
    Header('Location: /identifikohu.php');
    die();
}
 // Vizitori ka leje si Administrator
?>


```

----------

