MySQL SQL инъекциясын кантип алдын алат? SQL инъекциясынын принциби жана алдын алуу

MySQLSQL инъекциясын кантип алдын алса болот? SQL инъекциясынын принциптери жана алдын алуу

MySQL жана SQL инъекциясы

Эгер сиз веб-баракча аркылуу колдонуучу киргизген маалыматтарды алып, аны аMySQL маалымат базасы, анда SQL сайынуу коопсуздук маселелери пайда болушу мүмкүн.

Бул бөлүмдө SQL инъекциясынын алдын алуу жана SQLге инъекцияланган белгилерди чыпкалоо үчүн скрипттерди колдонуу жолдору көрсөтүлөт.

SQL инъекциясы деп аталган нерсе, SQL буйруктарын веб формага тапшырууларга киргизүү же домендик аталыштарды же бет суроо-талаптары үчүн суроо саптарын киргизүү жана акыры серверди зыяндуу SQL буйруктарын аткарууга алдоо.

Колдонуучу киргизген маалыматтарга эч качан ишенбешибиз керек, биз бардыгыбыз колдонуучу киргизген маалыматтарды чыпкалашыбыз керек.

Төмөнкү мисалда, киргизилген колдонуучу аты тамгалардын, сандардын жана астынкы сызыктардын айкалышы болушу керек жана колдонуучунун аты узундугу 8 жана 20 белгиге чейин болушу керек:

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

Келгиле, атайын белгилер чыпкаланбаганда пайда болгон SQL кырдаалын карап көрөлү:

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

Жогорудагы инъекция билдирүүсүндө, биз $name өзгөрмөсүн чыпкалаган жокпуз, керексиз SQL оператору $name'ге киргизилген, ал колдонуучулардын таблицасындагы бардык маалыматтарды жок кылат.

PHPдеги Mysqli_query() бир нече SQL операторунун аткарылышына жол бербейт, бирок SQLite жана PostgreSQLде бир нече SQL операторлору бир эле учурда аткарылышы мүмкүн, андыктан бул колдонуучулардын маалыматтарын катуу текшеришибиз керек.

SQL инъекциясынын алдын алуу үчүн, биз төмөнкү жагдайларга көңүл бурушубуз керек:

  • 1. Колдонуучунун киргизүүсүнө эч качан ишенбеңиз. Колдонуучунун киргизгенин текшерүү үчүн сиз кадимки сөз айкаштарын колдонсоңуз болот же бир тырмакчаны жана кош "-" ж.б.
  • 2. Эч качан sql динамикалык ассамблеясын колдонбоңуз, сиз параметрленген sqlди колдонсоңуз же берилиштерге суроо-талап жана кирүү үчүн сакталган процедураларды түз колдонсоңуз болот.
  • 3. Администратор артыкчылыктары бар маалымат базасын байланышын эч качан колдонбоңуз, ар бир тиркеме үчүн чектелген артыкчылыктары бар өзүнчө маалымат базасын колдонуңуз.
  • 4. Жашыруун маалыматты түз сактабаңыз, сырсөздөрдү жана купуя маалыматты шифрлеп же хэштебеңиз.
  • 5. Колдонмонун өзгөчө маалыматы мүмкүн болушунча азыраак сунуштарды бериши керек. Ката маалыматынын түпнускасын жабуу үчүн колдонууга ылайыктуу.
  • 6. SQL сайма аныктоо ыкмасы жалпысынан көмөкчү кабыл алат软件Же веб-сайт платформасын аныктоо үчүн программалык камсыздоо жалпысынан SQL инъекциясын аныктоо куралын колдонот. MDCSOFT SCAN ж.б. MDCSOFT-IPS колдонуу SQL инъекциясынан, XSS чабуулдарынан, ж.б.

SQL инъекциясын болтурбоо

Perl жана PHP сыяктуу скрипт тилдеринде SQL инъекциясынын алдын алуу үчүн колдонуучу киргизген маалыматтардан качып кутула аласыз.

PHPдин MySQL кеңейтүүсү атайын киргизүү символдорунан качуу үчүн mysqli_real_escape_string() функциясын камсыз кылат.

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

Like билдирүүсүндө инъекция

Сураганда, колдонуучу киргизген маанилер "_" жана "%" камтыса, мындай жагдай пайда болот: колдонуучу алгач "abcd_" сурагысы келген, бирок суроонун жыйынтыгында "abcd_", "abcde" , жана "abcdf" Күтүү көйгөйлөрү да колдонуучулар "30%" сурагысы келгенде пайда болот (эскертүү: отуз пайыз).

PHP скрипттеринде биз төмөндөгү мисалда көрсөтүлгөндөй, жогорудагы жагдайды чечүү үчүн addcslashes() функциясын колдоно алабыз:

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

addcslashes() функциясы көрсөтүлгөн символдун алдында тескери сызыкты кошот.

Синтаксис форматы:

addcslashes(string,characters)
параметрлерсүрөттөө
арканТалап кылынат. Текшере турган сапты белгилейт.
белгиКошумча. addcslashes() таасир эткен символдорду же белгилердин диапазонун аныктайт.

Hope Chen Weiliang блогу ( https://www.chenweiliang.com/ ) бөлүштү "MySQL sql инъекциясын кантип алдын алат?" SQL инъекциясынын принциптери жана алдын алуу" сизге пайдалуу болот.

Бул макаланын шилтемесин бөлүшүүгө кош келиңиз:https://www.chenweiliang.com/cwl-500.html

Акыркы жаңылыктарды алуу үчүн Чен Вейляндын блогунун Telegram каналына кош келиңиз!

🔔 Каналдын башкы каталогунан баалуу "ChatGPT Content Marketing AI куралын колдонуу боюнча колдонмону" биринчилерден болуп алыңыз! 🌟
📚 Бул колдонмо чоң баалуулуктарды камтыйт, 🌟Бул сейрек кездешүүчү мүмкүнчүлүк, аны өткөрүп жибербеңиз! ⏰⌛💨
Бөлүшүп, жакса лайк!
Сиздин бөлүшүүңүз жана лайктарыңыз биздин үзгүлтүксүз мотивациябыз!

 

发表 评论

Электрондук почта дарегиңиз жарыяланбайт. Милдеттүү талаалар колдонулат * 标注

өйдө сыдырыңыз