PHP MySQLI empêcher L'Injection SQL [dupliquer]

cette question a déjà une réponse ici:

j'ai construit un site web qui sera bientôt en direct et juste quelques questions sur la prévention de L'injection SQL, je comprends comment utiliser mysqli_real_escape_string mais je suis juste je me demande si je dois utiliser cela sur toutes les variables que j'obtiens pour ma déclaration SQL et dois-je l'utiliser quand je fais des déclarations select aussi ou juste sur insert update et delete? Aussi quelle autre Sécurité me recommanderiez-vous de mettre en œuvre avant que je mette le site en direct, merci à l'avance pour toute aide!

33
demandé sur user2201765 2013-04-29 19:08:13

2 réponses

n'importe quelle requête peut être injectée qu'elle soit lue ou écrite, persistante ou transitoire. Les Injections peuvent être effectuées en terminant une requête et en exécutant une autre (possible avec mysqli ), ce qui rend la requête prévue non pertinente.

Toute entrée d'une requête à partir d'une source externe si elle est de utilisateurs ou même interne doit être considéré comme un argument de la requête, et d'un paramètre dans le contexte de la requête. Tout paramètre dans une requête doit être paramétrable. Cela conduit à une requête correctement paramétrée que vous pouvez créer une instruction préparée à partir des arguments et exécuter avec eux. Par exemple:

SELECT col1 FROM t1 WHERE col2 = ?

? est un paramètre. En utilisant mysqli , vous pouvez créer une déclaration préparée en utilisant prepare , lier une variable (argument) à un paramètre en utilisant bind_param , et exécuter la requête avec execute . Vous ne devez pas assainir l'argument du tout (en fait, il est préjudiciable faire.) mysqli fait ça pour vous. Le processus complet serait:

$stmt = mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

il y a aussi une distinction importante entre requête paramétrée et déclaration préparée . Cette déclaration, lorsqu'elle est préparée, n'est pas paramétrée et est donc vulnérable à l'injection:

$stmt = mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

pour résumer:

  • tous les Requêtes doivent être correctement paramétré (à moins qu'ils n'ont pas de paramètres)
  • "tous les arguments à une requête doivent être traités aussi hostiles que possible peu importe leur source
39
répondu Explosion Pills 2013-04-29 15:16:33

, Il sera fermé en quelques secondes, mais juste de faire des choses droites

je comprends comment utiliser mysqli_real_escape_string

je crains que non.

si je dois utiliser cela sur toutes les variables que je reçois pour ma déclaration SQL

certainement pas.

cette fonction doit être utilisée pour formater les chaînes SQL seulement

dois-je l'utiliser lorsque je fais des déclarations select aussi ou juste sur insert update et delete?

TOUT instruction SQL. Mais encore une fois, pas "utiliser mysqli_real_escape_string" mais formater vos littérales complètement et correctement

aussi quelle autre sécurité recommanderiez-vous

en ce qui concerne la sécurité SQL - vous devez formater correctement non seulement les chaînes, mais aussi les littérales de n'importe quel genre. Et chacun nécessite un ensemble distinct de règles de formatage

3
répondu Your Common Sense 2013-04-29 15:22:46