MySQLCum să preveniți injecția sql? Principiul și prevenirea injectării SQL
MySQL și injecție SQL
Dacă luați datele introduse de utilizator printr-o pagină web și le introduceți într-unBaza de date MySQL, atunci pot exista probleme de securitate cu injectarea SQL.
Acest capitol va prezenta cum să preveniți injectarea SQL și să filtrați caracterele injectate în SQL prin scripturi.
Așa-numita injecție SQL este de a înșela serverul pentru a executa comenzi SQL rău intenționate prin inserarea comenzilor SQL în formularul web pentru a trimite sau introduce șirul de interogare al numelui de domeniu sau al cererii de pagină.
Nu ar trebui să avem încredere niciodată în inputul utilizatorului, trebuie să presupunem că datele introduse de utilizator sunt nesigure și cu toții trebuie să filtram datele introduse de utilizator.
În exemplul următor, numele de utilizator introdus trebuie să fie o combinație de litere, cifre și caractere de subliniere, iar numele de utilizator trebuie să aibă între 8 și 20 de caractere:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
Să aruncăm o privire la situația SQL care apare atunci când nu sunt filtrate caractere speciale:
// 设定$name 中插入了我们不需要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
În instrucțiunea de injectare de mai sus, nu am filtrat variabila $name, iar instrucțiunea SQL de care nu avem nevoie este inserată în $name, care va șterge toate datele din tabelul utilizatori.
mysqli_query() în PHP nu are voie să execute mai multe instrucțiuni SQL, dar în SQLite și PostgreSQL, mai multe instrucțiuni SQL pot fi executate în același timp, așa că trebuie să verificăm cu strictețe datele acestor utilizatori.
Pentru a preveni injectarea SQL, trebuie să acordăm atenție următoarelor puncte:
- 1. Nu aveți încredere niciodată în inputul utilizatorului.Verificați introducerea utilizatorului, puteți utiliza expresii regulate sau limitați lungimea; convertiți ghilimele simple și „-” dublu etc.
- 2. Nu utilizați niciodată SQL asamblare dinamică, puteți utiliza SQL parametrizat sau puteți utiliza direct procedurile stocate pentru interogarea și accesarea datelor.
- 3. Nu utilizați niciodată conexiuni la baze de date cu privilegii de administrator, utilizați conexiuni la baze de date separate cu privilegii limitate pentru fiecare aplicație.
- 4. Nu stocați informații confidențiale în mod direct, nu criptați sau eliminați parolele și informațiile sensibile.
- 5. Informațiile de excepție ale aplicației ar trebui să ofere cât mai puține indicii posibil și cel mai bine este să utilizați informații despre eroare personalizate pentru a încheia informațiile originale despre eroare.
- 6. Metoda de detectare a injectării sql adoptă în general auxiliare软件Sau platforma site-ului web pentru a detecta, software-ul folosește în general instrumentul de detectare a injecției sql jsky, iar platforma site-ului are instrumentul de detectare a platformei de securitate a site-ului web Yisi. MDCSOFT SCAN și colab.Utilizarea MDCSOFT-IPS poate apăra eficient împotriva injecției SQL, atacurilor XSS etc.
Preveniți injectarea SQL
În limbaje de scripting precum Perl și PHP puteți scăpa de datele introduse de utilizator pentru a preveni injectarea SQL.
Extensia MySQL pentru PHP oferă funcția mysqli_real_escape_string() pentru a evada caracterele speciale de intrare.
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysqli_real_escape_string($conn, $name); mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
Injectare în declarații similare
Când interogând, dacă utilizatorul introduce valori cu „_” și „%”, acest lucru se va întâmpla: utilizatorul a dorit inițial să interogă „abcd_”, dar rezultatele interogării includ „abcd_”, „abcde” și „abcdf”. „ Etc.; problema apare și atunci când utilizatorul dorește să interogheze „30%” (notă: treizeci la sută).
În scriptul PHP putem folosi funcția addcslashes() pentru a gestiona situația de mai sus, ca în exemplul următor:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_"); // $sub == \%something\_ mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
Funcția addcslashes() adaugă o bară oblică inversă înainte de caracterul specificat.
Format de sintaxă:
addcslashes(string,characters)
| 参数 | Descriere |
|---|---|
| şir | Necesar.Specifică șirul de verificat. |
| caractere | Opțional.Specifică caracterul sau intervalul de caractere afectate de addcslashes(). |
Hope Chen Weiliang Blog ( https://www.chenweiliang.com/ ) shared „Cum previne MySQL injectarea sql? Principiul și prevenirea injecției sql”, vă va ajuta.
Bine ați venit să distribuiți linkul acestui articol:https://www.chenweiliang.com/cwl-500.html
Pentru a debloca mai multe trucuri ascunse🔑, te invităm să te alături canalului nostru de Telegram!
Distribuie si da like daca iti place! Share-urile și like-urile tale sunt motivația noastră continuă!