2017-10-04 3 views
0

Je veux le savoir, il est possible pour le développeur de définir la requête paramétrée de l'URL pour atténuer la vulnérabilité d'injection SQL?Est-il possible de définir une requête de paramètre de l'URL?

Par exemple:

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

Comment un développeur peut faire une requête paramétrées pour cela? Comme ils le font dans le paramètre de l'application?

Répondre

0

Oui, vous pouvez le faire. Les requêtes paramétrées sont simples et vous obligent à définir la requête SQL au préalable, et utilisent des espaces réservés pour les variables fournies par l'utilisateur dans la requête. Vous pouvez ensuite passer chaque paramètre à la requête après la définition de l'instruction SQL, ce qui permet à la base de données de distinguer la commande SQL des données entrées par un utilisateur. Si les commandes SQL sont entrées par un attaquant, la requête paramétrée traitera celles-ci comme des entrées non fiables, et les commandes SQL injectées ne seront jamais exécutées. Regardez l'exemple fourni ci-dessous pour plus de compréhension.

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

signifie fondamentalement dans un langage simple, c'est-à-dire que nous fournissons simplement une variable au paramètre id et cette variable a notre requête. Ainsi, lorsque l'attaquant essaie de l'entrer stocké quelque part mais n'affecte pas la requête d'origine. Alors que notre injection sql ne fonctionnerait pas? Si je me trompe S'il vous plaît me clarifier? –

+0

@januuagrawal exactement c'est ce qui se passe –

+0

Oh merci @SuvethanNantha votre explication vraiment apprécié. –

0

La question n'est pas dans l'URL, mais la façon dont vous utilisez les paramètres passés dans l'URL plus tard.

La meilleure façon est par l'utilisation de variables de liaison:

Vous pouvez également « traiter » ou « aseptiser » vos paramètres en fuite et/ou suppression des données suspectes. Ceci est généralement une chose très délicate à mettre en œuvre susceptible d'erreurs. Par conséquent, lier les variables est simplement plus simple et plus sûr à utiliser.

+0

Merci @YoYo mais c'est trop confus. Mais je vais essayer de le comprendre. –

+0

bonjour, pouvez-vous s'il vous plaît vérifier, j'ai posté un commentaire ci-dessous qui montre ce que je comprends à ce sujet. –

+0

Vous l'avez expliqué bien en arrière. De plus, la réponse acceptée a un bel exemple de la façon dont les variables de rattachement peuvent être utilisées - mais c'est vraiment la duplication d'autres publications. Le plus remarquable celui-ci - https://stackoverflow.com/a/60496/744133 – YoYo