Question

Voici quelques possibilités pour entamer la conversation:

  1. Échapper à la saisie de tous lors de l'initialisation.
  2. Échapper à chaque valeur, de préférence lors de la génération du SQL.

La première solution n'est pas optimale, ensuite parce que vous devez de ne pas encoder chaque valeur si vous souhaitez l'utiliser dans autre chose que SQL, à l'instar de la sortie sur une page web.

La deuxième solution est bien plus logique, mais manuellement échapper à chaque valeur est une douleur.

Je suis conscient de les requêtes préparées, cependant je trouve MySQLi lourd.Aussi, la séparation de la requête de l'intrants me concerne, parce que même si il est crucial d'obtenir l'ordre correct, il est facile de faire une erreur, et donc écrire les données erronées à la mauvaise champs.

Était-ce utile?

La solution

comme @Rob Walker états, requêtes paramétrées sont votre meilleur pari.Si vous êtes à l'aide de la plus récente et la plus PHP, je vous conseille de prendre un coup d'oeil à AOP (PHP Data Objects).C'est un natif d'abstraction de base de la bibliothèque qui prend en charge un large éventail de bases de données (y compris MySQL de cours) ainsi que les instructions préparées avec des paramètres nommés.

Autres conseils

Les requêtes préparées sont la meilleure réponse.Vous avez les tests, car vous pouvez faire des erreurs!

Voir cette question.

Je voudrais aller avec l'aide de déclarations préparées à l'avance.Si vous souhaitez utiliser des requêtes préparées, vous voudrez probablement consulter l'AOP fonctions pour PHP.Non seulement cela vous permettre de facilement exécuter des requêtes préparées, il vous permet également d'être un peu plus de base de données agnostique par pas appel à des fonctions qui commencent par mysql_, mysqli_ ou pgsql_.

AOP peut-être vaut-il un jour, mais tout n'est pas encore là.C'est un DBAL et force est (soi-disant) pour faire de la commutation entre les fournisseurs de plus facile.Ce n'est pas vraiment construire pour attraper des injections SQL.

De toute façon, vous voulez échapper et sanatize vos entrées, à l'aide de déclarations préparées à l'avance pourrait être une bonne mesure (je seconde).Bien que je crois qu'il est beaucoup plus facile, par exempleen utilisant filtre.

J'ai toujours utilisé la première solution parce que 99% du temps, les variables $_GET, $_POST, et $_COOKIE ne sont jamais retournée au navigateur.Par ailleurs, vous ne jamais tort d'écrire du code avec une injection SQL (sauf si vous n'utilisez pas de guillemets dans la requête), tandis qu'avec la deuxième solution, vous pouvez facilement oublier d'échapper à l'une de vos chaînes finalement.

En fait, la raison pour laquelle je l'ai toujours fait c'était parce que tous mes sites, il y a les magic_quotes réglage par défaut, et une fois que vous avez écrit beaucoup de code à l'aide de l'une de ces deux solutions, il faut beaucoup de travail pour changer de l'autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top