web-dev-qa-db-fra.com

Préparez-vous à vous inscrire

Je cherche à récupérer un certain nombre d'enregistrements dans la base de données, à partir d'une liste de chiffres. Je me demandais comment j'utiliserais $ wpdb-> prepare pour le faire (pour tirer parti des attaques de désinfection par rapport aux attaques par injection SQL que cela me donne). .

$wpdb->query($wpdb->prepare('SELECT * FROM wp_postmeta WHERE post_id IN (' . implode(',', $ids) .') est une mauvaise façon de procéder, mais cela donne une chance d'attaque par injection SQL (imaginez l'un des identifiants ayant la valeur "0); DROP TABLE wp_posts;").

NOTE: Je n'essaie pas de sélectionner des données dans wp_postmeta, je les utilise simplement à titre d'exemple.

2
Brian Barnes

$wpdb->prepare() utilise la même syntaxe pour formater que php's printf(). SSo vous aurez besoin de quelque chose comme ... WHERE post_id IN (%d,%d,%d) ...

Cela conviendra pour trois identifiants. Mais que se passe-t-il si nous avons plus ou moins de trois identifiants? Nous allons utiliser les outils php pour créer la chaîne de formatage nécessaire (en supposant que $ids est un tableau avec les identifiants):

Compter les identifiants

count( $ids )

Créez une chaîne avec un '% d', pour chaque ID dans $ ids

str_repeat( '%d,', count( $ids ) )

Nous avons maintenant une chaîne comme %d,%d,%d,. Il y a une virgule pour beaucoup à la fin. Enlève-le

$ids_format_string = rtrim( str_repeat( '%d,', count( $ids ) ), ',' );

Et utilisez ceci de cette manière '... WHERE post_id IN (' . $ids_format_string . ') ...'

4
Ralf912

Dans votre cas, vous savez quel type de données vous attendez, alors je forcerais ce type:

$ids = array_map( 'absint', $ids );

Et vous pouvez ensuite utiliser ces valeurs sans autre préparation.

0
fuxia