Mysql
 sql >> Database >  >> RDS >> Mysql

PHP:mentre il ciclo non funziona dopo aver regolato SELECT per la prevenzione dell'iniezione SQL

Non puoi associare nomi di colonne e tabelle, solo dati. Devi specificare la tabella e quindi eseguire il binding per il tuo '%calendar weekday%' .

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

Se si desidera utilizzare nomi dinamici di tabelle/colonne, è necessario eseguire la whitelist minima di tali elementi. È possibile creare una white list dinamica chiedendo al database quali colonne sono valide per una determinata tabella del database. Ad esempio:

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

È possibile inserire tutte queste informazioni negli array e quindi verificare che i nomi di tabella/colonna utilizzati nella query siano negli array. È necessario prestare maggiore attenzione ai nomi di tabelle e colonne, assicurandosi che non vengano utilizzate parole chiave/riservate per questi nomi.

Infine, usa i backtick attorno ai nomi di tabella/colonna convalidati quando chiami i valori per le query dinamiche. Ciò coprirà eventuali modifiche all'elenco delle parole chiave/riservate e fornirà un ulteriore livello di protezione.