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

$_SESSION est-il à l'abri des injections sql ?

Vous n'avez pas vraiment besoin de tester si l'entrée est numérique, car dans MySQL, toute chaîne, par ex. '123abc' dans un contexte numérique (comme être comparé à une colonne entière id ) ne prend implicitement que les chiffres et ignore le reste. Une chaîne non numérique telle que 'abc' a simplement la valeur entière 0 car il n'y a pas de chiffres de tête.

Le fait est que les valeurs sont à l'abri de l'injection SQL si vous utilisez des paramètres de requête. Que les entrées proviennent de $_SESSION ou d'une autre source n'est pas pertinent. $_SESSION n'est ni sûr ni dangereux en ce qui concerne l'injection SQL, c'est la façon dont vous transmettez les données à votre requête qui compte.

Je simplifierais également le code pour formater la liste des espaces réservés des paramètres :

$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));

Et oubliez bindParam(), passez simplement le tableau à execute() .

//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories` 
    WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();

Concernant votre commentaire :

Dans PDO, vous pouvez utiliser soit des paramètres nommés comme :id , ou vous pouvez utiliser des paramètres positionnels, qui sont toujours ? (mais ne mélangez pas ces deux types dans une requête donnée, utilisez l'un ou l'autre).

Passer un tableau à execute() lie automatiquement les éléments du tableau aux paramètres. Un tableau simple (c'est-à-dire indexé par des entiers) est facile à lier aux paramètres positionnels.

Si vous utilisez des paramètres nommés, vous devez passer un tableau associatif où les clés du tableau correspondent aux noms des paramètres. Les clés du tableau peuvent éventuellement être préfixées par : mais ce n'est pas obligatoire.

Si vous débutez avec PDO, il vaut vraiment la peine de lire la documentation . Il y a des exemples de code et tout !