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

PHP :la boucle While ne fonctionne pas après avoir ajusté SELECT pour la prévention des injections SQL

Vous ne pouvez pas lier les noms de colonne et de table, uniquement les données. Vous devez spécifier la table, puis lier votre '%calendar weekday%' .

$stmt = $conn->prepare("SELECT " . $selectLang . " FROM `TranslationsMain` WHERE `location` LIKE ? ORDER BY `sortOrder`, " . $selectedLang);
$stmt->bind_param('s', $calendar_weekday);

Si vous souhaitez utiliser des noms de table/colonne dynamiques, vous devez effectuer la liste blanche minimale de ces éléments. Vous pouvez créer une liste blanche dynamique en demandant à la base de données quelles colonnes sont valides pour une table de base de données donnée. Par exemple :

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = `database_name`
AND `TABLE_NAME` = `table_name`

Vous pouvez placer toutes ces informations dans des tableaux, puis vérifier que les noms de table/colonne utilisés dans la requête se trouvent dans les tableaux. Une considération supplémentaire pour les noms de table et de colonne doit être effectuée, en s'assurant qu'aucun mot clé / réservé n'est utilisé pour ces noms.

Enfin, utilisez des backticks autour des noms de table/colonne validés lors de l'appel des valeurs pour les requêtes dynamiques. Cela couvrira toute modification potentielle de la liste des mots clés / réservés et fournira une couche de protection supplémentaire.