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?
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?
Réponses:
Non, vous ne devez pas préparer ou échapper les données, cela est fait pour vous par la wpdb
classe.
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 insert
méthode, alors oui, vous devriez échapper à l'utilisation prepare
.
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.
$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.
Non, vous n'avez pas besoin de vous protéger contre les injections SQL lorsque vous utilisez - wpdb insert ou wpdb delete.
Voir les liens suivants:
https://codex.wordpress.org/Data_Validation#Database
https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks
insert
&update
n'en ont pas besoin. Mais il doit être utilisé avecquery
.