SQL инжекция и защита срещу тях, shublog

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 (), изпускани кавичките и други вредители наклонената черта и в норма