XML ատրիբուտներ. Երբ խուսափել կրկնակի մեջբերումից XML-ում

Այս դասի նպատակը.

  1. BI-ն պետք է իմանա XML լեզվի գրառման ձևաչափը
  2. BI-ն պետք է կարողանա ֆորմատավորել փաստաթուղթը XML կոդի տեսքով
  3. BI-ն պետք է իմանա տվյալների տեսակները և կարողանա օգտագործել դրանք

Նշում. XML լեզուն այնքան էլ հակիրճ չէ, որքան մենք նկարագրել ենք այս դասում: Մենք դիտարկում ենք միայն XML լեզվի այն հատկանիշները, որոնք կօգտագործվեն ODA-TM համակարգում:

xml. Հիմքը

XML-ը ստեղծվել է տեղեկատվության կառուցվածքի, պահպանման և փոխադրման համար:

Հետևյալ օրինակը՝ «Ծանոթագրություն ընկերոջից ընկերոջը», ունի XML ձև.

Նիկոլաս Իվանա Հիշեցում Հուսով եմ, որ դուք չեք մոռացել մեր հանդիպման մասին

Տեսողականորեն այս կոդը կարող է ներկայացվել հետևյալ ձևով (նկ. 1.):

Կոդն ունի տեղեկատվության ուղարկող և ստացող, ունի նաև վերնագիր և հաղորդագրության մարմին:

Այն նախատեսված է ինչ-որ մեկի կողմից մշակվելու, ուղարկվելու և ցուցադրվելու համար:

Բայց այնուամենայնիվ, այս XML փաստաթուղթը ոչինչ չի անում: Դա պարզապես պիտակներով փաթաթված տեղեկատվություն է:

XML - Ծառ

