Oracle
 sql >> Base de données >  >> RDS >> Oracle

Est-ce que oci_bind_by_name empêche l'injection SQL en toute sécurité ?

L'utilisation de paramètres liés est suffisante dans les cas courants et constitue une bonne pratique pour éviter l'injection SQL.

Mais un paramètre dans une instruction préparée ne peut être utilisé que pour une valeur dans une expression SQL. En d'autres termes, où vous écririez normalement un littéral de chaîne entre guillemets, un littéral de date entre guillemets ou un littéral numérique. Et un paramètre ==une valeur (pas de listes).

Vous devez utiliser des paramètres liés pour ces cas. Si vous posez cette question parce que vous pensez que vous voudrez peut-être ignorer l'utilisation de paramètres liés si quelqu'un répond qu'ils ne sont pas suffisants, alors désolé, vous ne serez pas dispensé des pratiques de programmation sécurisées.

Cependant, il existe d'autres cas (peut-être moins courants) pour lesquels les paramètres liés ne fonctionnent pas. Si vous devez écrire une requête avec un nom de table dynamique, un nom de colonne ou un autre identifiant, ou une expression entière ou un mot-clé SQL, vous avez besoin d'une autre méthode. Ces cas doivent être corrigés dans la syntaxe SQL à prepare temps, ils ne peuvent donc pas être paramétrés.

Par exemple, voici une requête avec des parties dynamiques désignées par l'utilisation de variables, qui ne peuvent pas être des paramètres :

$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";

Vous devez utiliser la liste blanche pour ces cas . En d'autres termes, assurez-vous qu'une chaîne que vous interpolez dans votre requête en tant que nom de table dynamique est bien l'une des tables qui existe dans votre base de données. Assurez-vous que les mots clés SQL sont des mots clés légitimes.

Jamais prendre mot pour mot l'entrée de l'utilisateur et l'interpoler dans SQL (ou tout autre code analysé au moment de l'exécution, comme l'argument que vous fournissez à eval() ou shellexec() ). Et ce ne sont pas seulement les entrées de l'utilisateur qui peuvent constituer un contenu dangereux.

Voir aussi ma présentation Mythes et erreurs d'injection SQL pour plus d'explications.