web-dev-qa-db-fra.com

Confus par $ wpdb-> prepare

J'essaie d'utiliser $ wpdb-> prepare pour me protéger contre les attaques par injection SQL et suis perdu. J'ai l'extrait suivant ci-dessous qui vérifie la table h_transactions pour un identifiant de transaction. S'il ne trouve pas l'identifiant, il l'ajoute à la table ...

<?
global $wpdb;
$table_name = $wpdb->prefix . "h_transactions";
$registered = $wpdb->get_var( "SELECT COUNT(*) FROM $table_name WHERE transactionid = '{$transactionid}'" );

if ($registered == 0) {
  $wpdb->insert( $table_name, array( 'transactionid' => $transactionid ), array('%s')  );
}
else
?>

Dois-je utiliser $ wpdb-> prepare à la fois sur la requête SQL et sur l'insertion SQL?

1
fightstarr20

Tout d'abord, prepare() vous permet de spécifier deux types de données différents:

  • %s pour les types de chaîne
  • %d pour les types entiers/numériques

La raison est simple: MySQL ne connaît que deux (et demi) types de données: Chaînes et Numériques (et Date/Heure).

Ainsi, vous spécifiez de quel type il s’agit et assurez-vous que seul ce type réussit.

Il est néanmoins important de supprimer les parties de données potentiellement malveillantes en filtrant correctement vos entrées: esc_*() fonctions .

Voici votre exemple:

global $wpdb;

// The actual statement - in a readable way
$SQL = <<<SQL
    SELECT COUNT(*)
    FROM {$wpdb->prefix}h_transactions
    WHERE transactionid = %d
SQL;

$preparedSQL = $wpdb->prepare( $SQL, esc_attr( $_POST['transactionID'] ) );
// Let's run it
$registered = $wpdb->get_var( $preparedSQL );

Remarque: assurez-vous d'utiliser vos vrais noms. J'ai changé certains pour plus de lisibilité.

1
kaiser