Kako MySQL sprječava sql injekciju? Princip SQL injekcije i prevencija

MySQLKako spriječiti sql injekciju? Princip SQL injekcije i prevencija

MySQL i SQL injekcija

Ako uzmete podatke koje je korisnik unio putem web stranice i ubacite ih u aMySQL baza podataka, tada mogu postojati sigurnosni problemi SQL injekcije.

Ovo poglavlje će vas upoznati s tim kako spriječiti SQL injekciju i koristiti skripte za filtriranje ubrizganih znakova u SQL-u.

Takozvana SQL injekcija je zavaravanje servera da izvrši zlonamjerne SQL naredbe umetanjem SQL naredbi u web obrazac za slanje ili unos niza upita imena domene ili zahtjeva stranice.

Nikada ne bismo smjeli vjerovati korisničkom unosu, moramo pretpostaviti da su korisnički ulazni podaci nesigurni i svi moramo filtrirati korisničke ulazne podatke.

U sljedećem primjeru, uneseno korisničko ime mora biti kombinacija slova, brojeva i donjih crta, a korisničko ime mora biti dugo između 8 i 20 znakova:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

Pogledajmo SQL situaciju koja se javlja kada se ne filtriraju posebni znakovi:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

U gornjoj injekcionoj naredbi nismo filtrirali varijablu $name. SQL izraz koji nam nije potreban je umetnut u $name, što će izbrisati sve podatke u tabeli korisnika.

mysqli_query() u PHP-u nije dozvoljeno da izvršava više SQL naredbi, ali SQLite i PostgreSQL mogu izvršiti više SQL izraza u isto vrijeme, tako da moramo striktno provjeriti podatke ovih korisnika.

Da bismo spriječili SQL injekciju, moramo obratiti pažnju na sljedeće točke:

  • 1. Nikada nemojte vjerovati unosu korisnika.Provjerite unos korisnika, možete koristiti regularne izraze ili ograničiti dužinu; pretvoriti jednostruke navodnike i dvostruke "-" itd.
  • 2. Nikada nemojte koristiti dinamički sklop sql, možete koristiti parametrizirani sql ili direktno koristiti pohranjene procedure za upit podataka i pristup.
  • 3. Nikada nemojte koristiti veze baze podataka s administratorskim privilegijama, koristite zasebne veze baze podataka s ograničenim privilegijama za svaku aplikaciju.
  • 4. Nemojte direktno pohranjivati ​​povjerljive informacije, šifrirati ili heširati lozinke i osjetljive informacije.
  • 5. Informacije o izuzetku aplikacije treba da daju što je moguće manje nagoveštaja, a najbolje je koristiti prilagođene informacije o grešci za omotavanje originalnih informacija o grešci
  • 6. Metoda detekcije sql injekcije općenito usvaja pomoćnu软件Ili platforma web stranice za otkrivanje, softver općenito koristi alat za otkrivanje sql injekcije jsky, platforma web stranice ima alat za otkrivanje sigurnosne platforme Yisi web stranice. MDCSOFT SCAN et al.Korištenje MDCSOFT-IPS može efikasno braniti od SQL injekcije, XSS napada, itd.

Sprečavanje SQL injekcije

U skript jezicima kao što su Perl i PHP možete pobjeći od podataka koje je unio korisnik kako biste spriječili SQL injekciju.

MySQL ekstenzija za PHP pruža funkciju mysqli_real_escape_string() za izbjegavanje posebnih ulaznih znakova.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Injekcija u Like izjavama

Prilikom upita poput, ako korisnik unese vrijednosti sa "_" i "%", ovo će se dogoditi: korisnik je prvobitno želio da postavi upit "abcd_", ali rezultati upita uključuju "abcd_", "abcde" i "abcdf " Itd.; problem se javlja i kada korisnik želi upitati "30%" (napomena: trideset posto).

U PHP skripti možemo koristiti funkciju addcslashes() za rješavanje gornje situacije, kao u sljedećem primjeru:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

Funkcija addcslashes() dodaje obrnutu kosu crtu prije navedenog znaka.

Format sintakse:

addcslashes(string,characters)
parametaropis
nizObavezno.Određuje niz za provjeru.
likoviOpciono.Određuje karakter ili raspon znakova na koje utječe addcslashes().

Hope Chen Weiliang Blog ( https://www.chenweiliang.com/ ) dijeli "Kako MySQL sprječava sql injekciju? princip sql injekcije i prevencija", pomoći će vam.

Dobrodošli da podijelite link ovog članka:https://www.chenweiliang.com/cwl-500.html

Dobrodošli na Telegram kanal bloga Chen Weilianga kako biste dobili najnovije informacije!

🔔 Budite prvi koji će dobiti vrijedan "Vodič za korištenje AI alata za marketing sadržaja ChatGPT" u glavnom direktoriju kanala! 🌟
📚 Ovaj vodič ima ogromnu vrijednost, 🌟Ovo je rijetka prilika, ne propustite je! ⏰⌛💨
Podelite i lajkujte ako želite!
Vaše dijeljenje i lajkovi su naša stalna motivacija!

 

Komentari

Vaša adresa e-pošte neće biti objavljena. Koriste se obavezna polja * Oznaka

skrolujte na vrh