XML-ն ունի ծառի կառուցվածք: Փաստաթուղթը միշտ ունի արմատային տարր (հայտարարությունծառի հետ կապ չունի։ Ծառի տարրը միշտ ունենում է երեխաներ և նախնիներ, բացառությամբ արմատային տարրի, որը չունի նախնիներ, ինչպես նաև կոճղ տարրերի (ծառի տերևների), որոնք չունեն երեխաներ: Ծառի յուրաքանչյուր տարր գտնվում է որոշակի բնադրման մակարդակի վրա (այսուհետ՝ «մակարդակ»): Նույն մակարդակի տարրերն ունեն նախորդ և հաջորդ տարրեր:

Ստեղծեք ձեր սեփական պիտակները XML-ով

Թեգեր (նկարագրիչներ, տարրեր) ստեղծելու համար ստանդարտ ձևաչափգոյություն չունի.

XML լեզուն չունի նախապես սահմանված պիտակներ:

  • XML-ը թույլ է տալիս հեղինակին սահմանել իր սեփական պիտակները և սեփական փաստաթղթի կառուցվածքը:
  • XML-ն օգտագործվում է տվյալների փոխանցման համար
  • XML-ը տեղեկատվության փոխանցման ծրագրային-ապարատային անկախ գործիք է:
  • XML-ն այժմ նույնքան կարևոր է համացանցի համար, որքան HTML-ը
  • XML-ը տարբեր հավելվածների միջև տվյալների փոխանցման ամենատարածված գործիքն է:
  • XML-ն օգտագործվում է վեբ մշակման բազմաթիվ ասպեկտներում՝ հաճախ տվյալների պահպանման և փոխանակման համար ավելի հեշտ դարձնելու համար:

XML շարահյուսություն

XML կանոնների շարահյուսությունը շատ պարզ է և տրամաբանական

  • Բոլոր XML տարրերը պետք է ունենան փակման պիտակ
  • XML տարրերը պետք է պատշաճ կերպով տեղադրվեն (մեկը մյուսի մեջ և երբեք չհամընկնեն)
  • XML փաստաթղթերը պետք է ունենան արմատային տարր (XML փաստաթղթերը պետք է պարունակեն մեկ տարր, որը բոլոր մյուս տարրերի մայրն է: Այս տարրը կոչվում է արմատային տարր:
  • XML հատկանիշի արժեքը պետք է փակցված լինի չակերտների մեջ:

Մեկնաբանություններ

Եթե ​​Ձեզ անհրաժեշտ է ինչ-որ հատված պատրաստել XML փաստաթուղթընդհանուր առմամբ «անտեսանելի» է անալիզատորի ծրագրի համար, այնուհետև այն կարող է ձևակերպվել որպես մեկնաբանություն՝ դրանից առաջ գրանշաններ գրելով < !-- , որին հաջորդում են խորհրդանիշները --> երկու գծիկներով անընդմեջ:

Օրինակ:

< !-- Это комментарий -->

Անալիզատոր ծրագիրը բաց կթողնի այս ամբողջ շինարարությունը՝ առանց նույնիսկ «նայելու» դրա մեջ:

Այս մեկնաբանության շարահյուսությունը դրա վրա երկու սահմանափակում է դնում.

  • անընդմեջ երկու գծիկ չեն կարող գրվել մեկնաբանությունում.
  • մեկնաբանությունը չի կարող ավարտվել գծիկով:

XML տարրեր

XML տարրն ամեն ինչ է՝ տարրի սկզբնական պիտակից մինչև վերջի պիտակը:

Տարրը կարող է պարունակել.

  • այլ տարրեր
  • տեքստը
  • հատկանիշները
  • կամ վերը նշված բոլորի համադրություն...

XML անվանման կանոններ

XML տարրերը պետք է հետևեն անվանման հետևյալ կոնվենցիաներին.

  • Անունները կարող են պարունակել տառեր, թվեր և այլ նիշեր
  • Անունները չեն կարող սկսվել թվով կամ կետադրական նշաններով
  • Անունները չեն կարող բացատներ պարունակել

Հատկանիշներ

Հատկանիշները ապահովում են Լրացուցիչ տեղեկությունտարրերի մասին, որոնք տվյալների մաս չեն կազմում։

Ստորև բերված օրինակում ֆայլի տեսակը կապ չունի տվյալների հետ, բայց կարևոր է ծրագրային ապահովում, որը կարող է շահարկել տարրը.

computer.gif

XML ատրիբուտները պետք է փակվեն չակերտների մեջ

Հատկանիշների արժեքները միշտ պետք է մեջբերվեն: Կարող են օգտագործվել մեկ կամ կրկնակի չակերտներ: Օրինակ՝ անձի սեռը որոշելու համար տարրը կարելի է գրել այսպես.

Եթե ​​հատկանիշի արժեքը ինքնին պարունակում է կրկնակի չակերտներ, կարող եք օգտագործել միայնակ չակերտներ, ինչպես այս օրինակում.

կամ կարող եք օգտագործել խորհրդանշական առարկաներ. & &

Ամսաթիվ տվյալների տիպի օգտագործման որոշ օրինակներ

ամսաթիվը որպես հատկանիշ

Tove Ջանի Հիշեցում Մի մոռացեք ինձ այս շաբաթավերջին:

Ամսաթիվը որպես տարր

10/01/2008 Tove Ջանի Հիշեցում Մի մոռացեք ինձ այս շաբաթավերջին:

Ամսաթիվը որպես ընդլայնված տարր

10 01 2008 Tove Ջանի Հիշեցում Մի մոռացեք ինձ այս շաբաթավերջին:

Մետատվյալների հատկանիշներ

Այս նույնացուցիչները կարող են օգտագործվել XML տարրերը նույնականացնելու համար:

Օրինակ:

Tove Ջանի Հիշեցում Մի մոռացեք ինձ այս շաբաթավերջին:

Ջանի Tove Re: Հիշեցում ես չեմ

Տվյալների մասին տվյալները պետք է պահվեն որպես ատրիբուտներ, իսկ ինքնին տվյալները պետք է պահվեն որպես տարրեր:

xml. Տվյալների տեսակը

Ներկառուցված պարզ տեսակներ

ամսաթիվը և ժամը

  • ամսաթիվԺամպարունակում է ամսաթիվ և ժամը ձևաչափով CCYY-MM-DThh:mm:ss
  • տեւողությունը- ներկայացնում է ժամանակի տևողությունը, որն արտահայտվում է Գրիգորյան օրերի, ժամերի, րոպեների և վայրկյանների բաղադրիչներով:

Օրինակ՝ ձայնագրություն P1Y2M3DT10H30M45Sնշանակում է մեկ տարի (1Y), երկու ամիս (2M), երեք օր (3DT), տասը ժամ (10H), երեսուն րոպե (30M) և 45 վայրկյան (45S):

Մուտքը կարող է կրճատվել P120M նշանակում է 120 ամիս, իսկ T120M նշանակում է 120 րոպե:

  • ժամանակպարունակում է ժամանակ նորմալ ձևաչափով hh:mm:ss
  • ամսաթիվըպարունակում է ամսաթիվ ձևաչափով CCYY-MM-DD
  • gYearMonthձևաչափով քաղում է տարին և ամիսը CCYY-MM
  • տարինձևաչափով նշանակում է տարի CCYY
  • gMonthDayպարունակում է ամիսը և օրը ձևաչափով MM-DD
  • gDayամսվա օրը ձևաչափով DD
  • gMonthամիս ձևաչափով Մ.Մ

Նիշերի տողեր

լար- հիմնական բնույթի տեսակը.

Նիշերի շարան՝ որպես Յունիկոդի նիշերի հաջորդականություն, ներառյալ՝ բացատ, ներդիր, փոխադրման վերադարձ և տողերի սնուցման նիշեր:

  • նորմալացված տող- տեսակի ենթատիպը տողերն են, որոնք չեն պարունակում տողերի հոսք «\n», փոխադրման վերադարձ «\r» և հորիզոնական ներդիր «\t»:
    • նշան- նորմալացված String տիպի ենթատեսակ չկա, բացի առաջատար և հետին բացատներից և մի քանի հաջորդական բացատներից:
      • լեզու- ենթատիպի նշան, որը սահմանվում է RFC 1766 առաջարկի համաձայն լեզվի անվանումը գրանցելու համար, օրինակ՝ ru, en, de, fr:
      • ՆՄՏՈԿԵՆ- նշանի ենթատիպ, որն օգտագործվում է միայն ատրիբուտներում՝ իրենց թվարկված արժեքները գրանցելու համար:
      • Անուն- նշանի ենթատիպ, կազմել XML անուններ - տառերի հաջորդականություն, թվեր, գծիկներ, կետեր, երկու կետ, ընդգծումներ՝ սկսած տառով (բացառությամբ վերապահված տառերի հաջորդականության X, x, M, m, L, lդեպքերի ցանկացած համակցության դեպքում) կամ ընդգծված նիշը: Անուններ, որոնք սկսվում են տողով xml, օգտագործվում են հենց XML հատկորոշմամբ:
        • NCName- ենթատեսակի անվանումը, որը չի պարունակում երկու կետ: Սահմանված է երեք ենթատեսակ. ID, IDREF, ENTITY

Երկուական տեսակներ

  • բուլեն- երկուական, տրամաբանական: Ընդունում է արժեքները՝ True կամ False (1 կամ 0)
  • base64 Երկուական- Base64 կոդավորված երկուական ամբողջ թվեր
  • hexBinary- երկուական ամբողջ թվեր տասնվեցական ձևով, առանց որևէ լրացուցիչ նիշի

Իրական թվեր

  • տասնորդականֆիքսված կետով գրված իրական թվեր են՝ 123.45, -0.48747798 և այլն։
  • կրկնակիԵվ լողալտեսակները համապատասխանում են IEEE754-85 ստանդարտին, որը գրված է որպես ֆիքսված կամ լողացող կետ:

Ամբողջ թվեր

  • ամբողջ թիվ- զրոյական կարգով թվեր պարունակող հիմնական ամբողջ տեսակը հասկացվում է որպես ենթատեսակ տասնորդական
  • թիվ- սահմանում է թիվ (նիշերի քանակի սահմանափակում չկա); կարող է պարունակել նշան, կոտորակներ և ցուցիչ: Արժեքները փոխվում են

1.7976931348623157Е+308-ից մինչև 2.2250738585072014Е-308

  • Թարգմանություն
  • ուսուցողական

SQL ներարկումներ, խաչմերուկի հարցումների կեղծում, կոռումպացված XML... Սարսափելի, սարսափելի բաներ, որոնցից մենք բոլորս կցանկանայինք պաշտպանվել, բայց մենք պարզապես պետք է իմանանք, թե ինչու է այս ամենը տեղի ունենում: Այս հոդվածը բացատրում է այս ամենի հիմքում ընկած հիմնարար հայեցակարգը. լարերը և տողերի մշակումը լարերի մեջ:

Հիմնական խնդիրը

Դա պարզապես տեքստ է: Այո, միայն տեքստը, դա է հիմնական խնդիրը: Գրեթե ամեն ինչ ներսում համակարգչային համակարգներկայացված է տեքստով (որն իր հերթին ներկայացված է բայթերով): Եթե ​​որոշ տեքստեր նախատեսված չեն համակարգչի համար, իսկ մյուսները նախատեսված են մարդկանց համար: Բայց և՛ դրանք, և՛ դրանք, այնուամենայնիվ, մնում են տեքստ։ Հասկանալու համար, թե ինչի մասին եմ խոսում, ահա մի փոքրիկ օրինակ.
Homo sapiens Ենթադրենք, կա անգլերեն տեքստ, որը ես չեմ ուզում թարգմանել ռուսերեն

Հավատում եք, թե ոչ, սա տեքստ է: Որոշ մարդիկ այն անվանում են XML, բայց դա պարզապես տեքստ է: Հնարավոր է, որ այն հարմար չէ անգլերենի ուսուցչին ցույց տալու համար, բայց այն դեռ միայն տեքստ է: Կարող ես պաստառի վրա տպել ու դրանով միտինգների գնալ, մամայիդ նամակով գրել... տեքստ է։

Այնուամենայնիվ, մենք ցանկանում ենք, որ այս տեքստի որոշ մասեր որոշակի նշանակություն ունենան մեր համակարգչի համար: Մենք ուզում ենք, որ համակարգիչը կարողանա առանձին հանել տեքստի հեղինակին և տեքստը, որպեսզի մենք կարողանանք ինչ-որ բան անել դրա հետ: Օրինակ, վերը նշվածը փոխարկեք հետևյալի.
Ենթադրենք, կա անգլերեն տեքստ, որը ես չեմ ուզում ռուսերեն թարգմանել Homo Sapiens-ի կողմից
Ինչպե՞ս է համակարգիչը գիտի, թե ինչպես դա անել: Դե, քանի որ մենք շատ հարմար կերպով փաթաթել ենք տեքստի որոշ հատվածներ հատուկ բառերով զվարճալի փակագծերում, ինչպես, օրինակ, և. Քանի որ մենք դա արել ենք, մենք կարող ենք գրել ծրագիր, որը կփնտրի այս կոնկրետ մասերը, կհանի տեքստը և օգտագործի այն մեր որոշ գյուտերի համար:

Այլ կերպ ասած, մենք մեր տեքստում օգտագործել ենք որոշակի կանոններ՝ նշելու որոշակի հատուկ նշանակություն, որը ինչ-որ մեկը, հետևելով նույն կանոններին, կարող էր օգտագործել:
Լավ, այդքան էլ դժվար չէ հասկանալ: Բայց ի՞նչ, եթե մենք ուզում ենք օգտագործել այս զվարճալի փակագծերը, որոնք ունեն որոշակի հատուկ նշանակություն մեր տեքստում, բայց առանց օգտագործելու հենց այս իմաստը: .. Նման մի բան.

Homo sapiens < n and y >

Նշաններ»<" и ">«Ոչ մի առանձնահատուկ բան չեն: Դրանք օրինականորեն կարող են օգտագործվել ցանկացած վայրում, ցանկացած տեքստում, ինչպես վերը նշված օրինակում: Բայց ինչ վերաբերում է հատուկ բառերի մեր գաղափարին, ինչպես: Արդյո՞ք դա նշանակում է, որ դա նաև հիմնաբառ է: XML-ում, գուցե Այո, գուցե ոչ: Դա երկիմաստ է: Քանի որ համակարգիչները այնքան էլ լավ չեն կառավարում երկիմաստությունները, ինչ-որ բան կարող է հանգեցնել անսպասելի արդյունքների, եթե մենք ինքներս չենք կետադրում i-ը և վերացնում ենք երկիմաստությունը:
Դուք կարող եք լուծել այս երկընտրանքը, փոխարինելով ոչ միանշանակ կերպարները միանշանակ բանով:
Homo sapiens Հիմնական մաթեմատիկան մեզ ասում է, որ եթե x< n and y >n, x-ը չի կարող y-ից մեծ լինել:

Այժմ տեքստը պետք է դառնա ամբողջովին միանշանակ։ «<" равносильно "<", а ">" - ">".
Սրա տեխնիկական սահմանումն է պաշտպանություն , մենք փախչում ենք հատուկ կերպարներից, երբ չենք ուզում, որ նրանք ունենան իրենց հատուկ նշանակությունը։
փախուստ |iˈskāp| [ոչ օբյեկտ. ] ազատվել [ with obj. ] չնկատել / չհիշել [...] [ with obj. ] ՏՏ՝ այլ կերպ մեկնաբանվելու պատճառ [...]
Եթե ​​տեքստի որոշ նիշեր կամ նիշերի հաջորդականություններ ունեն հատուկ նշանակություն, ապա պետք է լինեն կանոններ, որոնք կարգավորում են այն իրավիճակները, երբ այդ նիշերը պետք է օգտագործվեն՝ առանց դրանց հատուկ նշանակությունը վկայակոչելու: Կամ, այլ կերպ ասած, փախչելը պատասխանում է հարցին. «Եթե այս կերպարներն այդքան առանձնահատուկ են, ինչպե՞ս կարող եմ դրանք օգտագործել իմ տեքստում»։.
Ինչպես տեսնում եք վերը նշված օրինակում, նշանը (&) նույնպես հատուկ նիշ է: Բայց եթե ուզում ենք գրել»<", но без интерпретации этого как "<"? В XML, escape-последовательность для &, это - " & ", т.е. мы должны написать: " &< "

Այլ օրինակներ

XML-ը հատուկ նիշերից «տառապելու» միակ դեպքը չէ։ Ցանկացած կոդ, ցանկացած ծրագրավորման լեզվով կարող է ցույց տալ սա.
var name = «Homo Sapiens»; var contents = «Ենթադրենք, կա անգլերեն տեքստ, որը ես չեմ ուզում թարգմանել ռուսերեն»;
Դա պարզ է. պարզ տեքստը հստակորեն բաժանվում է «ոչ տեքստից» կրկնակի չակերտներով: Նույն կերպ, դուք կարող եք օգտագործել իմ տեքստը մաթեմատիկական վերլուծության դասընթացից.
var name = «Homo Sapiens»; var contents = «Հիմնական մաթեմատիկան մեզ ասում է, որ եթե x< n and y >n, x-ը չի կարող լինել y-ից մեծ։";
Հիասքանչ Եվ դուք նույնիսկ կարիք չունեք պաշտպանելու դիմելու: Բայց սպասիր, իսկ եթե ես ուզում եմ ինչ-որ մեկին մեջբերել:
var name = «Homo Sapiens»; var contents = «Ասում են, որ Պլատոնը մի անգամ ասել է «Lorem ipsum dolor sit amet»:»;
Հմմ ... տխրություն, կարոտ։ Որպես մարդ, դուք կարող եք որոշել, թե որտեղ է սկսվում և ավարտվում տեքստը և որտեղ է մեջբերումը: Այնուամենայնիվ, սա կրկին դարձավ ոչ միանշանակ ցանկացած համակարգչի համար: Մենք պետք է հորինենք մի տեսակ փախուստի կանոններ, որոնք կօգնեն մեզ տարբերակել բառացի «-ը» և «»-ը, ինչը նշանակում է տեքստի վերջ: Ծրագրավորման լեզուներից շատերն օգտագործում են առաջ կտրվածք.
var name = «Homo Sapiens»; var contents = "Ասում են, որ Պլատոնը մի անգամ ասել է \"Lorem ipsum dolor sit amet\".";
«\»-ը կերպարը դարձնում է ոչ հատուկ։ Բայց սա կրկին նշանակում է, որ «\»-ը հատուկ կերպար է։ Այս նիշը տեքստում միանշանակ գրելու համար պետք է դրան ավելացնել նույն նիշը՝ գրելով «\\»: Ծիծաղելի է, չէ՞։

Հարձակում!

Դա այնքան էլ վատ չէր լինի, եթե նրանք պարզապես ստիպված լինեին դիմել փախուստի: Դա, իհարկե, նյարդայնացնում է, բայց դա այնքան էլ վատ չէ: Խնդիրները սկսվում են այն ժամանակ, երբ որոշ ծրագրեր գրում են տեքստ այլ ծրագրերի համար՝ այն «կարդալու» համար: Եվ ոչ, դա գիտաֆանտաստիկա չէ, դա տեղի է ունենում անընդհատ: Օրինակ, այս կայքում, երբ դուք հրապարակում եք հաղորդագրություն, այն ձեռքով չեք մուտքագրում HTML ձևաչափով, այլ միայն գրում եք տեքստ, որն արդյունքում այս կայքը վերածվում է HTML-ի, որից հետո բրաուզերը արդեն փոխակերպում է. «ստեղծված» HTML-ը վերադարձավ ընթեռնելի տեքստի:

Անվտանգության բազմաթիվ խնդիրների մեկ այլ ընդհանուր օրինակ և աղբյուր է SQL հարցումները: SQL-ը լեզու է, որը նախատեսված է տվյալների բազաների հետ հաղորդակցությունը պարզեցնելու համար.
Այս տեքստում գործնականում հատուկ նիշեր չկան, հիմնականում անգլերեն բառեր: Եվ այնուամենայնիվ, SQL-ի գրեթե յուրաքանչյուր բառ ունի հատուկ նշանակություն: Սա օգտագործվում է աշխարհի շատ ծրագրավորման լեզուներում այս կամ այն ​​ձևով, օրինակ.
$query = "Ընտրեք հեռախոսահամարը օգտվողներից, որտեղ անունը = "Alex""; $ արդյունք = mysql_query ($ հարցում);
Այս երկու պարզ տողերը հեռացնում են մեզանից մեր պահանջներին համապատասխանող տվյալների բազայից հարցումների ահավոր բարդ խնդիրը: Տվյալների բազան «մաղում է» միգուցե տերաբայթ բիթ և բայթ, որպեսզի վերադարձնի գեղեցիկ ձևաչափված արդյունք այն ծրագրին, որն արել է հարցումը: Լուրջ, այս ամբողջ հիմարությունը պարփակված է պարզ անգլերենի նմանվող նախադասության մեջ:

Սա օգտակար դարձնելու համար նման հարցումները կոշտ կոդավորված չեն, այլ կառուցված են օգտատիրոջ մուտքագրման հիման վրա: Սա նույն նախադասությունն է, որն ուղղված է տարբեր օգտվողների կողմից.
$name = $_POST["name"]; $query = "Ընտրեք հեռախոսի_համարը օգտվողներից WHERE name = "$name""; $ արդյունք = mysql_query ($ հարցում);
Այն դեպքում, երբ դուք պարզապես թերթում եք այս հոդվածը. Սա հակաօրինակն է։ Սա ամենավատ բանն է, որ երբևէ կարող ես անել: Սա անվտանգության մղձավանջ է: Ամեն անգամ, երբ դուք գրում եք նման բան, մեկ անմեղ ձագ կսատկի: Քթուլհուն սրա համար հոգիդ կուտի։

Հիմա տեսնենք, թե ինչ է կատարվում այստեղ: $_POST["name"]-ը այն արժեքն է, որը ինչ-որ պատահական օգտատեր մուտքագրել է պատահական ձևի մեջ ձեր պատահական կայքում: Ձեր ծրագիրը կստեղծի SQL հարցում՝ օգտագործելով այս արժեքը որպես օգտագործողի անունը, որը ցանկանում եք գտնել տվյալների բազայում: Այս SQL «հայտարարությունն» այնուհետև ուղարկվում է անմիջապես տվյալների բազա:

Այնքան էլ սարսափելի չի հնչում, չէ՞: Փորձենք մուտքագրել մի քանի պատահական արժեքներ, որոնք կարող եք մուտքագրել ձեր պատահական կայքում և ինչ հարցումներ դուրս կգան դրանից.

Ալեքս
ԸՆՏՐԵՔ հեռախոսի_համարը օգտվողներից, որտեղ անունը = «Ալեքս»
McDonalds
ԸՆՏՐԵՔ հեռախոսի_համարը օգտվողներից, WHERE անունը = "Mc"Donalds"
Joe"; DROP TABLE օգտվողներ; --
SELECT phone_number FROM users WHERE name = "Joe"; DROP TABLE օգտվողներ; --"
Առաջին խնդրանքը սարսափելի տեսք չունի, բայց բավականին գեղեցիկ, այնպես չէ՞: Թիվ 2-ը կարծես թե «մի տեսակ» խախտում է մեր շարահյուսությունը երկիմաստության պատճառով: Անիծյալ գերմաներեն: 4-ը մի տեսակ հիմարություն է: Ո՞վ կգրի դա, իմաստ չունի...
Բայց ոչ տվյալների բազայի համար, որը մշակում է հարցումը... Տվյալների բազան գաղափար չունի, թե որտեղից է եկել այս հարցումը և ինչ պետք է այն նշանակի: Միակ բանը, որ տեսնում է, երկու հարցում է՝ գտնել Ջո անունով օգտատիրոջ համարը, այնուհետև ջնջել օգտատերերի աղյուսակը (որին հաջորդում է մեկնաբանությունը «), և դա կհաջողվի։

Սա ձեզ համար նորություն չպետք է լինի: Եթե ​​այո, ապա խնդրում ենք նորից կարդալ այս հոդվածը, քանի որ դուք կամ նոր եք ծրագրավորում, կամ ապրում եք քարանձավում վերջին 10 տարիներին: Այս օրինակը ցույց է տալիս SQL ներարկման հիմունքները, որոնք օգտագործվում են ամբողջ աշխարհում: տվյալներ ջնջելու կամ տվյալներ ձեռք բերելու համար, որոնք չպետք է հենց այնպես ձեռք բերվեն, կամ առանց դրա իրավունք ունենալու մուտք գործելու և այլն։ Եվ բոլորը, քանի որ տվյալների բազան անգլերենի նման «նախադասությունը» չափազանց բառացի է ընկալում։

Vpereeeeed!

Հաջորդ քայլը. XSS հարձակումներ: Նրանք աշխատում են նույն կերպ, կիրառվում են միայն HTML-ի վրա:
Ենթադրենք, դուք լուծել եք տվյալների բազայի հետ կապված խնդիրները, ստացեք տվյալներ օգտատերից, գրեք դրանք տվյալների բազայում և ետ ուղարկեք այն կայք, որպեսզի օգտվողները կարողանան մուտք գործել: Սա այն է, ինչ անում է տիպիկ ֆորումը, մեկնաբանությունների համակարգը և այլն: Ինչ-որ տեղ ձեր կայքում կա այսպիսի բան.

Տեղադրվել էվրա


Եթե ​​ձեր օգտատերերը լավն են և բարի, ապա նրանք կտեղադրեն մեջբերումներ հին փիլիսոփաներից, և հաղորդագրությունները կունենան այսպիսի տեսք.

Տեղադրվել է Պլատոնի կողմից հունվարի 2, 15:31

Ասում են, որ ես ասել եմ «Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua:


Եթե ​​օգտատերերը խելացի են, ապա հավանաբար կխոսեն մաթեմատիկայի մասին, իսկ հաղորդագրությունները կլինեն այսպիսին.

Տեղադրվել է Պասկալի կողմից նոյեմբերի 23, 04:12

Հիմնական մաթեմատիկան մեզ ասում է, որ եթե x< n and y >n, x-ը չի կարող y-ից մեծ լինել:


Հըմ... Էլի մեր փակագծերի այդ պղծողները։ Լավ, տեխնիկական տեսանկյունից դրանք կարող են լինել ոչ միանշանակ, բայց բրաուզերը մեզ դա կների, չէ՞։


Լավ, STOP, ինչ դժոխք: Ինչ-որ կատակասեր մտցրել է javascript թեգեր ձեր ֆորումում: Ցանկացած ոք, ով նայում է այս հաղորդագրությունը ձեր կայքում, այժմ ներբեռնում և կատարում է սցենարներ ձեր կայքի համատեքստում, որոնք կարող են շատ բաներ անել: Եվ սա լավ չէ։

Բառացի չընկալել

Վերոնշյալ դեպքերում մենք ուզում ենք ինչ-որ կերպ ասել մեր տվյալների բազայի կամ բրաուզերի մասին, որ դա պարզապես տեքստ է, ոչինչ մի արեք դրա հետ: Այլ կերպ ասած, մենք ուզում ենք «հեռացնել» բոլոր հատուկ նշանների հատուկ նշանակությունները և հիմնաբառերօգտատիրոջ տրամադրած ցանկացած տեղեկատվությունից, քանի որ մենք չենք վստահում նրան: Ինչ անել?

Ինչ? Ի՞նչ ես ասում, տղա: Օ, ասում եք «վահան». Եվ դուք լիովին իրավացի եք, վերցրեք թխվածքաբլիթ:
Եթե ​​մենք կիրառենք փախուստը օգտվողի տվյալների վրա՝ նախքան այն համադրելը հարցման հետ, ապա խնդիրը լուծված է։ Մեր տվյալների բազայի հարցումների համար դա կլինի նման բան.
$name = $_POST["name"]; $name = mysql_real_escape_string ($name); $query = "Ընտրեք հեռախոսի_համարը օգտվողներից WHERE name = "$name""; $ արդյունք = mysql_query ($ հարցում);
Ընդամենը մեկ տող կոդ, բայց այժմ ոչ ոք չի կարող «կոտրել» մեր տվյալների բազան։ Եկեք նորից տեսնենք, թե ինչպես կանդրադառնան SQL հարցումները՝ կախված օգտագործողի մուտքագրումից.
Ալեքս
ԸՆՏՐԵՔ հեռախոսի_համարը օգտվողներից, որտեղ անունը = «Ալեքս»
McDonalds
ԸՆՏՐԵՔ հեռախոսի_համարը օգտվողներից, WHERE անունը = "Mc\"Donalds"
Joe"; DROP TABLE օգտվողներ; --
SELECT phone_number FROM users WHERE name = "Joe\"; DROP TABLE օգտվողներ; --"
mysql_real_escape_string-ը անխտիր շեղ է դնում այն ​​ամենի առաջ, որը կարող է հատուկ նշանակություն ունենալ:


Մենք կիրառում ենք htmlspecialchars ֆունկցիան բոլոր օգտատերերի տվյալների վրա՝ նախքան դրանք մատուցելը: Այժմ վնասատուների հաղորդագրությունն այսպիսի տեսք ունի.

Տեղադրվել է JackTR-ի կողմից հուլիսի 18-ին, 12:56-ին


Նկատի ունեցեք, որ օգտվողներից ստացված արժեքներն իրականում «կոռումպացված» չեն: Ցանկացած զննարկիչ սա կվերլուծի որպես HTML և կցուցադրի ամեն ինչ ճիշտ ձևով:

Ինչը մեզ հետ է բերում...

Վերոհիշյալ բոլորը ցույց են տալիս մի խնդիր, որը բնորոշ է շատ համակարգերի համար. տեքստի տեքստը պետք է դուրս գա, եթե ենթադրվում է, որ այն չունի հատուկ նիշեր: SQL-ում տեքստային արժեքներ տեղադրելիս դրանք պետք է փախչել SQL կանոններ. Տեքստային արժեքները HTML-ում տեղադրելիս պետք է դրանք փախչել HTML կանոններ. Տեքստային արժեքները (տեխնոլոգիայի անվանումը) տեղադրելիս դրանք պետք է բացառվեն (տեխնոլոգիայի անվանումը) կանոնների համաձայն: Այսքանը:

Պատկերը լրացնելու համար

Օգտատիրոջ մուտքագրման հետ կապված, իհարկե, կան այլ եղանակներ, որոնք կարող են պարունակել կամ չպարունակել հատուկ նիշեր.
  • Վավերացում
    Դուք կարող եք ստուգել, ​​թե արդյոք օգտագործողի մուտքագրումը համապատասխանում է որոշակի բնութագրերին: Եթե ​​դուք պահանջում եք մուտքագրել համար, իսկ օգտվողը մուտքագրում է այլ բան, ծրագիրը պետք է տեղեկացնի նրան այդ մասին և հրաժարվի մուտքագրումից: Եթե ​​այս ամենը ճիշտ կազմակերպված է, ապա «DROP TABLE օգտվողներին» տիրանալու վտանգ չկա, որտեղ օգտատերը պետք է մուտքագրեր «42»: HTML/SQL ներարկումից խուսափելն այնքան էլ գործնական չէ, քանի որ հաճախ պահանջվում է ընդունել ազատ ձևաչափի տեքստ, որը կարող է պարունակել «ենթակետեր»: Սովորաբար վավերացումն օգտագործվում է ի լրումն այլ միջոցների:
  • սանիտարականացում
    Կարող եք նաև «հանգիստ» հեռացնել ցանկացած կերպար, որը վտանգավոր եք համարում: Օրինակ, պարզապես հեռացրեք այն ամենը, ինչը նման է HTML պիտակի՝ ձեր ֆորումին ավելանալուց խուսափելու համար: Խնդիրն այն է, որ դուք կարող եք հեռացնել տեքստի միանգամայն օրինական մասերը:
    Պատրաստված SQL հայտարարություններ
    Կան հատուկ գործառույթներ, որոնք անում են այն, ինչ մենք ուզում ենք. ստիպել տվյալների բազան հասկանալ տարբերությունները բուն SQL հարցման և օգտատերերի տրամադրած տեղեկատվության միջև: PHP-ում նրանք այսպիսի տեսք ունեն.
    $stmt = $pdo->prepare("SELECT phone_number FROM users WHERE name =?"); $stmt->կատարել ($_POST["name"]);
    Այս դեպքում ուղարկումը տեղի է ունենում երկու փուլով՝ հստակ սահմանազատելով հարցումն ու փոփոխականները։ Տվյալների բազան հնարավորություն ունի նախ հասկանալ հարցման կառուցվածքը, այնուհետև այն լրացնել արժեքներով։

  • Իրական աշխարհում սրանք բոլորը միասին օգտագործվում են տարբեր մակարդակների պաշտպանության համար: Դուք միշտ պետք է օգտագործեք վավերացում՝ համոզվելու համար, որ օգտվողը մուտքագրում է ճիշտ տվյալները: Այնուհետև կարող եք (բայց ձեզանից չի պահանջվում) սկանավորել մուտքագրված տվյալները: Եթե ​​օգտատերը հստակ փորձում է ձեզ վաճառել ինչ-որ սցենար, կարող եք պարզապես ջնջել այն: Այնուհետև, դուք միշտ պետք է փախչեք օգտվողի տվյալներից՝ նախքան դրանք SQL հարցում դնելը (նույնը վերաբերում է HTML-ին):

Երկար ժամանակ ստանդարտը նախատեսում է սովորական չակերտներ տեղադրել HTML տեքստՕգտագործեք «For inside tags, չակերտները «» օգտագործվում են ատրիբուտները նշելու համար:

Այնուամենայնիվ, ես դեռ չեմ հանդիպել զննարկիչի, որը որպես մեջբերում չի ցույց տալիս պարզ նիշը «ԴՈՒՐՍ որևէ պիտակներից»: Այսպիսով, ասեք. Հարգելի գործընկերներ, միգուցե «պիտակներից դուրս» բառի օգտագործումը պարզապես հոգնեցուցիչ է, որը ոչ ոքի պետք չէ, կարող ես հանգիստ ու առանց ավելորդ խոսելու գրել։ Հատկապես այն տեքստերում, որտեղ շատ են չակերտները, և դիզայնի խիստ կանոնների պահպանումը (ազգային չակերտների ճիշտ օգտագործման մասին) անտեղի է։

IMHO, շատ մարդիկ դա անում են ... բայց հարցը լիովին պարզ չէ. եթե հասկանում եք, որ ըստ ստանդարտների պետք է գրել նման մեջբերումներ, բայց ծուլորեն, չնայած այն հանգամանքին, որ շատ կայքեր այդպես են աշխատում, ապա ինչ Դուք ակնկալու՞մ եք լսել: Կարծում եմ, որ բրաուզերների նոր տարբերակներում չակերտների ցուցադրումը կաջակցվի՞, ոչ ոք չգիտի, ուստի, ամենայն հավանականությամբ, մենք կարող ենք ակնհայտ խորհուրդ տալ. եթե ապագայում խնդիրներ չեք ուզում, մնացեք ստանդարտներին 100% :) Բայց դուք արդեն գիտեք սա: Կամ դուք սպասում եք հաստատման. այո, հոգնեցուցիչ, վերջ, մոռացեք, և 10 տարի հետո ամեն ինչ նույնը կլինի, ես (Microsoft, Mozilla և այլն) երաշխավորում եմ:

Լին «Սուրճի մարդ» [դոսյե]
այո, ի դեպ… հիմա օգտակար է կարդալ, ոչ մի տեղ նշված չէ, որ մեջբերումները պետք է ներկայացվեն որպես «
http://www2.stack.ru/~julia/HTML401/charset.html :

Որոշ հեղինակներ օգտագործում են «»» նիշերի միավորի հղումը՝ կրկնակի չակերտների (») դեպքերը կոդավորելու համար, քանի որ այս նիշը կարող է օգտագործվել հատկանիշի արժեքները սահմանազատելու համար։

ինչի մասին, պետք էօգտագործել հենց այն էությունը, որի մասին միայն ասվում է<, >Եվ &:

Եթե ​​հեղինակը ցանկանում է տեղադրել կերպարը»<", во избежание возможной путаницы с началом тега (метка начала тега) он должен использовать ссылку "<" (տասնորդական ծածկագիր ASCII 60): Նմանապես, ավելի հին օգտվողների գործակալների հետ խնդիրներից խուսափելու համար, որոնք սխալ են ընդունում «>» նիշերը որպես վերջավոր պիտակներ (պիտակի վերջի նշիչ), օգտագործեք «>» հղումը (ASCII 62 տասնորդական):

Նիշերի հղումների հետ շփոթությունից խուսափելու համար (նիշերի հղումների մեկնարկի նշիչ), «&» հղումը (ASCII տասնորդական կոդ 38) պետք է օգտագործվի «&»-ի փոխարեն: Բացի այդ, «&» հղումը պետք է օգտագործվի նաև հատկանիշի արժեքներում, քանի որ CDATA հատկանիշի արժեքներում նիշերի հղումները թույլատրվում են:

Բայց ես պարզապես սպասում եմ Լինի պատասխանին, որ իրականում նման չափանիշ չկա: Մտքովս չի էլ անցել՝ իմ տեղեկությունները հայտնի դասագրքերից են և «բոլորն են անում» պատճառաբանությամբ։

Կամ մեկ այլ տարբերակ. բայց եթե հետևեք նոր ստանդարտներին, որոնց ես չեմ հանդիպել իմ պրակտիկայում՝ xhtml-ի նման (հենց, ես ստուգեցի xhtml-ը), ապա նման հնարքը չի աշխատի։ Հետևաբար, գրավոր HTML կոդի համար դյուրատարության խնդիրներ ստեղծելու կարիք չկա։

Կամ, վերջապես, ինչպե՞ս եք դա անում ինքներդ:

&, ի դեպ, առաջացնում է նմանատիպ հարց. Վերոնշյալ փաստաթղթում ասվում է «շփոթմունքից խուսափելու համար»։ Բայց շփոթությունը հնարավոր է միայն այն դեպքում, եթե &-ին հաջորդում է տրված կոդերից մեկը: Իսկ եթե դա, ասենք, «..../script?A=1&B=2» նման URL է: Արդյո՞ք ես վտանգում եմ որևէ բան, եթե ես սխալմամբ նշել եմ այնպիսի URL, ինչպիսին href (որը, իհարկե, ճիշտ է աշխատում թեստի ընթացքում): Որևէ այլ բան, բացի այն ծայրահեղ անհավանական իրավիճակից, որ 10 տարի հետո (երբ կայքը հնացած է կամ արդեն տասն անգամ վերաշարադրվել է) կլինի էքստրավագանտ &B անունով կազմակերպություն՝ առանց թրեյլերի; ? Այսինքն՝ որքանո՞վ պետք է ուշադիր ստուգվեն բոլոր նման դեպքերը։

Դանիել, եթե վստահ ես, որ գոյություն ունեցող կոդերի հետ խնդիրներ չունես, ապա կարող ես պարզապես գրել &. Եթե ​​ապագայում հայտնվի նոր կոդ, ապա կարծում եմ, որ այն հստակորեն կհայտարարվի ոչ HTML 4.01 բնութագրում, հետևաբար այն չպետք է ազդի սովորաբար հայտարարված փաստաթղթի վրա: Կամ դուք ակնկալում եք ապահովել աջակցություն ապագա չափանիշների համար պարզ փոփոխությունփաստաթղթերի սխեման?

Դանիել Ալիևսկի [Դոսյե]
XML-ում նորմալ մեջբերումը որպես տեքստ նույնպես խնդիր չի առաջացնում (համապատասխանաբար, XHTML-ում, իհարկե): IMHO մեջբերումները սովորաբար թարգմանվում են «միայն մեկ պատճառով՝ դուք չեք ցանկանում գրել երկու ֆունկցիա՝ XML/HTML/XHTML-ով փոխարինելիս տեքստը անվտանգ ձևի բերելու համար: