Hvordan forhindrer MySQL sql-injeksjon? SQL-injeksjonsprinsipp og forebygging

MySQLHvordan forhindre sql-injeksjon? SQL-injeksjonsprinsipp og forebygging

MySQL og SQL-injeksjon

Hvis du tar dataene som er lagt inn av brukeren gjennom en nettside og setter dem inn i enMySQL-database, så kan det være sikkerhetsproblemer med SQL-injeksjon.

Dette kapittelet vil introdusere deg til hvordan du forhindrer SQL-injeksjon og bruker skript til å filtrere injiserte tegn i SQL.

Den såkalte SQL-injeksjonen er å lure serveren til å utføre ondsinnede SQL-kommandoer ved å sette inn SQL-kommandoer i nettskjemaet for å sende inn eller legge inn spørringsstrengen til domenenavnet eller sideforespørselen.

Vi bør aldri stole på brukerinndata, vi må anta at brukerinndata er utrygge, og vi må alle filtrere brukerinndata.

I det følgende eksempelet må det angitte brukernavnet være en kombinasjon av bokstaver, tall og understreker, og brukernavnet må være mellom 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 输入异常";
}

La oss ta en titt på SQL-situasjonen som oppstår når ingen spesialtegn filtreres:

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

I injeksjonssetningen ovenfor filtrerte vi ikke variabelen til $name. SQL-setningen som vi ikke trenger settes inn i $name, som vil slette alle dataene i brukertabellen.

mysqli_query() i PHP har ikke lov til å kjøre flere SQL-setninger, men SQLite og PostgreSQL kan kjøre flere SQL-setninger samtidig, så vi må strengt verifisere dataene til disse brukerne.

For å forhindre SQL-injeksjon, må vi ta hensyn til følgende punkter:

  • 1. Stol aldri på brukerinndata.Sjekk brukerens input, du kan bruke regulære uttrykk, eller begrense lengden; konverter enkle anførselstegn og doble "-", etc.
  • 2. Bruk aldri dynamisk assembly sql, du kan bruke parameterisert sql eller direkte bruke lagrede prosedyrer for dataspørring og tilgang.
  • 3. Bruk aldri databasetilkoblinger med administratorrettigheter, bruk separate databasetilkoblinger med begrensede rettigheter for hver applikasjon.
  • 4. Ikke lagre konfidensiell informasjon direkte, krypter eller hash ut passord og sensitiv informasjon.
  • 5. Unntaksinformasjonen til applikasjonen skal gi så få hint som mulig, og det er best å bruke tilpasset feilinformasjon for å pakke inn den opprinnelige feilinformasjonen
  • 6. Deteksjonsmetoden for sql-injeksjon vedtar generelt hjelpemidlerprogramvareEller nettstedsplattformen for å oppdage, programvaren bruker vanligvis sql-injeksjonsdeteksjonsverktøyet jsky, nettstedets plattform har Yisi-nettstedets sikkerhetsplattformdeteksjonsverktøy. MDCSOFT SCAN et al.Bruk av MDCSOFT-IPS kan effektivt forsvare seg mot SQL-injeksjon, XSS-angrep, etc.

Forhindre SQL-injeksjon

I skriptspråk som Perl og PHP kan du unnslippe dataene som er lagt inn av brukeren for å forhindre SQL-injeksjon.

MySQL-utvidelsen for PHP gir mysqli_real_escape_string()-funksjonen for å unnslippe spesielle inndatategn.

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

Injeksjon i like-utsagn

Når du spør, hvis brukeren skriver inn verdier med "_" og "%", vil dette skje: brukeren ønsket opprinnelig å spørre "abcd_", men søkeresultatene inkluderer "abcd_", "abcde" og "abcdf" " Etc.; problemet oppstår også når brukeren ønsker å spørre "30%" (merk: tretti prosent).

I et PHP-skript kan vi bruke addcslashes()-funksjonen for å håndtere situasjonen ovenfor, 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}%'");

Addcslashes()-funksjonen legger til en omvendt skråstrek før det angitte tegnet.

Syntaksformat:

addcslashes(string,characters)
参数beskrivelse
stringObligatorisk.Angir strengen som skal sjekkes.
tegnValgfri.Angir tegnet eller rekkevidden av tegn som påvirkes av addcslashes().

Hope Chen Weiliang blogg ( https://www.chenweiliang.com/ ) delt "Hvordan forhindrer MySQL sql-injeksjon? sql-injeksjonsprinsipp og forebygging", vil det hjelpe deg.

Velkommen til å dele lenken til denne artikkelen:https://www.chenweiliang.com/cwl-500.html

Velkommen til Telegram-kanalen til Chen Weiliangs blogg for å få de siste oppdateringene!

🔔 Vær den første til å få den verdifulle "ChatGPT Content Marketing AI Tool Usage Guide" i kanalens toppkatalog! 🌟
📚 Denne guiden inneholder enorm verdi, 🌟Dette er en sjelden mulighet, ikke gå glipp av den! ⏰⌛💨
Del og lik om du vil!
Din deling og likes er vår kontinuerlige motivasjon!

 

发表 评论

E-postadressen din vil ikke offentliggjøres. 必填 项 已 用 * Merkelapp

bla til toppen