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?
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ériquesLa 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é.