MySQLKuinka estää sql-injektio? SQL-injektioperiaate ja esto
MySQL ja SQL-injektio
Jos otat käyttäjän syöttämät tiedot web-sivun kautta ja lisäät ne aMySQL-tietokanta, SQL-injektion suojausongelmia voi olla.
Tässä luvussa kerrotaan, kuinka voit estää SQL-lisäyksen ja käyttää komentosarjoja lisättyjen merkkien suodattamiseen SQL:ssä.
Ns. SQL-injektio on huijata palvelin suorittamaan haitallisia SQL-komentoja lisäämällä SQL-komentoja verkkolomakkeeseen toimialueen nimen tai sivupyynnön kyselymerkkijonon lähettämiseksi tai syöttämiseksi.
Meidän ei pitäisi koskaan luottaa käyttäjän syötteisiin, meidän on oletettava, että käyttäjän syöttämä data on vaarallista, ja meidän kaikkien on suodatettava käyttäjän syöttämä data.
Seuraavassa esimerkissä syötetyn käyttäjänimen on oltava kirjaimien, numeroiden ja alaviivojen yhdistelmä, ja käyttäjänimen on oltava 8–20 merkkiä pitkä:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
Katsotaanpa SQL-tilannetta, joka ilmenee, kun erikoismerkkejä ei suodateta:
// 设定$name 中插入了我们不需要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
Yllä olevassa lisäyskäskyssä emme suodattaneet muuttujaa $name. SQL-lause, jota emme tarvitse, lisätään kohtaan $name, mikä poistaa kaikki tiedot käyttäjätaulukosta.
PHP:n mysqli_query() ei saa suorittaa useita SQL-käskyjä, mutta SQLite ja PostgreSQL voivat suorittaa useita SQL-käskyjä samanaikaisesti, joten meidän on tarkistettava tarkasti näiden käyttäjien tiedot.
SQL-injektion estämiseksi meidän on kiinnitettävä huomiota seuraaviin kohtiin:
- 1. Älä koskaan luota käyttäjän syötteisiin.Tarkista käyttäjän syöte, voit käyttää säännöllisiä lausekkeita tai rajoittaa pituutta, muuntaa yksittäisiä lainausmerkkejä ja kaksois "-" jne.
- 2. Älä koskaan käytä dynaamista kokoonpano-sql:ää, voit käyttää parametroitua sql:ää tai käyttää suoraan tallennettuja proseduureja tietojen kyselyyn ja pääsyyn.
- 3. Älä koskaan käytä tietokantayhteyksiä järjestelmänvalvojan oikeuksilla, vaan käytä jokaiselle sovellukselle erillisiä tietokantayhteyksiä rajoitetuilla oikeuksilla.
- 4. Älä säilytä luottamuksellisia tietoja suoraan, salaa tai tiivistä salasanoja ja arkaluonteisia tietoja.
- 5. Sovelluksen poikkeustietojen tulee antaa mahdollisimman vähän vihjeitä, ja on parasta käyttää mukautettuja virhetietoja alkuperäisten virhetietojen käärimiseen
- 6. Sql-injektion tunnistusmenetelmä käyttää yleensä apumenetelmiä软件Tai sivuston alustan havaitsemiseen, ohjelmisto käyttää yleensä sql-injektiotunnistustyökalua jsky, verkkosivustoalustalla on Yisi verkkosivuston suojausalusta havaitsemistyökalu. MDCSOFT SCAN et ai.MDCSOFT-IPS:n käyttäminen voi suojautua tehokkaasti SQL-injektiota, XSS-hyökkäyksiä jne.
Estä SQL-injektio
Skriptikielillä, kuten Perl ja PHP, voit välttää käyttäjän syöttämät tiedot estääksesi SQL-injektion.
PHP:n MySQL-laajennus tarjoaa mysqli_real_escape_string()-toiminnon erikoissyöttömerkkien välttämiseksi.
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysqli_real_escape_string($conn, $name); mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
Injektio kaltaisissa lausunnoissa
Kun kysytään esimerkiksi, jos käyttäjä syöttää arvot "_" ja "%", tämä tapahtuu: käyttäjä halusi alun perin kysyä "abcd_", mutta kyselyn tulokset sisältävät "abcd_", "abcde" ja "abcdf" " jne.; ongelma ilmenee myös silloin, kun käyttäjä haluaa tehdä kyselyn "30%" (huomautus: kolmekymmentä prosenttia).
PHP-skriptissä voimme käyttää addcslashes()-funktiota yllä olevan tilanteen käsittelemiseen, kuten seuraavassa esimerkissä:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_"); // $sub == \%something\_ mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
Addcslashes()-funktio lisää kenoviivan ennen määritettyä merkkiä.
Syntaksimuoto:
addcslashes(string,characters)
| 参数 | kuvaus |
|---|---|
| jono | Vaaditaan.Määrittää tarkistettavan merkkijonon. |
| merkkejä | Valinnainen.Määrittää merkin tai merkkialueen, johon addcslashes() vaikuttaa. |
Hope Chen Weiliang -blogi ( https://www.chenweiliang.com/ ) jaettu "Kuinka MySQL estää sql-injektion? sql-injektioperiaate ja ehkäisy", se auttaa sinua.
Tervetuloa jakamaan tämän artikkelin linkki:https://www.chenweiliang.com/cwl-500.html
Avataksesi lisää piilotettuja temppuja🔑, tervetuloa liittymään Telegram-kanavallemme!
Jaa ja tykkää jos pidät! Jakamasi ja tykkäyksesi ovat jatkuva motivaatiomme!