6
votes

Protection contre l'injection PHP MySQL

J'ai écrit cette courte fonction pour protéger contre mon injection My_SQL, en raison de son importance, je veux juste vérifier avec d'autres que cela fonctionnera comme je l'intention.

foreach($_REQUEST as $key => $value) {          
    $_REQUEST[$key] = stripslashes($value);
    $_REQUEST[$key] = mysql_real_escape_string($_REQUEST[$key]);
} 


1 commentaires

Ne modifiez pas les superglobaux. Ils devraient être laissés intacts. Si vous ne courez jamais votre propre code, c'est «OK». Mais une fois que vous commencez à mélanger dans d'autres bibliothèques, ils peuvent s'attendre à ce que vous attendiez / nécessiter des données intactes, et vous avez maintenant géré les choses.


6 Réponses :


1
votes

Vous devez expliquer explicitement l'identifiant de connexion de base de données dans

mysql_real_escape_string(..., $db_connection_identifier);


3 commentaires

Donc, si ma connexion est $ Con = mysql_connect ("localhost" ... Je devrais ajouter: $ _Request [$ clé] = mysql_real_escape_string ($ _ Demande [$ clé], $ Con);


oui, pour éviter les problèmes mentionnés ici Stackoverflow.com/questions/4243657/...


Le diagramme de syntaxe indique que l'identifiant de liaison est facultatif. Donc, à moins que vous ayez plusieurs connexions de base de données ouvertes, vous ne devez pas vraiment besoin d'ajouter l'argument explicitement.



1
votes

Si vous incluez une clé arbitraire $ S dans votre requête, vous devez vous échapper aussi.


1 commentaires

Je n'avais pas pensé à ça, je ne le fais pas souvent. Mais je suis heureux que vous ayez amené cela pour le moment où je le fais.



3
votes

semble être un peu d'approche de Sledgehammer. Vous n'avez pas besoin Stripslashes à moins que votre exécution Magic_Quotes. La coulée de type peut être plus élégante lorsque vous savez que vous voulez int , float ou bool . .

plus d'informations:

Casting de type: http://php.net/manual /en/language.types.type-juggling.php

Test des citations magiques: http: // www.php.net/manual/fr/function.get-magic-quotes-gpc.php (Merci karolis)


2 commentaires

Pouvez-vous s'il vous plaît me lier à une ressource avec plus d'informations sur ce que vous proposez de faire


@Johnny si (get_magic_quotes_gpc ()) $ _Request [$ clé] = Stripslashes (valeur $);



11
votes

Eh bien, vous utilisez Stripslashes () car le magic_quotes_gpc est défini? Ce code ne fonctionnera donc que lorsque magic_quotes_gpc est défini! Je vous recommanderais de l'éteindre et n'utilisez pas l'appel Strislashes ().

MAIS NOTE Il n'y a rien de tel que "désinfections universelles". Appelons cela juste citant , car c'est ce que c'est tout à propos de.

Lors de la citation, vous Devis toujours le texte pour une sortie particulière , comme:

  1. Valeur de chaîne pour la requête MySQL
  2. comme expression pour la requête MySQL
  3. Code HTML
  4. JSON
  5. Expression régulière MySQL
  6. Expression régulière PHP

    Pour chaque cas, vous avez besoin d'une citation différente, car chaque utilisation est présente dans un contexte de syntaxe différent. Cela implique également que la cotisation ne doit pas être faite à l'entrée dans PHP, mais à la sortie particulière ! Quelle est la raison pour laquelle les fonctionnalités telles que magic_quotes_gpc sont cassées (toujours assurer qu'il est éteint !!!).

    Donc, quelles méthodes utiliseraient-elles pour citer dans ces cas particuliers? (N'hésitez pas à me corriger, il pourrait y avoir des méthodes plus modernes, mais celles-ci fonctionnent pour moi)

    1. mysql_real_escapape_string ($ str)
    2. mysql_real_escape_string (addcslashes ($ str, "% _"))
    3. htmlspecialchars ($ str)
    4. json_encode () - uniquement pour UTF8! J'utilise ma fonction pour ISO-8859-2
    5. mysql_real_escapape_string (addcslashes ($ str, '^. [] $ () $ () | * +? {}')) - Vous ne pouvez pas utiliser preg_quote dans ce cas car le barreau serait échappé deux fois!
    6. preg_quote ()

1 commentaires

@Karolis, voulez-vous dire codage de caractères? Je ne pense pas que vous ayez besoin de vérifier le codage du personnage d'entrée, si vous avez tout correctement défini.



5
votes

Si vous utilisez du PDO (correctement), vous n'avez pas à vous soucier de l'injection MySQL.

échantillon: xxx

Plus d'informations


2 commentaires

J'ai vu ce type de codage mais n'a jamais connu le but. Je vais le rechercher afin que je puisse commencer à l'utiliser au début de mon prochain projet. Merci


C'est le meilleur moyen d'éviter l'injection SQL.



1
votes

La suggestion de Tomas est bonne, mais vous devriez toujours les garder à l'esprit, donc cela peut être génial: xxx


0 commentaires