sql >> Databasteknik >  >> RDS >> Mysql

Base64 som metod för att sanera användarinmatning för Mysql

"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.



  1. Felkod 1292 - Trunkerat felaktigt DUBBELt värde - Mysql

  2. SQL Server 2016:Återställ en databas

  3. INFOGA och UPPDATERA i en fråga MYSQL

  4. Jag vill ha en trigger för att DELETE från 2 tabeller i MySQL