Vulnerabilità RFI

Discussioni e problematiche sul linguaggio PHP

Moderatori: maurizio, markdesign

Regole del forum
Per scrivere del codice all'interno di ogni post, utilizzare il tag: [syntax=il_linguaggio]codice[/syntax] sostituendo "il_linguaggio" con il linguaggio del codice che dovete inserire, ad esempio: html, css, javascript, php, asp, ecc...

Vulnerabilità RFI

Messaggioda Tizionario » venerdì 27 maggio 2011, 9:35

Salve a tutti,
dopo aver seguito uno dei tutorial di Maurizio, ho deciso di fare di testa mia e di trasformarlo da codice procedurale, a codice OOP (per esercitarmi con essa).
Ora, riguardo il metodo ShowList(), stampa una tabella con i dati e in più stampa due link per modificare e cancellare il record, passando con GET le variabili "action" e "id", solo che così facendo basta modificare la query string a mano per "fare danni".

L'unica soluzione che mi viene in mente è di dare nomi meno mnemonici alle variabili della query string, ma non mi sembra una soluzione definitiva.

Esiste un modo migliore per aumentarne la sicurezza?


La pagina showall.php:
Sintassi: php [ Scarica ] [ Nascondi ]
  1.         //Includo i file necessari
  2.         include "./include/page.php";
  3.         include "./include/contactlist.class.php";
  4.        
  5.         HtmlHeader();
  6.         Nav_Tab();
  7.        
  8.         echo '<h1 class="cb">Rubrica completa';
  9.         $contact->CheckAction();
  10.         $contact->ShowList();
  11.  
  12.         HtmlFooter();
  13.  


il file contactlist.class.php:
Sintassi: php [ Scarica ] [ Nascondi ]
  1.         include_once 'Parameters.php';
  2.         class ContactList
  3.         {
  4.                 private $conn;
  5.                
  6.                 //costruttore
  7.                 function __construct()
  8.                 {
  9.                         $this->DBConnect();
  10.                 }
  11.                
  12.                 private function DBConnect()
  13.                 {
  14.                         $this->conn = mysql_connect(HOST,DB_USER,DB_PASSWORD) or die ("<p>Impossibile connettersi al server MySQL</p>");
  15.                         mysql_select_db(DB,$this->conn);
  16.                 }
  17.                
  18.                 public function ShowList()
  19.                 {
  20.                         $sql = "SELECT id,nome,cognome,numero FROM rubrica_telefonica";
  21.                         $res = mysql_query($sql,$this->conn);
  22.                         echo '<table border="1">
  23.                                         <tr>
  24.                                                 <td>Nome</td>
  25.                                                 <td>Cognome</td>
  26.                                                 <td>Numero</td>
  27.                                                 <td></td>
  28.                                                 <td></td>
  29.                                         </tr>';
  30.                         while($row = mysql_fetch_object($res))
  31.                         {
  32.                                 echo '<tr>
  33.                                                 <td>'.$row->nome.'</td>
  34.                                                 <td>'.$row->cognome.'</td>
  35.                                                 <td>'.$row->numero.'</td>
  36.                                                 <td><a href="'.$this->EditContact($row->id).'" title="Modifica informazioni su "'.$row->nome.' '.$row->cognome.'">[modifica]</a></td>
  37.                                                 <td><a href="'.$_SERVER['PHPSELF'].'?id='.$row->id.'&action=delete" title="Elimina informazioni su "'.$row->nome.' '.$row->cognome.'">[cancella]</a></td>
  38.                                         </tr>';
  39.                         }
  40.                 }
  41.  
  42.                 public function CheckAction()
  43.                 {
  44.                         if(isset($_GET['action']))
  45.                         {
  46.                                 $action = $_GET['action'];
  47.                                 $got_id = $_GET['id'];
  48.                                 switch($action)
  49.                                 {
  50.                                         case delete:
  51.                                                 $this->DeleteContact($got_id);
  52.                                                 break;
  53.                                         case edit:
  54.                                                 $this->EditContact($got_id);
  55.                                                 break;
  56.                                 }
  57.                         }
  58.                        
  59.                 }
  60.  
  61.                 private function DeleteContact($id)
  62.                 {
  63.                         $sql = "DELETE FROM rubrica_telefonica WHERE id='$id'";
  64.                         mysql_query($sql, $this->conn);
  65.                        
  66.                 }
  67.                
  68.                 private function EditContact($id)
  69.                 {
  70.                         //Implementare metodo
  71.                 }
  72.        
  73.         }
  74.  
  75.         $contact = new ContactList();
  76.  
Tizionario

Avatar utente
 
Messaggi: 101
Iscritto il: venerdì 3 dicembre 2010, 10:47
Località: Taranto

Re: Vulnerabilità RFI

Messaggioda oly1982 » martedì 31 maggio 2011, 10:33

Il controllo deve essere fatto a monte... mi spiego meglio.

Il metodo DeleteContact() che elimina un contatto dalla tabella deve essere eseguito solo da chi possiede i dovuti permessi.

La gestione dei permessi sarà gestita da una classe distinta, Ad esempio Class Permessi_utenti la quale avrà, ad esempio, al suo interno un metodo che verifica i permessi ad esempio is_admin(). (per approfondire l'argomento cerca sul web "ACL php").

A questo punto nella tua pagina avrai:
Sintassi: php [ Scarica ] [ Nascondi ]
  1. <?php
  2. require_once( "./include/contactlist.class.php");
  3. require_once( "./include/Permessi_utenti.class.php");
  4. $contact = New ContactList;
  5. $permessi = New Permessi_utenti;
  6.  
  7. if(isset($_GET['action']){
  8.     if(!$permessi->is_admin()){
  9.        exit('non hai i permessi per eseguire questa operazione');
  10.        }
  11.     else{
  12.           $contact->CheckAction();
  13.           }
  14.     }


Ovviamente ho semplificato molto... ma la logia è all'incirca questa...

Volendo essere più rigorosi la gestione dei permessi potrebbe essere integrata all'interno della classe ContactList eseguendo l'inclusione e l'istanza della classe Permessi_utenti all'interno del metodo CheckAction().

... ci sarebbe ancora altro...
oly1982

Avatar utente
 
Messaggi: 15
Iscritto il: mercoledì 30 marzo 2011, 14:45
Località: Caserta - Benevento

Re: Vulnerabilità RFI

Messaggioda maurizio » giovedì 2 giugno 2011, 13:29

Ciao Tiziano,

Il problema che poni non ha nulla a che vedere con le vulerabilità RFI/LFI (che rappresentano un'inclusione dinamica di codice potenzialmente dannoso)

Il tuo problema ha unicamente a che vedere con la scala dei priviliegi.

Come giustamente ti é stato detto é sufficiente immaginare che, ad esempio la cancellazione, sia un'operazione che può essere eseguita solo a determinate condizioni (disporre di una sessione amministrativa)
maurizio

Moderatore

Avatar utente
 
Messaggi: 141
Iscritto il: domenica 2 maggio 2010, 22:38


Torna a PHP