wpdb-> insert: dois-je me préparer à l'injection SQL?

14

Dois-je utiliser wpdb prepare avant wpdb-> insert?

Si j'insère des valeurs dans une table wordpress en utilisant wpdb-> insert, dois-je "nettoyer" mes données avant de les insérer ou est-ce que cette méthode (wpdb-> insert) le fait pour moi?

rouge conservatoire
la source

Réponses:

21

Non, vous ne devez pas préparer ou échapper les données, cela est fait pour vous par la wpdbclasse.

De la référence de classe wpdb :

données :

(tableau) Données à insérer (dans la colonne => paires de valeurs). Les colonnes $ data et les valeurs $ data doivent être "brutes" (aucune ne doit être échappée SQL).

Si, cependant, vous écriviez votre propre SQL plutôt que d'utiliser la insertméthode, alors oui, vous devriez échapper à l'utilisation prepare.

personne
la source
8
Pour ajouter une note: les deux insert& updaten'en ont pas besoin. Mais il doit être utilisé avec query.
kaiser
1

Voici un avertissement pour la classe wpdb.

https://codex.wordpress.org/Class_Reference/wpdb

Un avertissement

Certaines fonctions de cette classe acceptent une instruction SQL en entrée. Vous devez échapper SQL toutes les valeurs non fiables que vous incorporez à la requête SQL pour empêcher les attaques par injection SQL. Consultez la documentation pour voir si la fonction que vous prévoyez d'utiliser échappe à SQL pour vous ou s'attend à ce qu'elle soit précédée d'un échappement.

Je lis donc ceci comme - la classe wpdb ne prépare pas ou n'échappe pas automatiquement les données pour vous.

Je suis à peu près sûr que si vous ne pouvez pas faire confiance à 100% à la source de données dans votre code, je suggère d'utiliser la classe prepare (?).

Ne pensez pas que l'utilisation de la classe prepare le corrigera sans utiliser correctement la classe prepare. Je suis assez nouveau dans ce domaine, veuillez donc poster toute correction en réponse si je ne me trompe pas.

$ wpdb-> prepare ("SELECT * FROM table WHERE ID =% d AND name =% s", $ id, $ name);

Dans l'énoncé ci-dessus, il y a 2 attributs supplémentaires. Un pour l'ID et un pour le nom. Pour autant que je le lise, chacun correspond dans l'ordre au nombre d'éléments dans votre requête. De plus,% s = chaîne,% d = entier et% f = flottant.

De plus, d'après ma lecture, si vous ne mettez pas les attributs supplémentaires, alors préparer ne fera rien. Il y aura un avertissement, mais si vous désactivez cela, vous ne le saurez peut-être pas.

Voici un exemple de la référence de classe elle-même où ils ajoutent une classe prepare dans un INSERT ci-dessous.

https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

$ wpdb-> query ($ wpdb-> prepare ("INSERT INTO $ wpdb-> postmeta (post_id, meta_key, meta_value) VALUES (% d,% s,% s)", array (10, $ metakey, $ metavalue) ));

Ma préoccupation est que la réponse votée est incorrecte selon la même page à laquelle «personne» fait référence. Je suppose que vous utilisez prepare () mais pas d'autres méthodes d'échappement php standard parce que j'ai pris cette réponse aussi bien ... jusqu'à ce que j'explore plus profondément.

Quoi qu'il en soit ... peut-être que les choses ont changé depuis la réponse originale.

Felixius
la source
hmmm, cela ressemble plus à une question qu'à une réponse
Mark Kaplun
La réponse acceptée est correcte. Lorsque vous utilisez des fonctions comme $wpdb->insert(), $ wpdb-> update () `ou les $wpdb->delete()données doivent être RAW. Dans une situation où vous utilisez par exemple $wpdb->query()et passez une instruction SQL en entrée, vous devez échapper les données non fiables.
nmr
nmr, je pense que je comprends maintenant. Donc, pour clarifier ... pour ma raison ... ce que vous avez utilisé comme exemple est "la méthode d'insertion et" la méthode de suppression "par opposition aux exemples que j'ai utilisés d'utiliser" la méthode de requête "... (% wpdb -> requête). Dois-je supprimer ma réponse? Ou le laisser?
Felixius