, eller Hvordan At Beskytte Brugernes Data Fra SQL-Injektion

xkcd

Sjov Fakta:

SQL injection har været rundt i temmelig meget lige siden hjemmesider har gemt data i databaser.Open Securityeb Application Security Project vurderede injektionsangreb som en af de 10 største trusler mod webebapplikationer i 2017.,

s .l-injektion er stadig ansvarlig for mange store datalækager. I 2016 blev Illinois og Ari .ona State Board of Elections vælgerregistreringsdatabaser overtrådt. Mens ingen oplysninger blev stjålet i Arizona, i Illinois angribere havde adgang til vælgerne data, herunder navn, adresse, fødselsdato, køn og delvis Social Security-numre, for omkring 80.000 mennesker.1B

det er skræmmende, Hvad er det?

S .l-injektion er en type angreb, der er målrettet mod en applikations database gennem indsættelse af utilsigtet kode i brugerinputfelter., Ved at drage fordel af S .l syntaks angriberen kan bruge indtastningsfelter til at indsamle oplysninger fra disse databaser — herunder ting som adgangskoder og kreditkortnumre. Nogen kunne endda tage kontrol over din database eller slette alle de oplysninger, den indeholder.

Hvordan Virker Det?

S .l-injektion fungerer ved at bruge oplysninger indsat i et felt til at manipulere den tilsvarende s .l-sætning til at udføre en utilsigtet handling.,

Her er et grundlæggende eksempel:

SELECT * FROM customers WHERE name = " + user_name + ";

i dette eksempel lad os sige, at det variable brugernavn oprettes direkte fra brugerens input på et websiteebsted. Denne streng indsættes i ovenstående s .l-sætning, og alle felter, der vedrører det brugernavn, returneres. Ikke noget særligt.

men hvad sker der, hvis nogen skriver Steve ” eller 1=1 — – som deres brugernavn? derefter ville den genererede s .l være denne:

SELECT * FROM customers WHERE name = "Steve" OR 1=1;--";

da 1=1 altid er sandt, ville dette returnere alle dataene i tabellen. Ikke Godt!,

Let’s take one more look at that comic.

xkcd

The son’s name is Robert’); DROP TABLE students; — What would that do exactly?,

Tja, vi kan antage, at hvis Lille Bobby Borde blev tilføjet til skolens database for studerende, SQL-sætning ville se sådan ud:

INSERT INTO students (name) VALUES ('<Student Name>');

… og når vi indsætter Bobby…

INSERT INTO students (name) VALUES ('Robert'); DROP TABLE students;--');

Da Bobby ‘s navn indeholder”); de VÆRDIER argument er lukkede i midten af sit navn og den tekst, der følger DROP TABLE studerende er en ny SQL-sætning, der sletter hele bordet. Endelig kommenterer-i slutningen den resterende s .l, idet man i det væsentlige ignorerer resten af den originale kode og sørger for, at der ikke opstår nogen fejl.,

Så Hvad Dit Siger, Er Mine Data Vil Aldrig Blive Sikker Igen?

Nope! Der er faktisk en masse skridt, du kan tage for at beskytte dig selv fra denne form for angreb. Lad os se på få:

  1. Saniti datae Data. Det første trin er at kontrollere, hvad brugeren har lov til at indtaste. Den bedste måde at gøre dette på er at begrænse de typer input, der er tilladt for et bestemt felt., For eksempel i et telefonnummer felt kan du kun tillade numerisk input, eller i et e-mail-felt kun tillade tegn, der kan findes i en gyldig e-mail-adresse. Det er klart, at nogle felter kræver tegn, der kan bruges i et angreb, så denne metode er ikke uovervindelig.
  2. Konfigurer fejlrapportering. Ofte har standardfejlrapporteringen på databasestyringssystemer udviklerfejlfindingsoplysninger i den. Dette kan returnere nyttige oplysninger til angriberen, som bordnavne eller kolonnenavne., Sørg for, at du ikke viser denne type oplysninger til eksterne brugere, da det kan gøre en potentiel angriberens livsstil lettere.
  3. brug bundne parametre. Bundne parametre giver dig mulighed for at gemme brugerdata i en variabel og derefter indsætte dem i en s .l-sætning, der er oprettet med pladsholdere. Da S .l-sætningen og variablen sendes til serveren separat, er bundne parametre gode til at beskytte mod injektion. Tag den lille Bobby T!, Et eksempel på bundne parametre i forbindelse med en opdatering af metode i Ruby vil se ud som dette:
def update sql = <<-SQL UPDATE students SET name = ?, grade = ? WHERE id = ? SQL DB.execute(sql, )end

Det er vanvittigt at tro, at noget så simpelt og godt forstået, er stadig ansvarlig for så mange store brud på datasikkerheden., Selv i højprofilerede tilfælde som vælgerregistreringshacks nævnt ovenfor og det nylige e .uifa. – brud (som ikke skyldtes s .l-injektion, men til en lignende sårbarhed, som virksomheden ikke kunne adressere), kommer roden til sårbarheden ned på menneskelig fejl og manglende opmærksomhed på detaljer. At tage sig tid til omhyggeligt at tænke igennem problemet kan betydeligt hjælpe os med at beskytte brugerdata mod almindelige brud, især s .l-injektioner.