Hoe voorkomt MySQL sql-injectie? SQL-injectieprincipe en preventie

MySQLHoe sql-injectie voorkomen? SQL-injectieprincipe en preventie

MySQL en SQL-injectie

Als u de gegevens die door de gebruiker zijn ingevoerd via een webpagina en deze in een aMySQL-database, dan kunnen er beveiligingsproblemen met SQL-injectie zijn.

In dit hoofdstuk leert u hoe u SQL-injectie kunt voorkomen en hoe u scripts gebruikt om geïnjecteerde tekens in SQL te filteren.

De zogenaamde SQL-injectie is om de server te misleiden om kwaadaardige SQL-commando's uit te voeren door SQL-commando's in het webformulier in te voegen om de queryreeks van de domeinnaam of het paginaverzoek in te dienen of in te voeren.

We mogen gebruikersinvoer nooit vertrouwen, we moeten ervan uitgaan dat gebruikersinvoergegevens onveilig zijn en we moeten allemaal gebruikersinvoergegevens filteren.

In het volgende voorbeeld moet de ingevoerde gebruikersnaam een ​​combinatie zijn van letters, cijfers en onderstrepingstekens en moet de gebruikersnaam tussen 8 en 20 tekens lang zijn:

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

Laten we eens kijken naar de SQL-situatie die optreedt wanneer er geen speciale tekens worden gefilterd:

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

In de bovenstaande injectie-instructie hebben we de variabele $name niet gefilterd.De SQL-instructie die we niet nodig hebben, wordt ingevoegd in $name, waardoor alle gegevens in de gebruikerstabel worden verwijderd.

mysqli_query() in PHP is niet toegestaan ​​om meerdere SQL-instructies uit te voeren, maar in SQLite en PostgreSQL kunnen meerdere SQL-instructies tegelijkertijd worden uitgevoerd, dus we moeten de gegevens van deze gebruikers strikt verifiëren.

Om SQL-injectie te voorkomen, moeten we op de volgende punten letten:

  • 1. Vertrouw nooit gebruikersinvoer.Controleer de invoer van de gebruiker, u kunt reguliere expressies gebruiken of de lengte beperken; converteer enkele aanhalingstekens en dubbele "-", enz.
  • 2. Gebruik nooit dynamische assemblage sql, u kunt sql met parameters gebruiken of direct opgeslagen procedures gebruiken voor het opvragen en openen van gegevens.
  • 3. Gebruik nooit databaseverbindingen met beheerdersrechten, gebruik afzonderlijke databaseverbindingen met beperkte bevoegdheden voor elke toepassing.
  • 4. Sla vertrouwelijke informatie niet rechtstreeks op, en versleutel of hash-out wachtwoorden en gevoelige informatie.
  • 5. De uitzonderingsinformatie van de toepassing moet zo min mogelijk hints geven, en het is het beste om aangepaste foutinformatie te gebruiken om de oorspronkelijke foutinformatie in te pakken
  • 6. De opsporingsmethode van sql-injectie keurt over het algemeen hulp goed;软件Of het websiteplatform om te detecteren, de software gebruikt over het algemeen de sql-injectiedetectietool jsky, het websiteplatform heeft de Yisi-detectietool voor het websitebeveiligingsplatform. MDCSOFT SCAN et al.Het gebruik van MDCSOFT-IPS kan effectief verdedigen tegen SQL-injectie, XSS-aanvallen, enz.

SQL-injectie voorkomen

In scripttalen zoals Perl en PHP kun je ontsnappen aan de gegevens die de gebruiker invoert om SQL-injectie te voorkomen.

De MySQL-extensie voor PHP biedt de functie mysqli_real_escape_string() om te ontsnappen aan speciale invoertekens.

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

Injectie in Like-statements

Bij het opvragen zoals, als de door de gebruiker ingevoerde waarde "_" en "%" heeft, zal dit gebeuren: de gebruiker wilde oorspronkelijk "abcd_" opvragen, maar er zijn "abcd_", "abcde" en "abcdf" in het zoekresultaat enz. Het probleem doet zich ook voor als de gebruiker "30%" wil opvragen (let op: dertig procent).

In een PHP-script kunnen we de functie addcslashes() gebruiken om de bovenstaande situatie af te handelen, zoals in het volgende voorbeeld:

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

De functie addcslashes() voegt een backslash toe voor het opgegeven teken.

Syntaxisformaat:

addcslashes(string,characters)
参数Omschrijving
snaarVerplicht.Specificeert de tekenreeks die moet worden gecontroleerd.
tekensOptioneel.Specificeert het teken of bereik van tekens dat wordt beïnvloed door addcslashes().

Hoop Chen Weiliang Blog ( https://www.chenweiliang.com/ ) shared "Hoe voorkomt MySQL sql-injectie? sql-injectieprincipe en preventie", zal het u helpen.

Welkom om de link van dit artikel te delen:https://www.chenweiliang.com/cwl-500.html

Welkom op het Telegram-kanaal van Chen Weiliang's blog voor de laatste updates!

🔔 Wees de eerste die de waardevolle "ChatGPT Content Marketing AI Tool Usage Guide" in de bovenste kanaaldirectory ontvangt! 🌟
📚 Deze gids bevat enorme waarde, 🌟Dit is een zeldzame kans, mis hem niet! ⏰⌛💨
Deel en like als je wilt!
Uw delen en likes zijn onze voortdurende motivatie!

 

发表 评论

Uw e-mailadres wordt niet gepubliceerd. 必填 项 已 用 * 标注

scroll naar boven