Mysql
 sql >> Base de données >  >> RDS >> Mysql

Devez-vous utiliser des instructions préparées uniquement pour leur échappement ?

La différence considérée comme négligeable.

Néanmoins, il faut distinguer les instructions natives préparées de l'idée générale d'une déclaration préparée.

Le premier n'est qu'une forme d'exécution de requêtes prise en charge par la plupart des SGBD, expliqué ici . Son utilisation peut être remise en question.
Cette dernière est une idée générale consistant à remplacer les données réelles par un espace réservé, ce qui implique un traitement ultérieur des données substituées. Il est largement utilisé en programmation, un printf() bien connu fonction est un exemple. Et cette dernière approche doit TOUJOURS être utilisée pour exécuter une requête sur une base de données , qu'il soit soutenu ou non par des instructions natives préparées. Parce que :

  • une déclaration préparée rend le formatage (ou la manipulation) approprié inévitable .
  • l'instruction préparée effectue le formatage (ou la gestion) approprié au seul endroit approprié - juste avant l'exécution de la requête, pas ailleurs, donc notre sécurité ne dépendra pas de sources aussi peu fiables que
    • une fonctionnalité "magique" de PHP qui gâte les données plutôt que de les sécuriser.
    • bonne volonté d'un (ou plusieurs) programmeurs, qui peuvent décider de formater (ou de ne pas formater) notre variable quelque part dans le déroulement du programme. C'est le point le plus important.
  • l'instruction préparée affecte la valeur même qui entre dans la requête, mais pas la variable source, qui reste intacte et peut être utilisée dans le code suivant (à envoyer par e-mail ou à afficher à l'écran).
  • une instruction préparée peut raccourcir considérablement le code de l'application, en effectuant tout le formatage en arrière-plan (*uniquement si le pilote le permet).

Ainsi, même si vous envisagez de ne pas utiliser d'instructions préparées natives (ce qui est tout à fait correct), vous devez toujours créer vos requêtes en utilisant des espaces réservés au lieu des données réelles. À cette fin, vous pouvez utiliser PDO , qui fonctionne exactement comme décrit ci-dessus - par défaut, il ne fait que émuler prépare , signifie qu'une requête SQL normale est créée à partir d'une requête et de données préparées, puis exécutée sur la base de données.

Cependant, PDO ne prend pas en charge de nombreux types de données importants, tels que l'identifiant ou un tableau - il vous empêche donc de toujours utiliser des espaces réservés et rend ainsi une injection tout à fait possible. Heureusement, safeMysql a des espaces réservés pour chaque type de données et vous permet d'exécuter des requêtes en toute sécurité.