MySQLKiel malhelpi sql-injekton? SQL-injekto principo kaj preventado
MySQL kaj SQL-injekto
Se vi prenas la datumojn enigitajn de la uzanto per retpaĝo kaj enmetas ĝin en aMySQL-datumbazo, tiam povas esti SQL-injektaj sekurecproblemoj.
Ĉi tiu ĉapitro prezentos vin kiel malhelpi SQL-injekton kaj uzi skriptojn por filtri injektitajn signojn en SQL.
La tielnomita SQL-injekto devas trompi la servilon por ekzekuti malicajn SQL-komandojn enmetante SQL-komandojn en la retformularon por sendi aŭ enigi la demandŝnuron de la domajna nomo aŭ paĝa peto.
Ni neniam devus fidi uzantenigaĵon, ni devas supozi, ke uzantenigodatenoj estas nesekuraj, kaj ni ĉiuj devas filtri uzantenigdatenojn.
En la sekva ekzemplo, la enigita uzantnomo devas esti kombinaĵo de literoj, ciferoj kaj substrekoj, kaj la uzantnomo devas esti inter 8 kaj 20 signoj longa:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
Ni rigardu la SQL-situacion, kiu okazas kiam neniuj specialaj signoj estas filtritaj:
// 设定$name 中插入了我们不需要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
En la supra injekta deklaro, ni ne filtris la variablon de $name.La SQL-deklaro, kiun ni ne bezonas, estas enmetita en $name, kiu forigos ĉiujn datumojn en la tabelo de uzantoj.
mysqli_query() en PHP ne rajtas ekzekuti plurajn SQL-deklarojn, sed en SQLite kaj PostgreSQL, pluraj SQL-deklaroj povas esti ekzekutitaj samtempe, do ni devas strikte kontroli la datumojn de ĉi tiuj uzantoj.
Por malhelpi SQL-injekton, ni devas atenti la jenajn punktojn:
- 1. Neniam fidu uzantan enigon.Kontrolu la enigon de la uzanto, vi povas uzi regulajn esprimojn, aŭ limigi la longon; konverti unuopaj citiloj kaj duobla "-", ktp.
- 2. Neniam uzu dinamikan asembleon sql, vi povas uzi parametrizitan sql aŭ rekte uzi konservitajn procedurojn por datumdemandado kaj aliro.
- 3. Neniam uzu datumbazkonektojn kun administranto-privilegioj, uzu apartajn datumbazajn konektojn kun limigitaj privilegioj por ĉiu aplikaĵo.
- 4. Ne stoku konfidencajn informojn rekte, ĉifri aŭ elhaŝi pasvortojn kaj sentemajn informojn.
- 5. La esceptaj informoj de la aplikaĵo devus doni kiel eble plej malmultajn sugestojn, kaj plej bone estas uzi kutimajn erarajn informojn por envolvi la originalajn erarajn informojn.
- 6. La detekta metodo de sql-injekto ĝenerale adoptas helpanProgramaroAŭ la retejo platformo por detekti, la programaro ĝenerale uzas la sql injekto detekto ilo jsky, la retejo platformo havas la Yisi retejo sekureco platformo detekto ilo. MDCSOFT SCAN et al.Uzi MDCSOFT-IPS povas efike defendi kontraŭ SQL-injekto, XSS-atakoj, ktp.
Malhelpi SQL-Injekton
En skriptlingvoj kiel Perl kaj PHP vi povas eskapi la datumojn enigitajn de la uzanto por malhelpi SQL-injekton.
La MySQL-etendo por PHP disponigas la mysqli_real_escape_string() funkcion por eskapi specialajn enigajn signojn.
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysqli_real_escape_string($conn, $name); mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
Injekto en Similaj Deklaroj
Demandante kiel, se la valoro enigita de la uzanto havas "_" kaj "%", tio okazos: la uzanto origine volis pridemandi "abcd_", sed estas "abcd_", "abcde" kaj "abcdf" en la serĉrezulto Ktp.; la problemo ankaŭ okazas kiam la uzanto volas pridemandi "30%" (noto: tridek procentoj).
En PHP-skripto ni povas uzi la funkcion addcslashes() por trakti la supran situacion, kiel en la sekva ekzemplo:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_"); // $sub == \%something\_ mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
La funkcio addcslashes() aldonas inversan oblikvon antaŭ la specifita signo.
Sintaksoformato:
addcslashes(string,characters)
| Parametro | Priskribo |
|---|---|
| ĉeno | Bezonata.Specifas la ĉenon por kontroli. |
| karakteroj | Laŭvola.Specifas la karakteron aŭ gamon da signoj tuŝitaj de addcslashes(). |
Hope Chen Weiliang Blogo ( https://www.chenweiliang.com/ ) dividis "Kiel MySQL malhelpas sql-injekton? sql-injekto principo kaj preventado", ĝi helpos vin.
Bonvenon dividi la ligon de ĉi tiu artikolo:https://www.chenweiliang.com/cwl-500.html
