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 у блогу Чэнь Вэйляна, каб атрымліваць апошнія абнаўленні!
📚 Гэты дапаможнік мае вялікую каштоўнасць, 🌟Гэта рэдкая магчымасць, не прапусціце яе! ⏰⌛💨
Падзяліцеся і лайкайце, калі хочаце!
Ваш абмен і лайкі - наша пастаянная матывацыя!