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');
}
}
?>
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? –
@januuagrawal exactement c'est ce qui se passe –
Oh merci @SuvethanNantha votre explication vraiment apprécié. –