2017-05-31 4 views
-1

Wir hatten eine Sicherheitsüberprüfung unseres Codes, und sie erwähnten, dass unser Code anfällig für SQL-Injection-Angriffe ist.SQL Injection in server_processing.php

Erläuterung- Unterhalb von code ($ rResult = mysql_query ($ sQuery, $ gaSql ['link']) oder die (mysql_error());) von server_processing.php ruft eine SQL-Abfrage auf, die mit Eingaben aus einer nicht vertrauenswürdigen Quelle erstellt wurde . Dieser Aufruf könnte einem Angreifer ermöglichen, die Bedeutung der Anweisung zu ändern oder beliebige SQL-Befehle auszuführen.

/* 
    * SQL queries 
    * Get data to display 
    */ 
    $sQuery = " 
     SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))." 
     FROM $sTable 
     $sWhere 
     $sOrder 
     $sLimit 
    "; 
    **$rResult = mysql_query($sQuery, $gaSql['link']) or die(mysql_error());** 

SQL-Injection-Fehler auftreten, wenn: 1. Daten ein Programm von einer nicht vertrauenswürdigen Quelle kommt. 2. Die Daten werden verwendet, um eine SQL-Abfrage dynamisch zu erstellen.

Beispiel: Der folgende Code erstellt eine SQL-Abfrage, die nach Elementen mit einem angegebenen -Namen sucht, dynamisch und führt sie aus. Die Abfrage beschränkt die angezeigten Elemente auf diejenigen, bei denen der Besitzer dem Benutzernamen des aktuell authentifizierten Benutzers entspricht. ...

$userName = $_SESSION['userName']; 
$itemName = $_POST['itemName']; 
$query = "SELECT * FROM items WHERE owner = '$userName' AND itemname = '$itemName';"; 
$result = mysql_query($query); 

... Die Abfrage, dass dieser Code folgt auszuführen beabsichtigt:

SELECT * FROM items 
WHERE owner = <userName> 
AND itemname = <itemName>; 

Da jedoch die Abfrage durch die Verkettung eine konstante Abfrage-String dynamisch aufgebaut ist und eine Benutzereingabe string, die Abfrage verhält sich nur dann korrekt, wenn itemName kein Anführungszeichen enthält. Wenn ein Angreifer mit dem wiley Benutzernamen die Zeichenfolge eingibt „name‘ OR 'a' = 'a“für itemName, dann wird die Abfrage die folgenden:

SELECT * FROM items 
WHERE owner = 'wiley' 
AND itemname = 'name' OR 'a'='a'; 

Die Zugabe des OR 'a'=' a‘Zustand bewirkt, dass die where-Klausel auf true immer auswerten, so dass die Abfrage wird logisch äquivalent zu der viel einfacheren Abfrage:

SELECT * FROM items; 

Diese Vereinfachung der Abfrage der Angreifer erlaubt, die Anforderung zu umgehen, dass die Abfrage nur Rückkehr Artikel, die dem authentifizierten Benutzer gehören; Die Abfrage gibt jetzt alle Einträge zurück, die in der Elementtabelle gespeichert sind, unabhängig von ihrem angegebenen Besitzer.

SO haben wir SQL-Injection in unter code-

  1. Filtrier-

    $ sWhere = ""; if (isset ($ _ GET [ 'SSEARCH']) & & $ _GET [ 'SSEARCH'] = "!") { $ sWhere = "WHERE ("; for ($ i = 0; $ i $ sWhere . = $ aColumns [$ i]. "LIKE '%". mysql_real_escape_string ($ _GET [' sSearch ']). "%' ODER"; } $ sWhere = substr_replace ($ sWhere, "", -3); $ sWhere = ').'; }

  2. SQL queries-

    $ sQuery = " SELECT SQL_CALC_FOUND_ROWS" .str_replace ("", "", implodieren ("", $ aColumns))." VON $ sTabelle $ sWhere $ sOrder $ sLimit "; $ rResult = mysql_query ($ sQuery, $ gaSql ['link']) oder sterben (mysql_error());

  3. Bestell-

    $ sOrder = ""; if (isset ($ _GET ['iSortCol_0'])) { $ sOrder = "ORDER BY"; for ($ i = 0; $ iGet [. 'BSortable'.intval ($ GET [' iSortCol‘$ i])] == "true"). { $ sOrder = $ aColumns [intval ($ GET ['iSortCol'. $ I])]. " " .mysql_real_escape_string ($ GET ['sSortDir'. $ I]). ","; } }

    $sOrder = substr_replace($sOrder, "", -2); 
    if ($sOrder == "ORDER BY") 
    { 
        $sOrder = ""; 
    } 
    

    }

  4. Paging-

    $ SLIMIT = ""; if (isset ($ _GET [ 'iDisplayStart']) & & $ _GET [ 'iDisplayLength']! = '1') { $ SLIMIT = "LIMIT" .mysql_real_escape_string ($ _GET'iDisplayStart ']).“ “.mysql_real_escape_string ($ _GET'iDisplayLength ']); ** }

5- Einzelne Spalte Filterung -

for ($i=0 ; $i<count($aColumns) ; $i++) 
    { 
     if (isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '') 
     { 
      if ($sWhere == "") 
      { 
       $sWhere = "WHERE "; 
      } 
      else 
      { 
       $sWhere .= " AND "; 
      } 
      **$sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string($_GET['sSearch_'.$i])."%' ";** 
     } 
    } 

Bitte helfen, wie kann ich sQL-Injection in meinem Code zu entfernen.

Kann mir jemand helfen, wo ich Dinge vermisse? Jeder Hilfe wird geschätzt!

+0

Dies wurde ziemlich dokumentiert hier: https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1. Hast du auch versucht auf PDO umzusteigen? 'mysql_ *' Funktionen sind jetzt veraltet und PDO wird vorbereitete Anweisungen verwenden, um Injektionen zu vermeiden. –

Antwort

0

Sie können jedes einzelne Angebot einfach durch ein doppeltes Anführungszeichen ersetzen.

$itemName = str_replace("'","''",$name); 

Dies funktioniert in Not, wenn Sie keine wesentlichen Änderungen vornehmen können. Obwohl der vorherige Kommentar korrekt ist. Die beste Methode wäre die Verwendung parametrisierter Abfragen.