Hoe foarkomt MySQL sql-ynjeksje? SQL ynjeksje prinsipe en previnsje

MySQLHoe kinne jo sql-ynjeksje foarkomme? SQL ynjeksje prinsipe en previnsje

MySQL en SQL ynjeksje

As jo ​​nimme de gegevens ynfierd troch de brûker fia in webside en ynfoegje it yn inMySQL databank, dan kinne der SQL-ynjeksje feiligensproblemen wêze.

Dit haadstik sil jo yntrodusearje hoe't jo SQL-ynjeksje kinne foarkomme en skripts brûke om ynjeksjede karakters yn SQL te filterjen.

De saneamde SQL-ynjeksje is om de tsjinner te ferrifeljen om kweade SQL-kommando's út te fieren troch SQL-kommando's yn it webformulier yn te foegjen om de query-string fan 'e domeinnamme of sidefersyk yn te stjoeren of yn te fieren.

Wy moatte nea fertrouwe brûkersynput, wy moatte oannimme dat brûkersynputgegevens ûnfeilich binne, en wy moatte allegear brûkersynputgegevens filterje.

Yn it folgjende foarbyld moat de ynfierde brûkersnamme in kombinaasje wêze fan letters, sifers en ûnderstreken, en de brûkersnamme moat tusken 8 en 20 tekens lang wêze:

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

Litte wy ris sjen nei de SQL-situaasje dy't foarkomt as gjin spesjale tekens wurde filtere:

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

Yn de boppesteande ynjeksje statement hawwe wy de fariabele fan $name net filtere. De SQL-stelling dy't wy net nedich binne is ynfoege yn $name, dy't alle gegevens yn 'e brûkerstabel wiskje sil.

mysqli_query () yn PHP is net tastien te fieren meardere SQL útspraken, mar SQLite en PostgreSQL kin útfiere meardere SQL útspraken tagelyk, dus wy moatte strang ferifiearje de gegevens fan dizze brûkers.

Om SQL-ynjeksje te foarkommen, moatte wy omtinken jaan oan de folgjende punten:

  • 1. Nea fertrouwe brûkersynput.Kontrolearje de ynfier fan 'e brûker, jo kinne reguliere útdrukkingen brûke, of de lingte beheine; inkele oanhalings konvertearje en dûbele "-", ensfh.
  • 2. Nea brûke dynamyske assembly sql, kinne jo gebrûk meitsje fan parameterized sql of direkt brûke bewarre prosedueres foar gegevens query en tagong.
  • 3. Nea brûke database ferbinings mei administrator privileezjes, brûk aparte database ferbinings mei beheinde privileezjes foar eltse applikaasje.
  • 4. Net bewarje fertroulike ynformaasje direkt, fersiferje of hash út wachtwurden en gefoelige ynformaasje.
  • 5. De útsûnderingsynformaasje fan 'e applikaasje moat sa min mooglik hints jaan, en it is it bêste om oanpaste flaterynformaasje te brûken om de orizjinele flaterynformaasje te wrapjen
  • 6. De deteksjemetoade fan sql-ynjeksje oannimt algemien auxiliarySoftwareOf it websideplatfoarm om te detektearjen, de software brûkt yn 't algemien it sql-ynjeksje-deteksje-ark jsky, it websideplatfoarm hat it Yisi-webside-feiligensplatfoarmdeteksje-ark. MDCSOFT SCAN et al.It brûken fan MDCSOFT-IPS kin effektyf ferdigenje tsjin SQL-ynjeksje, XSS-oanfallen, ensfh.

Foarkom SQL-ynjeksje

Yn skripttalen lykas Perl en PHP kinne jo ûntkomme oan 'e gegevens ynfierd troch de brûker om SQL-ynjeksje te foarkommen.

De MySQL-útwreiding foar PHP leveret de funksje mysqli_real_escape_string() om spesjale ynfiertekens te ûntkommen.

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

Ynjeksje yn Like Statements

As jo ​​​​opfreegje lykas, as de brûker wearden ynfiert mei "_" en "%", sil dit barre: de brûker woe oarspronklik "abcd_" opfreegje, mar de queryresultaten omfetsje "abcd_", "abcde", en "abcdf" " Etc.; it probleem komt ek foar as de brûker "30%" opfreegje wol (notysje: tritich prosint).

Yn in PHP-skript kinne wy ​​​​de addcslashes () funksje brûke om de boppesteande situaasje te behanneljen, lykas yn it folgjende foarbyld:

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

De funksje addcslashes() foeget in backslash ta foar it oantsjutte karakter.

Syntaksis opmaak:

addcslashes(string,characters)
Parameterbeskriuwing
stringRequired.Spesifisearret de tekenrige om te kontrolearjen.
tekensFakultatyf.Spesifisearret it karakter of berik fan tekens beynfloede troch addcslashes ().

Hope Chen Weiliang Blog ( https://www.chenweiliang.com/ ) dield "Hoe foarkomt MySQL sql-ynjeksje? sql-ynjeksjeprinsipe en previnsje", sil it jo helpe.

Wolkom om de keppeling fan dit artikel te dielen:https://www.chenweiliang.com/cwl-500.html

Wolkom by it Telegram-kanaal fan Chen Weiliang's blog om de lêste updates te krijen!

🔔 Wês de earste om de weardefolle "ChatGPT Content Marketing AI Tool Usage Guide" te krijen yn 'e kanaaltopmap! 🌟
📚 Dizze hantlieding befettet enoarme wearde, 🌟Dit is in seldsume kâns, mis it net! ⏰⌛💨
Diel en like as jo wolle!
Jo dielen en likes binne ús trochgeande motivaasje!

 

发表 评论

Jo e-postadres wurdt net publisearre. Ferplichte fjilden wurde brûkt * Etiket

rôlje nei boppen