SQL инжекция и защита срещу тях, shublog
Днес, аз ще докосне на отдавна обещава темата за SQL инжекция (по-малко от шест месеца са минали ... или ... - Ред.). Аз ще се опитам да ги опише възможно най-просто и да се покаже основните техники на защитата им (освен ако, разбира се, че ще опиша, могат да бъдат описани като методи).
SQL инжекция е много често, донякъде подобна на XSS атаки (по-подробно в статията "Как да се предпазите от XSS атаки и поправите уязвимостта"), и те се основават на въвеждането на произволен SQL-код в всяко искане (дори напълно безвредни), в което води до повишаване на нападателя от базата данни, необходими за него тайна информация (добре, или просто да изтрива всичко, за да edronoy баба - Ред.).
SELECT * FROM потребители КЪДЕ вход = "$ _POST [ 'вход']" И забр = "$ _POST [ 'забр"] "
Когато минаха параметри не се проверяват, можете да направите всичко, което искате. Например, вместо за вход, можете да въведете администратор "/ *, както и паролата, която сте искали (не отивайте да влезе нещо), а след това искане ще изглежда така .:
SELECT * FROM потребители КЪДЕ вход = "админ" / * И забр = ""
Защита срещу SQL инжекция
Започнете проста, с числов низ. Ако премине редица, така че нищо не се изпълнява, е необходимо, че всички символи, с изключение числови, бяха отхвърлени. Два начина:
Ние показваме сценарий, който дадено число е броят.
По-малко от този метод (или минус, тъй като всеки) в следващия - ако не я пусна към цифрите в номера на променливата $ получава петите. Няма нищо страшно, но само в случай, ако има някаква тайна запис нула. Въпреки това, винаги можете да пренапише сценария чрез проверка дали стойността е нула.
Замяна на регулярен израз, който е отрязал всичко, освен цифри.
$ Номер = preg_replace ( "/ [^ 0-9] /", "", $ _POST [ 'номер "]);
С текстови низове не е толкова прост. Разбира се, ако имате нужда само цифрите и буквите, всички останали герои можете спокойно да отсече regexps:
$ String = preg_replace ( "/ [^ а-ZA-Z0-9] / I", "", $ _POST [ 'низ']);
Но понякога всички видове скоби, са наистина необходими кърлежи. Какво да се прави?
Има някои символи, които не са в никакъв случай не трябва да се допуска. Най-малко директно, винаги можете да стартирате редовен сезон на текста и на мястото на левите символи на специални символи. Говорете за лошите герои.
Единични и двойни кавички. Те се използват в искания за разпределение. Мисля, че повече от примера по-горе става ясно, защо е необходимо да ги забрани. Във всеки случай, да се занимавам с тях сами по себе си, а не го правят, винаги има htmlspecialchars и addslashes.
Знакът равно. Тя ще изглежда един обикновен безобиден икона, но той може да играе шега. Например, ние имаме молба:
$ Sql = 'SELECT * FROM потребители КЪДЕ ИД =' $ номер .;
Дай като параметър 1 или име = "администратор". В резултат на това искане ще изглежда така
SELECT * FROM потребители КЪДЕ ID = 1 или име = "администратор"
Мисля, че е ясно, че ако се забрани символ на равенство, вместо име = "админ" ще бъде името "администратор", а това ще доведе до грешка и искането няма да работи.
SELECT * FROM потребители
КЪДЕ име = $ номер
И парола = $ пас
В допълнение към разтягане и изтриване на информация от горните методи, лесно можете да се слеят цялата информация и база данни във файл или да извърши обезобразяване сайт. И това изглежда така
SELECT * В OUTFILE "file.php"
Така че можете да създадете свой собствен скрипт на сайта и трябва да танцувам на нея. И ако са на разположение за всички записи файлове скрипт, ние можем да направим обезобразяване:
SELECT "ВИЕ компрометирани от хакери!"В OUTFILE" index.php "
За днес. Погрижете се за вашите скриптове от зли духове. На добър час!
Любовта статии по тези теми, но и тук малко ви боядисани. За съжаление моя блог ще доведе, боядисани няколко методи за защита, и вече има две работни методи, които трябваше да пишат, защото на някои любопитни хора, които ще споделят една от тях.
$ URL адрес = html_entity_decode (urldecode ($ _SERVER [ 'QUERY_STRING']));
$ URL адрес = str_replace ( "", "/", $ URL);
ако ((strpos ($ URL "<' ) !== false) || (strpos( $url, '>")! == невярно) || (Strpos ($ URL "," ")! == невярно) || (strpos ($ URL," ./ ")! == невярно) || (strpos ($ URL," ../ ')! == фалшиви) || (strpos ($ URL, '\' ')! == невярно))
ако (!! $ _GET [ 'мод'] = "editnews" или $ _GET [ 'действие'] = "списък") умрат ( "Здравей, как си Нищо не се случва :(?");
$ URL адрес = html_entity_decode (urldecode ($ _SERVER [ 'REQUEST_URI']));
$ URL адрес = str_replace ( "", "/", $ URL);
ако ((strpos ($ URL "<' ) !== false) || (strpos( $url, '>")! == невярно) || (Strpos ($ URL "," ")! == невярно) || (strpos ($ URL, '\' ')! == невярно))
умре ( "Здравей, как си Нищо не се случва :(?");
И се свързва самата функция:
В зависимост от това как изглеждаш - Дадох основите и ръководство за действие, но не дават напълно готови примери.
Погледнато кода, ми хареса теста, особено в по-висока директория ниво (../), искам да кажа, че дори и някак си не мисля, че си струва прекалено.
Аз, между другото, най-общо хареса това, което е направено в плъгина за WP анти-XSS атака, която виси на зоната за регистрация администратор. Може би това не е най-добрият, но със задача да се справи. Основната смисъла срещу приемника HTTP_REFERER от текущата машина.
В действителност, има много лесен начин да се отървете от инжектиране: шифрова всички данни в base64 ние дешифриране на входа и на изхода. Той е там, за да се отървете от кърлежи ...
Като цяло се сблъскват с XSS, но с SQL - не ...
Хм, никога не съм чувал за такава опция. Просто наистина не разбирам, тя изглежда да е само таговете отрязани при кодиране, както и всички видове котировки и наклонени черти са, нали?
За кодиране в base64 Познавам, това е минало етап. Това отдавна се защити ... Имам повече от 3 години, развиващи защита за вашия CMS, и всеки ден научавам нещо ново ..
Споделете повече от който и да е чип, които не са споменати по-горе, в полза на читателите и собственика на блога си? =)
По-близо до изхода, тип сили) и да подпише за нищо повече)
Благодарим Ви, ние ще чакаме!)
За сметка на искането:
SELECT * ОТ потребители, когато номер = 1; Изтрий от потребители
Не се вози този дизайн, подобни искания са разделени с ";" в PhpMyAdmin, за да живеят на една и съща система, не eksplodit поиска точката и запетаята, която след това ще ги изпълняват в цикъл, или как те ще работят с резултатите от запитването. тя konsnruktsiya mysql_query не поддържа тази опция.
Аз yuzayu mysql_real_escape_string (), изпускани кавичките и други вредители наклонената черта и в норма