sql >> Databasteknik >  >> RDS >> Mysql

PHP:Medan loopen inte fungerar efter att ha justerat SELECT för att förhindra SQL-injektion

Du kan inte binda kolumn- och tabellnamn, bara data. Du måste ange tabellen och sedan binda för din '%calendar weekday%' .

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

Om du vill använda dynamiska tabell-/kolumnnamn bör du utföra en minimal vitlista av dessa objekt. Du kan bygga en dynamisk vit lista genom att fråga databasen vilka kolumner som är giltiga för en given databastabell. Till exempel:

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

Du kan placera all denna information i arrayer och sedan kontrollera att tabell-/kolumnnamnen som används i frågan finns i arrayerna. Extra hänsyn till tabell- och kolumnnamn bör tas, och se till att inga nyckelord/reserverade ord används för dessa namn.

Slutligen, använd backticks runt de validerade tabell-/kolumnnamnen när du anropar värdena för de dynamiska frågorna. Detta kommer att täcka eventuella ändringar i nyckel-/reserverade ordlistan och ger ett extra skyddslager.




  1. Hur man installerar SQLite på macOS

  2. Bästa sättet att hantera att lagra/visa datum i olika tidszoner i PHP?

  3. Kan MySQL FIND_IN_SET eller motsvarande fås att använda index?

  4. Hur man uppdaterar tabellen automatiskt i MYSQL med TRIGGER