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 |
---|---|
string | Obligatorisk.Angir strengen som skal sjekkes. |
tegn | Valgfri.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!
📚 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!