2013-02-10 2 views
1

Je crée un script dans lequel les utilisateurs peuvent rechercher une base de données. Ma compréhension est que PDO ne vous laisse pas définir un paramètre pour l'opérande LIKE. Donc, j'ai ce code pour compensercomment utiliser en toute sécurité LIKE

$sQuery = "SELECT * FROM table WHERE column LIKE '%" . $this->sQuery . "%' LIMIT 30"; 
$Statement = $this->Database->prepare($sQuery); 
$Statement->execute(); 

Je doute que cela soit sécurisé contre l'injection SQL. Y a-t-il un moyen de le sécuriser?

+0

Vous pouvez utiliser 'like' avec AOP. –

Répondre

3

Vous avez raison, l'interpolation de n'importe quelle valeur dans une chaîne SQL crée un risque de vulnérabilité d'injection SQL. Il est préférable d'utiliser un espace réservé de paramètre de requête SQL lorsque vous prepare() et puis fournir la valeur en tant que paramètre lorsque vous execute(). Prenez ce pseudo-code car je ne peux pas dire de votre exemple quelle extension MySQL vous utilisez. Je suppose PDO, qui permet aux paramètres d'être envoyés en tant qu'argument de tableau à execute().

Certaines personnes utilisent PDOStatement::bindParam(), mais il n'y a aucun avantage à le faire. Peut-être que dans d'autres marques de RDBMS, le PDO::PARAM_STR est important, mais dans le pilote MySQL, le type de paramètre est ignoré. PS: Mis à part le problème de sécurité que vous avez posé, vous constaterez que la recherche de modèles génériques, comme vous le faites, ne fonctionne pas bien lorsque vos données augmentent. Voir ma présentation Full Text Search Throwdown.

+0

oh d'accord je vois. Quand j'ai essayé de placer le paramètre dans le code sql je l'ai eu comme "WHERE colonne LIKE%?%;" et cela n'a pas fonctionné. Mais cela a fait le travail. Je vous remercie. Et oui c'était pdo. – Alex

+0

Les caractères% doivent faire partie de la chaîne, mais un? l'espace réservé ne doit pas * être * à l'intérieur des délimiteurs de chaîne. La meilleure solution consiste donc à concaténer les caractères génériques avec le motif et à utiliser cette chaîne entière comme valeur de paramètre. –

+0

merci pour la présentation aussi. certainement quelque chose que je vais devoir apprendre. – Alex

0

Cela devrait fonctionner:

$sQuery = "SELECT * FROM table WHERE column LIKE :query LIMIT 30"; 
$Statement = $this->Database->prepare($sQuery); 
$Statement->execute(array(':query' => '%' . $this->sQuery . '%')); 
Questions connexes