Se protéger contre les injections SQL

La manière la plus simple d'empêcher toutes attaques via injection SQL c'est d'utiliser les requêtes préparées. Du coup au lieu d'avoir ce genre de requêtes:

<?php
$req = $bdd->query("SELECT * FROM user where username=".$_POST["username"]." AND password=".$_POST["password"].";");
?>

On aura ceci:

<?php
$req = $bdd->prepare("SELECT * FROM user WHERE username=? AND password=?");
$req->execute(array($_POST["username"], $_POST["password"]));
?>

Ci-dessous vous trouverez un cas concret d'exécution de requêtes SQL via requête préparée:

<?php
$bdd = new mysqli("localhost", "root", "", "sq");
if ($bdd->connect_error){
  die("Connection failed : ".$bdd->connect_error);
}
?>

<!DOCTYPE html>
<html>
  <head>
    <title>Playing with SQLi's</title>
  </head>
  <body>
    <h1>Secured application</h1>
    <?php
    if(!empty($_GET["idCategory"])){
      $req = $bdd->prepare("SELECT idArticle, nameArticle FROM article WHERE idCategory = ?");
      $req->bind_param("s", $_GET["idCategory"]);
      $req->execute();
      $res = $req->get_result();
      while($result = $res->fetch_assoc()){
         echo $result["nameArticle"]."<br>";
      }
    }
    else{
      echo mysqli_error($bdd);
    }
    ?>
  </body>
</html>

De cette manière les paramètres envoyés à la requête SQL seront considérés comme étant du texte pur et non plus du code SQL ce qui désamorcera toutes tentatives d'exploitation.