"sanera" inte input som ett sätt att förhindra SQL-injektion - använd platshållare (eller korrekt flykt) , alltid. Var konsekvent. Var försiktig. Problemet är redan löst.
Det här fallet kommer att vara "säkert" på grund av den begränsade domänen av base64_encode fungera. Men...
Det är dålig praxis och lagring av base64-kodade värden (så att den visade frågan kan fungera) har flera negativa konsekvenser när det förändras informationen som lagras:den förstör ordningen av värden gör informationen inte trivialt sökbar , kräver en tillägg "koda/avkoda" steg och till och med konsumerar mer utrymme - usch!
Så även om det kan finnas specifika fall för att base64-koda data, är detta tillvägagångssätt inte väl lämpad som ett sätt att mildra SQL-injektion .
Problemet beror på åtkomst till SQL via ett textprotokoll där frågekommandot/formen och värden är blandade. Användningen av korrekt flykttekniker (t.ex. mysql_real_escape_string ) fixar detta genom att se till att informationen escapes så att SQL-texten tolkas som avsett - men till skillnad från ett base64-kodningssteg gör det det inte faktiskt ändra informationen som tillhandahålls!
Denna är exakt vad platshållare tillhandahåller ! Platshållare är den ett allmänt korrekt tillvägagångssätt och bör uppmuntras. Platshållare tillåter att frågan och värdena skickas till databasen separat när det stöds av biblioteket/databasen; och efterliknas genom att escape annars. Korrekt användning av platshållare eliminerar SQL-injektion och behovet av användarkod för att blanda värden till SQL-kommandotext, vilket också kan göra frågor lättare att skriva och underhålla.
För att förhindra "enskilda programmerare" från att skriva hemska frågor, är lösningen att förhindra ad-hoc-frågor från att vara utspridda i koden:samla in dataåtkomstoperationerna i ett Dataåtkomstlager ( DAL) (eventuellt i samband med en ORM) och endast exponera relevanta åtgärder, vilket säkerställer korrekt användning av SQL inom DAL. I enklare projekt är DAL också en lämplig plats för att centralt hantera affärsreglerna för sanitet och annan valideringslogik.
Mer exakt:
-
Sanera värderingar för affärsregler; detta bör förhindra "dålig information", som ett användarnamn som är för kort, innehåller begränsade tecken eller på annat sätt inte uppfyller affärskraven.
-
Använd platshållare för att förhindra SQL-injektion . Detta är strängt relaterad till överföring av data till SQL och har ingen betydelse för informationen däri.
Medan MySQL 5.6.1 lägger till FROM_BASE64 , så att kodningen helt enkelt kan användas i SQL-kommandotexten, lägger detta fortfarande till ett extra explicit avkodningssteg och komplicerar frågan när ett sådant kodningsschema används. Den här base64-metoden är helt enkelt inte nödvändigt, eftersom det redan finns beprövade tekniker för att förhindra SQL-injektion och föreslogs inte i den första frågan.