sql >> Database teknologi >  >> RDS >> Mysql

Base64 som metode til at rense brugerinput til Mysql

Undlad at "sanere" input som et middel til at forhindre SQL-injektion - brug pladsholdere (eller korrekt escape) , altid. Være konsekvent. Pas godt på dig selv. Problemet er allerede løst.

Denne sag vil være "sikker" på grund af det begrænsede domæne af base64_encode fungere. Men..

Det er dårlig praksis og lagring af base64-kodede værdier (sådan at den viste forespørgsel kan fungere) har flere negative implikationer, når det ændrer sig den lagrede information:den ødelægger rækkefølgen af ​​værdier, gør informationen ikke trivielt søgbar , kræver en ekstra "encode/decode" trin, og endda forbruger mere plads - uh!

Selvom der kan være specifikke tilfælde for at base64-kode data, er denne tilgang ikke velegnet som et middel til at afbøde SQL-injektion .

Problemet skyldes adgang til SQL via en tekstprotokol hvor forespørgselskommandoen/formen og værdier er blandet. Brugen af ​​korrekt escape-teknikker (f.eks. mysql_real_escape_string ) løser dette ved at sikre, at oplysningerne escapes, så SQL-teksten parses som tilsigtet - men i modsætning til et base64-encode-trin gør det ikke faktisk ændre de leverede oplysninger!

Denne er præcis hvad pladsholdere giver ! Pladsholdere er den universelt korrekt tilgang og bør tilskyndes. Pladsholdere tillader, at forespørgslen og værdierne sendes til databasen separat når det understøttes af biblioteket/databasen; og efterlignes ved at undslippe ellers. Korrekt brug af pladsholder eliminerer SQL-injektion og behovet for brugerkode til at blande værdier ind i SQL-kommandotekst, hvilket også kan gøre forespørgsler nemmere at skrive og vedligeholde.

For at forhindre "individuelle programmører" i at skrive forfærdelige forespørgsler, er løsningen at forhindre ad hoc-forespørgsler fra at blive spredt rundt i kode:Saml dataadgangsoperationerne i et Dataadgangslag ( DAL) (muligvis i forbindelse med en ORM) og kun afsløre relevante handlinger, hvilket sikrer korrekt brug af SQL i DAL. I enklere projekter er DAL også et passende sted til centralt at administrere forretningsreglerne for sanitet og anden valideringslogik.

Mere præcist:

  • Desinficer værdier for forretningsregler; dette bør forhindre "dårlige oplysninger", såsom et brugernavn, der er for kort, indeholder begrænsede tegn eller på anden måde ikke opfylder forretningskravene.

  • Brug pladsholdere for at forhindre SQL-injektion . Dette er strengt relateret til overførsel af data til SQL og har ingen betydning for oplysningerne heri.

Mens MySQL 5.6.1 tilføjer FROM_BASE64 , sådan at kodningen simpelthen kan bruges i SQL-kommandoteksten, tilføjer dette stadig et ekstra eksplicit afkodningstrin og komplicerer forespørgslen ved brug af et sådant kodningsskema. Denne base64-tilgang er simpelthen ikke nødvendigt, da der allerede er gennemprøvede teknikker til at forhindre SQL-injektion, og det blev ikke foreslået i det indledende spørgsmål.



  1. MySQL - Træk værdi fra forrige række, grupper efter

  2. Enhjørninger spiser MySQL-forbindelser uden at respektere poolstørrelsen - Rails

  3. Android Realm-håndtering af primær nøgle i relationelt objekt

  4. Sådan fungerer SQLite Count()