web-dev-qa-db-fra.com

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

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

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

12
redconservatory

Non, vous ne devriez pas préparer ni échapper les données, cela est fait pour vous par la classe wpdb.

A partir de la référence de la classe wpdb :

data :

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

Si, toutefois, vous écriviez votre propre SQL plutôt que d'utiliser la méthode insert, alors oui, vous devriez vous échapper en utilisant prepare.

18
nobody

Voici un avertissement pour la classe wpdb.

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

Un avertissement

Certaines des fonctions de cette classe prennent une instruction SQL en entrée. SQL doit échapper à toutes les valeurs non fiables que vous intégrez à 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 pour vous à SQL ou s'attend à ce qu'elle soit pré-échappée.

J'ai donc lu ceci comme suit: la classe wpdb ne prépare ni n'échappe 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 de préparation la corrigera sans l’utiliser correctement. Je suis assez nouveau dans ce domaine, alors merci de poster toute correction en guise de réponse si je ne me trompe pas.

$ wpdb-> prepare ("SELECT * DE la table WHERE ID =% d ET nom =% s", $ id, $ nom);

Dans la déclaration ci-dessus, il y a 2 attributs supplémentaires. Un pour l'ID et un pour le nom. Dans la mesure où je l'ai lu, chacun correspond dans l'ordre au nombre d'éléments de votre requête. Également% s = chaîne,% d = entier et% f = float.

En outre, d'après mes lectures, si vous ne mettez pas les attributs supplémentaires, alors préparez ne fera rien. Il y aura un avertissement, mais si vous désactivez cette option, vous ne le saurez peut-être pas.

Voici un exemple tiré de la référence de classe elle-même, dans laquelle ils ajoutent une classe préparée à un INSERT ci-dessous.

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

$ wpdb-> requête ($ wpdb-> prepare ("INSERT INTO $ wpdb-> postmeta (post_id, meta_key, meta_value) VALEURS (% d,% s,% s)", tableau (10, $ metakey, $ metavalue) ));

Mon souci est que la réponse votée est incorrecte selon la même page que "personne" fait référence. Je suppose que vous utilisez prepare (), mais pas d’autres méthodes d’échappement php standard, car j’ai considéré cette réponse comme correcte également ... jusqu’à ce que j’ai creusé plus profondément.

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

0
Felixius

Non, vous n'avez pas besoin d'empêcher les injections SQL lorsque vous utilisez - wpdb insert ou wpdb delete.  enter image description here 

Voir les liens suivants:

https://codex.wordpress.org/Data_Validation#Database

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

0
oguegbu ijeoma