sql >> Databasteknik >  >> RDS >> Mysql

Ska du använda förberedda uttalanden endast för att de ska fly?

Skillnaden anses vara försumbar.

Ändå måste man särskilja infödda förberedda uttalanden från den allmänna idén om ett förberett uttalande.

Det förstnämnda är bara en form av att köra frågor som stöds av de flesta DBMS, förklaras här . Dess användning kan ifrågasättas.
Det senare är en allmän idé om att ersätta faktiska data med en platshållare, vilket innebär ytterligare bearbetning av de ersatta uppgifterna. Det används flitigt i programmering, en välkänd printf() funktion är ett exempel. Och det senare tillvägagångssättet måste ALLTID användas för att köra en fråga mot en databas , oavsett om det stöds av inhemska förberedda uttalanden eller inte. Eftersom:

  • förberedd sats gör korrekt formatering (eller hantering) oundviklig .
  • förberedda uttalanden gör korrekt formatering (eller hantering) på den enda rätta platsen - precis innan förfrågan körs, inte någon annanstans, så vår säkerhet kommer inte att förlita sig på sådana opålitliga källor som
    • någon PHP "magisk" funktion som snarare förstör data än att göra den säker.
    • den goda viljan hos en (eller flera) programmerare, som kan bestämma sig för att formatera (eller inte formatera) vår variabel någonstans i programflödet. Det är det som är mycket viktigt.
  • förberedd sats påverkar själva värdet som kommer in i frågan, men inte källvariabeln, som förblir intakt och kan användas i den ytterligare koden (som ska skickas via e-post eller visas på skärmen).
  • Förberedda uttalanden kan göra applikationskoden dramatiskt kortare, genom att göra all formatering bakom kulisserna (*endast om föraren tillåter).

Så även om du överväger att inte använda inbyggda förberedda uttalanden (vilket är helt okej), måste du alltid skapa dina frågor med platshållare istället för själva data. För detta ändamål kan du använda PDO , som fungerar precis som beskrivits ovan - som standard är det bara emulate prepares , betyder att vanlig SQL-fråga skapas utifrån förberedd fråga och data och sedan körs mot databasen.

PDO saknar dock stöd för många viktiga datatyper, såsom identifierare eller en array - det gör att du inte alltid kan använda platshållare och gör därmed en injektion fullt möjlig. Som tur är, safeMysql har platshållare för varje datatyp och låter dig köra frågor på ett säkert sätt.



  1. MySQL Explain radgräns

  2. Symfony 2:INNER JOIN på icke-relaterad tabell med doktrinfrågebyggaren

  3. hur väljer man endast rad med maxsekvens utan att använda en underfråga?

  4. Dela en sträng och gå igenom värden i MySql Procedure