Att använda bundna parametrar är tillräckligt i vanliga fall, och god praxis för att undvika SQL-injektion.
Men en parameter i en förberedd sats kan endast användas för ett värde i ett SQL-uttryck. Med andra ord, där du normalt skulle skriva en citerad sträng bokstavlig, citerad datum bokstavlig eller en numerisk bokstavlig. Och en parameter ==ett värde (inga listor).
Du bör använda bundna parametrar för dessa fall. Om du ställer den här frågan för att du tror att du kanske vill hoppa över att använda bundna parametrar om någon svarar att de inte är tillräckliga, så förlåt, du kommer inte att bli ursäktad från säker programmering.
Det finns dock andra (kanske mindre vanliga) fall där bundna parametrar inte fungerar. Om du behöver skriva en fråga med ett dynamiskt tabellnamn, kolumnnamn eller annan identifierare, eller ett helt uttryck eller ett SQL-nyckelord, behöver du en annan metod. Dessa fall måste fixas i SQL-syntaxen vid prepare tid, så de kan inte parametreras.
Till exempel, här är en fråga med dynamiska delar betecknade med användning av variabler, som inte kan vara parametrar:
$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";
Du bör använda vitlistning för dessa fall . Med andra ord, se till att en sträng som du interpolerar i din fråga som ett dynamiskt tabellnamn faktiskt är en av tabellerna som finns i din databas. Se till att SQL-sökord är legitima nyckelord.
Aldrig ta användarinmatning ordagrant och interpolera den till SQL (eller någon annan kod som tolkas under körning, som argumentet du matar till eval()
eller shellexec()
). Och det är inte bara användarinmatning som kan vara osäkert innehåll.
Se även min presentation SQL Injection Myths and Fallacies för mer förklaring.