Tak, PDO nie posiada wbudowaną funkcję ograniczającą identyfikatory takie jak nazwy tabel i nazwy kolumn. Funkcja PDO::quote()
służy tylko do literałów ciągów i literałów daty.
Za to, co warto, gdy pracowałem nad Zend Framework, zaimplementowałem funkcję quoteIdentifier()
.
Masz rację, że SELECT *
pobiera wszystkie kolumny, prawdopodobnie zużywając więcej pamięci i psując korzyści związane z indeksami.
Moje zalecenie to białą listę nazw kolumn. To znaczy, upewnij się, że $ info w rzeczywistości nazywa kolumnę table
. Wtedy nie musisz się martwić, że nazwa kolumny nie istnieje lub zawiera dziwną postać lub cokolwiek innego. Możesz kontrolować zestaw kolumn, które są uprawnione do umieszczenia w zapytaniu.
W każdym razie powinieneś także ograniczyć nazwę kolumny. Rozdzielne identyfikatory są niezbędne, jeśli nazwa kolumny zawiera znaki interpunkcyjne, białe znaki, znaki międzynarodowe lub odpowiada słowom zastrzeżonemu SQL. Zobacz Do different databases use different name quote?
function getInfoById($id, $info) {
// you can make this a literal list, or query it from DESC or INFORMATION_SCHEMA
$cols = array('col1', 'col2', 'col3');
if (array_search($info, $cols) === false) {
return false;
}
$sql = "SELECT `$info` FROM table WHERE id = :id";
$stmt = $pdo->prepare($sql);
if ($stmt === false) {
return false;
}
. . .
}
pokażę więcej przykładów whitelistingiem w mojej prezentacji SQL Injection Myths and Fallacies.
powinien działać poprawnie ... spróbuj 'id = '$ id'" ' –
możliwy duplikat [Escaping nazwy kolumn w instrukcjach PDO] (http://stackoverflow.com/questions/1542627/escaping-column-names -in-pdo-statement) – hakre