sau Cum de A Proteja Utilizatorul de Date Din SQL injection

xkcd

Fun Facts:

SQL injection a fost în jurul valorii de destul de mult de când site-uri au date stocate în baze de date.Proiectul Open Web Application Security a evaluat atacurile prin injecție drept una dintre primele 10 amenințări cu care se confruntă aplicațiile web în 2017.,injecția SQL este încă responsabilă pentru multe scurgeri mari de date. În 2016, bazele de date de înregistrare a alegătorilor din Illinois și Arizona State Board of Elections au fost încălcate. În timp ce nicio informație nu a fost furată în Arizona, în Illinois atacatorii au avut acces la datele alegătorilor, inclusiv numele, adresa, data nașterii, sexul și numerele parțiale de securitate socială, pentru aproximativ 80,000 de persoane.⁴

asta e terifiant, ce este?injecția SQL este un tip de atac care vizează baza de date a unei aplicații prin inserarea codului neintenționat în câmpurile de introducere a utilizatorului., Profitând de sintaxa SQL, atacatorul poate utiliza câmpuri de intrare pentru a capta informații din aceste baze de date — inclusiv lucruri precum parole și numere de carduri de credit. Cineva ar putea chiar să preia controlul asupra bazei de date sau să șteargă toate informațiile pe care le deține.

Cum Funcționează?SQL Injection funcționează prin utilizarea informațiilor inserate într-un câmp pentru a manipula instrucțiunea SQL corespunzătoare în efectuarea unei acțiuni neintenționate.,

aici este un exemplu de bază:

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

În acest exemplu să presupunem că variabila user_name este creat direct de la intrare utilizatorului pe un site web. Acest șir este inserat în instrucțiunea SQL de mai sus și toate câmpurile referitoare la acel nume de utilizator sunt returnate. Nu e mare lucru.

dar ce se întâmplă dacă cineva tastează Steve” sau 1 = 1 — – ca nume de utilizator? atunci SQL generat ar fi aceasta:

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

deoarece 1=1 este întotdeauna adevărat, acest lucru ar returna toate datele din tabel. Nu E Bine!,

Let’s take one more look at that comic.

xkcd

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

ei Bine, putem presupune că, dacă Micuțul Bobby Mese fost adăugate la baza de date a scolii de elevi, instrucțiunea SQL ar arata ceva de genul:

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

… și când ne introduce Bobby…

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

Când Bobby numele conține ); VALORILE argument este închisă în mijlocul numele și textul care urmează DROP TABLE elevi este o nouă declarație SQL care șterge toată masa. În cele din urmă — la final comentează SQL rămas, ignorând în esență restul codului original și asigurându-vă că nu apare nicio eroare.,

Deci, Ceea Ce Spun Este Datele Mele Nu Vor Fi Niciodată În Siguranță Din Nou?

Nope! Există de fapt o mulțime de pași puteți lua pentru a vă proteja de acest tip de atac. Să ne uităm la câteva:

  1. sterilizați datele. Primul pas este controlul a ceea ce utilizatorul are voie să introducă. Cel mai bun mod de a face acest lucru este de a limita tipurile de intrare permise pentru un anumit câmp., De exemplu, într-un câmp număr de telefon puteți permite doar introducerea numerică sau într-un câmp de e-mail permiteți numai caractere care pot fi găsite într-o adresă de e-mail validă. Evident, unele câmpuri vor necesita caractere care ar putea fi folosite într-un atac, deci această metodă nu este imbatabilă.
  2. configurați raportarea erorilor. Adesea, raportarea implicită a erorilor privind sistemele de gestionare a bazelor de date are informații de depanare a dezvoltatorilor în ea. Aceasta poate returna atacatorului informații utile, cum ar fi numele tabelelor sau numele coloanelor., Asigurați-vă că nu afișați acest tip de informații utilizatorilor externi, deoarece ar putea ușura viața unui potențial atacator.
  3. utilizați parametrii legați. Parametrii legați vă permit să stocați datele utilizatorului într-o variabilă și apoi să le introduceți într-o instrucțiune SQL care a fost creată cu substituenți. Deoarece instrucțiunea SQL și variabila sunt trimise separat serverului, parametrii legați sunt buni la protejarea împotriva injecției. Ia-l pe Bobby T!, Un exemplu legat de parametri într-o metodă de actualizare în Ruby ar arata astfel:
def update sql = <<-SQL UPDATE students SET name = ?, grade = ? WHERE id = ? SQL DB.execute(sql, )end

e O nebunie să crezi că ceva atât de simplu și bine înțeles este încă responsabil pentru atât de multe încălcări ale securității datelor., Chiar și în profil înalt de cazuri ca cel de înregistrare a alegătorilor hacks menționate mai sus și recenta Equifax încălcare (care nu era din cauza SQL injection, dar, pentru o asemenea vulnerabilitate că societatea nu a reușit să abordeze), rădăcină de vulnerabilitate vorba de o eroare umană și lipsa de atenție la detalii. Luarea timpului pentru a gândi cu atenție problema ne poate ajuta în mod semnificativ să protejăm datele utilizatorilor de încălcările comune, în special injecțiile SQL.