2017-10-04 4 views
0

Ich möchte es wissen, ist es für den Entwickler möglich, die parametrisierte Abfrage der URL zur Eindämmung der SQL-Injection-Schwachstelle zu setzen?Ist es möglich Parameterabfragen der URL zu setzen?

Zum Beispiel:

https://example.com/somefile.php?id=1 

Wie kann ein Entwickler eine parametrisierte Abfrage für das machen? Wie sie dies in dem Parameter in der Anwendung tun?

Antwort

0

Ja, Sie können es tun. Parametrisierte Abfragen sind einfach und erzwingen die vorherige Definition der SQL-Abfrage und die Verwendung von Platzhaltern für die vom Benutzer bereitgestellten Variablen in der Abfrage. Sie können dann jeden Parameter an die Abfrage übergeben, nachdem die SQL-Anweisung definiert wurde. Dadurch kann die Datenbank zwischen dem SQL-Befehl und den von einem Benutzer eingegebenen Daten unterscheiden. Wenn SQL-Befehle von einem Angreifer eingegeben werden, behandelt die parametrisierte Abfrage diese als nicht vertrauenswürdige Eingabe und die injizierten SQL-Befehle werden nie ausgeführt. Beachten Sie das unten stehende Beispiel für mehr Verständnis.

if (isset($_GET['id'])){ 
    $id = $_GET['id']; 
    /** 
    * Validate data before it enters the database. In this case, we need to check that 
    * the value of the 'id' GET parameter is numeric 
    */ 
    if (is_numeric($id) == true){ 
    try{ 
     $dbh = new PDO('mysql:host=localhost;dbname=sql_injection_example', 'dbuser', 'dbpasswd'); 

     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     /** 
     * Before executing our SQL statement, we need to prepare it by 'binding' parameters. 
     * We will bind our validated user input (in this case, it's the value of $id) to our 
     * SQL statement before sending it to the database server. 
     * 
     * This fixes the SQL injection vulnerability. 
     */ 
     $q = "SELECT username 
      FROM users 
      WHERE id = :id"; 
     // Prepare the SQL query 
     $sth = $dbh->prepare($q); 
     // Bind parameters to statement variables 
     $sth->bindParam(':id', $id); 
     // Execute statement 
     $sth->execute(); 

     $sth->setFetchMode(PDO::FETCH_ASSOC); 
     // Fetch result 
     $result = $sth->fetchColumn(); 
     /** 
     * HTML encode our result using htmlentities() to prevent stored XSS and print the 
     * result to the page 
     */ 
     print(htmlentities($result)); 

     $dbh = null; 
    } 
    catch(PDOException $e){ 
     /** 
     * You can log PDO exceptions to PHP's system logger, using the Operating System's 
     * system logging mechanism 
     * 
     * For more logging options visit http://php.net/manual/en/function.error-log.php 
     */ 
     error_log('PDOException - ' . $e->getMessage(), 0); 
     /** 
     * Stop executing, return an 'Internal Server Error' HTTP status code (500), 
     * and display an error 
     */ 
     http_response_code(500); 
     die('Error establishing connection with database'); 
    } 
    } else{ 
    /** 
    * If the value of the 'id' GET parameter is not numeric, stop executing, return 
    * a 'Bad request' HTTP status code (400), and display an error 
    */ 
    http_response_code(400); 
    die('Error processing bad or malformed request'); 
    } 
} 
?> 
+1

im Grunde bedeutet es in einfacher Sprache, d. H. Wir liefern nur eine Variable an den ID-Parameter und diese Variable haben unsere Abfrage. Wenn also der Angreifer versucht, ihn irgendwo einzugeben, aber die ursprüngliche Abfrage nicht zu beeinflussen. So dass unsere sql Injektion nicht funktionieren würde Wenn ich falsch liege Bitte klär mich? –

+0

@januuagrawal genau das ist was passiert –

+0

Oh danke @SuvethanNantha Ihre Erklärung wirklich geschätzt. –

0

Das Problem liegt nicht in der URL, sondern darin, wie Sie die später in der URL übergebenen Parameter verwenden.

Der beste Weg ist durch die Verwendung von Bind-Variablen:

Sie können auch ‚behandeln‘ oder Ihre Parameter durch die Flucht und/oder Entfernung von verdächtigen Daten ‚sanieren‘. Dies ist in der Regel eine sehr knifflige Angelegenheit, die anfällig für Fehler ist. Daher ist die Bindung von Variablen einfacher und sicherer zu verwenden.

+0

Danke @YoYo aber es ist zu verwirrend. Aber ich werde versuchen, es zu verstehen. –

+0

hallo, kannst du es bitte überprüfen, ich habe unten einen Kommentar gepostet, der zeigt, was ich darüber verstehe. –

+0

Sie haben es gut erklärt. Außerdem hat die akzeptierte Antwort ein schönes Beispiel dafür, wie Bind-Variablen verwendet werden können - aber es ist wirklich eine Duplizierung anderer Posts. Am bemerkenswertesten ist dieser - https://stackoverflow.com/a/60496/744133 – YoYo

Verwandte Themen