27 votes

Quand * ne pas * utiliser les déclarations préparées?

Je suis re-engineering PHP driven web site qui utilise un minimum de base de données. La version originale utilisés "pseudo-préparé-états" (fonctions PHP qui ne citant et le paramètre de remplacement) pour éviter les attaques par injection et à la base de données distincte de la logique à partir de la page logique.

Il semblait naturel pour remplacer ces fonctions ad-hoc avec un objet qui utilise PDO et réel déclarations préparées à l'avance, mais après avoir fait ma lecture sur eux, je ne suis pas si sûr. AOP semble encore comme une grande idée, mais l'un des principaux points de vente de déclarations préparées à l'avance, c'est de pouvoir les réutiliser... je ne le sera jamais. Voici ma configuration:

  • Les états sont tous trivialement simple. La plupart sont sous la forme SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1. Le plus complexe de la déclaration dans le lot est tout simplement trois sélectionne joints avec d' UNION ALLs.
  • Chaque page a frappé exécute au plus une instruction et l'exécute qu'une seule fois.
  • Je suis dans un environnement hébergé, et donc réticent à l'idée de le claquement de leurs serveurs en faisant une "stress tests" personnellement.

Étant donné que l'utilisation des requêtes préparées seront, au minimum, doubler le nombre de base de données allers-retours, je suis en train de faire, suis-je mieux de les éviter? Puis-je utiliser PDO::MYSQL_ATTR_DIRECT_QUERY afin d'éviter la surcharge de plusieurs voyages de base de données, tout en conservant le bénéfice de paramétrisation et l'injection de la défense? Ou de faire les appels binaires utilisés par l'instruction préparée API effectuer assez bien par rapport à l'exécution de non-requêtes préparées que je ne devrais pas m'en inquiéter?

EDIT:

Merci pour tous ces bons conseils, des gens. C'est celui où je souhaite que je pourrais cocher plus d'une réponse comme "accepté" - beaucoup de points de vue différents. En fin de compte, cependant, je dois donner rick son dû... sans sa réponse, j'aurais béatement parti et fait l'complètement Mauvaise Chose, même après la suite de chacun des conseils. :-)

Des émules déclarations préparées à l'avance, il est!

22voto

chaos Points 69029

La règle actuelle du génie logiciel: s'il ne fait rien pour vous, ne l'utilisez pas.

11voto

rick Points 1386

Je pense que vous voulez PDO :: ATTR_EMULATE_PREPARES. Cela désactive les instructions natives préparées pour la base de données, mais autorise toujours les liaisons de requête pour empêcher l'injection SQL et garder votre SQL bien rangé. D'après ce que je comprends, PDO :: MYSQL_ATTR_DIRECT_QUERY désactive complètement les liaisons de requête.

10voto

Dave Sherohman Points 25122

Quand ne pas utiliser les requêtes préparées? Lorsque vous allez seulement d'être en cours d'exécution de l'instruction en une seule fois avant la connexion db s'en va.

Quand ne pas utiliser lié paramètres de la requête (qui est vraiment ce que la plupart des gens utilisent des requêtes préparées à obtenir)? Je suis enclin à dire "jamais" et j'ai vraiment envie de dire "jamais", mais la réalité est que la plupart des bases de données et certains db couches d'abstraction ont certaines circonstances dans lesquelles ils ne vous permettra pas de lier des paramètres, ce qui vous force à ne pas les utiliser dans ces cas. Tout autre temps, cependant, il rendra votre vie plus simple et votre code plus sûr à utiliser.

Je ne suis pas familier avec PDO, mais je serais prêt à parier qu'il fournit un mécanisme pour l'exécution de requêtes paramétrées avec les valeurs données dans le même appel de fonction si vous ne voulez pas préparer, puis exécuter en tant qu'une étape distincte. (par exemple, quelque Chose comme run_query("SELECT * FROM users WHERE id = ?", 1) ou similaire).

Aussi, si vous regardez sous le capot, la plupart db couches d'abstraction va préparer la requête, puis lancez-le, même si vous venez de le dire à l'exécution d'une statique de l'instruction SQL. Alors, vous êtes probablement pas l'économie d'un voyage à la db en évitant explicite prépare de toute façon.

6voto

ʞɔıu Points 15907

Les avantages des requêtes préparées sont comme suit:

  • chaque requête est seulement une fois compilé
  • mysql va utiliser plus efficacement format de transport pour envoyer des données au serveur

Cependant, les requêtes préparées ne persiste que par connexion. Sauf si vous êtes en utilisant le regroupement de connexion, il n'y aurait aucun avantage si vous êtes seulement faire une déclaration par page. Trivialement des requêtes simples, ne pourraient pas bénéficier de la plus efficace format de transport, que ce soit.

Personnellement, je ne voudrais pas ennuyer. Les pseudo-instructions préparées sont susceptibles d'être utiles pour la sécurité de la variable citant on peut présumer qu'ils fournissent.

5voto

Alphager Points 723

Les déclarations préparées sont utilisées par des milliers de personnes et sont donc bien testées (et on peut donc en déduire qu'elles sont raisonnablement sécurisées). Votre solution personnalisée n'est utilisée que par vous.

Le risque que votre solution personnalisée ne soit pas sécurisée est assez élevé. Utilisez des déclarations préparées. Vous devez conserver moins de code de cette façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X