Hvordan forhindrer MySQL sql-injektion? SQL-injektionsprincip og forebyggelse

MySQLHvordan forhindrer man sql-injektion? SQL-injektionsprincip og forebyggelse

MySQL og SQL-injektion

Hvis du tager data indtastet af brugeren gennem en webside og indsætter dem i enMySQL database, så kan der være sikkerhedsproblemer med SQL-injektion.

Dette kapitel vil introducere, hvordan man forhindrer SQL-injektion og filtrerer de injicerede tegn i SQL gennem scripts.

Den såkaldte SQL-injektion er at narre serveren til at udføre ondsindede SQL-kommandoer ved at indsætte SQL-kommandoer i webformularen for at indsende eller indtaste forespørgselsstrengen for domænenavnet eller sideanmodningen.

Vi bør aldrig stole på brugerinput, vi må antage, at brugerinputdata er usikre, og vi er alle nødt til at filtrere brugerinputdata.

I det følgende eksempel skal det indtastede brugernavn være en kombination af bogstaver, tal og understregninger, og brugernavnet skal være mellem 8 og 20 tegn langt:

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

Lad os tage et kig på SQL-situationen, der opstår, når specialtegn ikke filtreres:

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

I ovenstående injektionssætning filtrerede vi ikke variablen $name. SQL-sætningen, som vi ikke har brug for, indsættes i $name, hvilket vil slette alle data i brugertabellen.

mysqli_query() i PHP er ikke tilladt at udføre flere SQL-sætninger, men SQLite og PostgreSQL kan udføre flere SQL-sætninger på samme tid, så vi er nødt til strengt at verificere disse brugeres data.

For at forhindre SQL-injektion skal vi være opmærksomme på følgende punkter:

  • 1. Stol aldrig på brugerinput.Tjek brugerens input, du kan bruge regulære udtryk eller begrænse længden; konverter enkelte anførselstegn og dobbelt "-" osv.
  • 2. Brug aldrig dynamisk assembly sql, du kan bruge parameteriseret sql eller direkte bruge lagrede procedurer til dataforespørgsel og adgang.
  • 3. Brug aldrig databaseforbindelser med administratorrettigheder, brug separate databaseforbindelser med begrænsede rettigheder for hver applikation.
  • 4. Gem ikke fortrolige oplysninger direkte, krypter eller hash ud adgangskoder og følsomme oplysninger.
  • 5. Applikationens undtagelsesoplysninger bør give så få hints som muligt, og det er bedst at bruge brugerdefinerede fejloplysninger til at pakke de originale fejloplysninger
  • 6. Detektionsmetoden til sql-injektion vedtager generelt hjælpe软件Eller webstedsplatformen til at opdage, softwaren bruger generelt sql-injektionsdetektionsværktøjet jsky, webstedsplatformen har Yisi-webstedets sikkerhedsplatform detektionsværktøj. MDCSOFT SCAN et al.Brug af MDCSOFT-IPS kan effektivt forsvare sig mod SQL-injektion, XSS-angreb osv.

Forebyg SQL-injektion

I scriptsprog som Perl og PHP kan du undslippe de data, som brugeren indtaster for at forhindre SQL-injektion.

MySQL-udvidelsen til PHP giver funktionen mysqli_real_escape_string() til at undslippe specielle inputtegn.

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

Injektion i lignende erklæringer

Når du forespørger som, hvis brugeren indtaster værdier med "_" og "%", vil dette ske: brugeren ønskede oprindeligt at forespørge "abcd_", men forespørgselsresultaterne inkluderer "abcd_", "abcde" og "abcdf" " Etc.; problemet opstår også, når brugeren ønsker at forespørge "30%" (bemærk: tredive procent).

I et PHP-script kan vi bruge funktionen addcslashes() til at håndtere ovenstående situation, som i følgende eksempel:

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

Funktionen addcslashes() tilføjer en omvendt skråstreg før det angivne tegn.

Syntaksformat:

addcslashes(string,characters)
参数描述
strengPåkrævet.Angiver den streng, der skal kontrolleres.
tegnValgfri.Angiver tegnet eller rækken af ​​tegn, der påvirkes af addcslashes().

Hope Chen Weiliang Blog ( https://www.chenweiliang.com/ ) delt "Hvordan forhindrer MySQL sql-injektion? sql-injektionsprincip og forebyggelse", vil det hjælpe dig.

Velkommen til at dele linket til denne artikel:https://www.chenweiliang.com/cwl-500.html

Velkommen til Telegram-kanalen på Chen Weiliangs blog for at få de seneste opdateringer!

🔔 Vær den første til at få den værdifulde "ChatGPT Content Marketing AI Tool Usage Guide" i kanalens øverste bibliotek! 🌟
📚 Denne guide indeholder enorm værdi, 🌟Dette er en sjælden mulighed, gå ikke glip af det! ⏰⌛💨
Del og like hvis du har lyst!
Din deling og likes er vores kontinuerlige motivation!

 

发表 评论

Din e-mail-adresse vil ikke blive offentliggjort. 必填 项 已 用 * 标注

scroll til toppen