Як MySQL прадухіляе ўвядзенне sql? Прынцып SQL-ін'екцыі і прафілактыка

MySQLЯк прадухіліць ін'екцыю sql? Прынцып SQL-ін'екцыі і прафілактыка

MySQL і SQL-ін'екцыя

Калі вы бераце дадзеныя, уведзеныя карыстальнікам праз вэб-старонку, і ўстаўляеце іх у aБаза дадзеных 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, што выдаліць усе даныя ў табліцы карыстальнікаў.

mysqli_query() у PHP не мае права выконваць некалькі аператараў SQL, але SQLite і PostgreSQL могуць выконваць некалькі аператараў SQL адначасова, таму нам трэба строга правяраць даныя гэтых карыстальнікаў.

Каб прадухіліць SQL-ін'екцыю, мы павінны звярнуць увагу на наступныя моманты:

  • 1. Ніколі не давярайце ўводу карыстальніка.Праверце ўвод карыстальніка, вы можаце выкарыстоўваць рэгулярныя выразы або абмежаваць даўжыню; канвертаваць адзінарныя двукоссі і двайныя "-" і г.д.
  • 2. Ніколі не выкарыстоўвайце дынамічную зборку sql, вы можаце выкарыстоўваць параметрызаваны sql або непасрэдна выкарыстоўваць захаваныя працэдуры для запыту даных і доступу да іх.
  • 3. Ніколі не выкарыстоўвайце падключэнні да базы дадзеных з правамі адміністратара, выкарыстоўвайце асобныя падключэнні да базы дадзеных з абмежаванымі прывілеямі для кожнага прыкладання.
  • 4. Не захоўвайце канфідэнцыйную інфармацыю непасрэдна, не шыфруйце і не хэшуйце паролі і канфідэнцыйную інфармацыю.
  • 5. Інфармацыя аб выключэнні прыкладання павінна даваць як мага менш падказак, і лепш за ўсё выкарыстоўваць карыстальніцкую інфармацыю пра памылку, каб абгарнуць зыходную інфармацыю пра памылку
  • 6. Метад выяўлення ін'екцыі sql звычайна выкарыстоўвае дапаможны метад软件Або платформа вэб-сайта для выяўлення, праграмнае забеспячэнне звычайна выкарыстоўвае інструмент выяўлення ўкаранення sql jsky, а платформа вэб-сайта мае інструмент выяўлення платформы бяспекі вэб-сайта Yisi. MDCSOFT SCAN і інш.Выкарыстанне MDCSOFT-IPS можа эфектыўна абараняць ад SQL-ін'екцый, XSS-атак і г.д.

Прадухіленне ўкаранення SQL

У мовах сцэнарыяў, такіх як Perl і PHP, вы можаце пазбегнуць даных, уведзеных карыстальнікам, каб прадухіліць укараненне SQL.

Пашырэнне MySQL для PHP забяспечвае функцыю 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 у блогу Чэнь Вэйляна, каб атрымліваць апошнія абнаўленні!

🔔 Будзьце першым, хто атрымае каштоўнае "Кіраўніцтва па выкарыстанні інструмента AI для маркетынгу кантэнту ChatGPT" у верхнім каталогу канала! 🌟
📚 Гэты дапаможнік мае вялікую каштоўнасць, 🌟Гэта рэдкая магчымасць, не прапусціце яе! ⏰⌛💨
Падзяліцеся і лайкайце, калі хочаце!
Ваш абмен і лайкі - наша пастаянная матывацыя!

 

发表 评论

Ваш адрас электроннай пошты не будзе апублікаваны. 必填 项 已 用 * Этыкетка

пракруціць ўверх