internetul Windows. Android

Atribute XML. Când să evitați citatele duble în XML

Scopul acestei lecții:

  1. BI ar trebui să cunoască formatul de înregistrare limba XML.
  2. Bi ar trebui să poată elabora un document sub forma unui cod XML
  3. Bi ar trebui să cunoască tipurile de date și să le poată folosi

NOTĂ: Limba XML nu este atât de scurtă, așa cum am descris-o în această lecție. Considerăm doar caracteristicile limbajului XML care vor fi utilizate în sistemul ODA-TM.

Xml. Fundatia

XML a fost creat pentru a lupta, stocarea și transportul informațiilor.

Următorul exemplu al unui prieten al unui prieten al unui prieten are o vedere XML:

Nikolai. Ivana. Aducere aminte Sper că nu ați uitat de întâlnirea noastră

Puteți trimite vizual acest cod în formularul următor (fig.1).

Codul are un expeditor și destinatar al informațiilor, de asemenea, are un titlu și un organism de mesaj.

Se intenționează să aibă pe cineva să se ocupe de el, trimis și afișat.

Dar, totuși, acest document XML nu face nimic. Acestea sunt doar informații înfășurate în etichete.

XML - Tree

XML are o structură de copac. Documentul are întotdeauna un element rădăcină (instruire Relația nu are o relație). Elementul copacului există întotdeauna descendenți și strămoși, cu excepția elementului rădăcină, care nu are strămoși, precum și elemente de capăt (frunze de copaci), care nu au descendenți. Fiecare element al copacului este la un anumit nivel de cuibărit (denumit în continuare "nivel"). Elementele la un nivel sunt anterioare și următoarele elemente.

Utilizarea XML Inventați propriile dvs. etichete

Pentru a crea etichete (descriptori, articole), nu există un format standard.

Limba XML nu are etichete predefinite.

  • XML permite autorului să-și determine propriile etichete și structura proprie a documentelor.
  • XML este utilizat pentru a transfera date
  • XML este un instrument independent de software și hardware pentru transferul informațiilor.
  • XML, acum este, de asemenea, important pentru rețea ca html
  • XML este cel mai comun instrument pentru transmiterea datelor între diferite aplicații.
  • XML este utilizat în multe aspecte ale dezvoltării web, adesea pentru a simplifica stocarea și schimbul de date

XML sintaxă

Sintaxa regulilor XML este foarte simplă și logică

  • Toate elementele XML trebuie să aibă o etichetă de închidere
  • Elementele XML trebuie să fie încorporate corespunzător (unul în altul și, în nici un caz, nu se intersectează)
  • XML - Documentele trebuie să aibă un element rădăcină (documentele XML trebuie să conțină un element care este părintele tuturor celorlalte elemente. Acest element se numește elementul rădăcină.
  • Valoarea atributului XML trebuie să fie închisă în citate.

Comentarii

Dacă trebuie să faceți un fragment al documentului XML, în general, "invizibil" pentru programul analizorului, atunci acesta poate fi emis ca un comentariu, scriind simbolurile < !-- , și după IT - simboluri --> Cu două defiziuni la rând.

De exemplu:

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

Programul analizorului va pierde tot acest design, nici măcar "caută" în ea.

O astfel de sintaxă de comentarii impune două restricții:

  • În comentariu, două defiziuni nu sunt înregistrate;
  • comentariul nu poate fi completat cu o cratimă.

Elemente XML.

Un element XML este pornind de la eticheta inițială a elementului și terminând cu finala.

Elementul poate conține:

  • alte elemente
  • text
  • atributes.
  • sau o combinație de toate ...

Reguli XML Naming.

Elementele XML trebuie să respecte aceste reguli de numire:

  • Numele pot conține litere, numere și alte caractere.
  • Numele nu pot începe cu un număr de număr sau punctuație
  • Numele nu pot conține spații

Atributes.

Atributele furnizează informații suplimentare Pe elemente care nu fac parte din date.

În exemplul de mai jos, tipul de fișier nu este legat de date, dar este important pentru software-ul care poate manipula elemente:

computer.gif.

Atributele XML trebuie să fie închise în citate

Valorile atributului ar trebui să fie întotdeauna în citate. Pot fi utilizate citate unice sau duble. Exemplu: Pentru a determina podeaua unei persoane, elementul poate fi înregistrat după cum urmează:

Dacă valoarea atributului conține în sine citate duale, puteți utiliza ghilimele unice, ca în acest exemplu:

sau puteți utiliza obiecte simbolice: " "

Câteva exemple de utilizare a datei de date

Data ca atribut

TOVE. Jani. ADUCERE AMINTE. Nu mă uiți în acest weekend!

Data ca element

10/01/2008 TOVE. Jani. ADUCERE AMINTE. Nu mă uiți în acest weekend!

Data ca element extins

10 01 2008 TOVE. Jani. ADUCERE AMINTE. Nu mă uiți în acest weekend!

Metadate Atributes.

Acești identificatori pot fi utilizați pentru a defini elementele XML.

Exemplu:

TOVE. Jani. ADUCERE AMINTE. Nu mă uiți în acest weekend!

Jani. TOVE. Re: Reminder. Nu o să.

Datele privind datele trebuie salvate ca atribute, iar datele în sine trebuie să fie stocate ca elemente.

Xml. Tipul de date.

Tipuri simple construite

data si ora

  • dateTime. Conține data și ora în format CCYY-MM-DTHH: MM: SS
  • durată. - reprezintă o durată temporară, care este exprimată de componentele zilelor Grigore, ore, minute și secunde.

De exemplu: înregistrare P1Y2M3DT10H30M45S. Înseamnă un an (1y), două luni (2m), trei zile (3dt), la ora zece (10h), treizeci de minute (30m) și 45 de secunde (45s).

Înregistrarea poate fi abreviată P120M înseamnă 120 de luni și T120M - 120 de minute.

  • timp. conține timp în format convențional hH: MM: SS
  • data. Conține data în format Ccyy-mm-dd
  • gyearmonth. alocă an și lună în format Ccyy-mm.
  • gyear. înseamnă un an în format Cyy.
  • gonthday. Conține luna și ziua în format Mm-dd.
  • ziua g. Ziua lunii în format DD.
  • gonth. Luna în format Mm.

Strugări de simboluri

Şir - Tip de caractere de bază.

Un șir de caractere sub forma unei secvențe de simbol Unicode, incluzând spațiu, file, întoarcerea căruciorului și traducerea rândului.

  • normalizatstring.- Subtipul de tip - Acestea sunt șiruri care nu conțin caracterele de traducere a caracterelor "\\ n", returnați căruciorul "\\ R" și fila orizontală "\\ t".
    • jeton. - subtipul de tip normalizat nu este, în plus, lacunele inițiale și finale și câteva lacune de contractare.
      • limba. - simbolul subtipului, definit pentru a înregistra un nume de limbă conform Recomandării RFC 1766, de exemplu, RU, EN, DE, FR.
      • Nmtoken. - simbolul subtipului, utilizat numai în atribute pentru a înregistra valorile enumerate.
      • Nume. - simbolul subtipului, alcătuiesc numele XML - secvența de litere, numere, cratime, puncte, colon, subliniere, începând cu litera (cu excepția secvenței rezervate a literelor X, X, M, M, L, L În orice combinație de registre) sau o subliniere. Numele începând cu șirul xML.A folosit specificația XML în sine.
        • NCNAME.- Numele subtipului care nu conține colon. Sunt definite trei subtipuri: ID, IDREF, entitate

Tipuri binare

  • boolen. - binar, logic. Ia valori: adevărat sau fals (1 sau 0)
  • base64binary. - numere întregi binare în Base64 Codificare
  • hexbinary. - numere întregi binare în uniformă hexazecimală fără caractere suplimentare

Numere reale

  • zecimal Vinați numere reale înregistrate cu un punct fix: 123,45, -0,48747798 etc.
  • dubla. și pluti. Tipurile respectă IEEE754-85, înregistrate cu un punct fix sau plutitor.

Numere întregi

  • întreg - numărul principal de tip care conține numerele cu ordin zero este înțeles ca un subtip zecimal
  • număr - determină numărul (fără restricții privind numărul de numere); Poate conține un semn, o fracție, precum și un indicator al gradului. Valorile se schimbă

1.7976931348623157E + 308 la 2.2250738585072014E-308

Există un simbol de evadare pentru citate duble În xml? Vreau să scriu un fel de etichetă:

dar dacă aș pune ", atunci înseamnă că șirul sa terminat. Am nevoie de ceva de genul ăsta (C ++):

Printf ("quote \u003d \\" ");

Există un simbol pentru a scrie înainte de citat dublu pentru a evita acest lucru?

Răspuns nou, îmbunătățit la întrebarea veche, frecventă ...

Când să evitați citatele duble în XML

Pot apărea citate (") fără ieșire :

    În manualul XML:

    El a spus: "Nu mă citi."

    În atributele XML separate prin citate unice ("):

    Notă: Tranziția la citate unică (") nu necesită, de asemenea, ecranare:

Double Quotion (") trebuie să fie protejați :

    În atributele XML separate prin ghilimele duble:

Linia inferioară

Double Quotion (") trebuie să fie protejat ca" în XML "numai într-un context foarte limitat.

Dacă trebuie doar să încercați rapid ceva, aici este o soluție rapidă și murdară. Utilizați ghilimele unice pentru valoarea atributului:

În C ++, puteți utiliza API-ul Escapexml ATL. aceasta calea cea buna Prelucrarea personajelor speciale ...

Iată simbolurile comune care urmează să fie protejate în XML, începând cu cotații duble:

  1. citate duble (") sunt resetate în"
  2. ampsand (&) Eludes la &
  3. citate unice (") sunt resetate în"
  4. mai puțin (<), экранируется до <
  5. mai mult de (\u003e), protejat la\u003e

Alții au răspuns cum să facă față unor protecții specifice în acest caz.

Un răspuns mai larg nu este să încerci să o faci singur. Utilizați XML API - Există multe disponibile practic pentru fiecare platformă de programare modernă.

XML APIS se va ocupa de lucruri ca aceasta automat pentru dvs., făcându-l departe E greu să mergi prost. Dacă nu scrieți singur API-ul XML, rareori trebuie să vă faceți griji cu privire la astfel de detalii.

Continuăm din nou să explorăm XML și în acest articol se va familiariza cu structurile XML, cum ar fi instrucțiunile de procesare, comentarii, atribute și alte elemente XML. Aceste elemente sunt de bază și permit flexibile, într-un mod clar, cu standardul de a plasa documente de absolut orice complexitate.

Unele momente, cum ar fi etichetele XML, am luat deja parțial parțial în articolul precedent ". Acum vom atinge din nou acest subiect și o vom analiza mai detaliat. Acest lucru se face în mod specific pentru a vă ușura să prezentați întreaga imagine a modelelor XML.

Elemente XML. Elementele XML goale și non-goale

Așa cum am menționat în articolul precedent, etichetele din XML nu pun doar textul, așa cum se întâmplă în HTML și alocați elemente individuale (obiecte). La rândul său, elementele organizează ierarhic informații în document, care la rândul lor le-au făcut principalele unități structurale ale limbajului XML.

În XML, elementele pot fi două tipuri - goale și non-goale. Elementele goale nu conțin date, cum ar fi text sau alte modele. Spre deosebire de elementele goale, non-goale poate conține orice date, cum ar fi textul sau alte elemente și modele XML. Pentru a înțelege esența celor de mai sus, să luăm în considerare exemple de elemente XML goale și non-goale.

Elementul XML gol

Element XML non-gol

Element de conținut ...

După cum vedem din exemplul de mai sus, principala diferență de elemente goale de la non-goale este că ele constau doar dintr-o etichetă. De asemenea, merită remarcat faptul că în XML toate numele sunt independente de caz. Aceasta înseamnă că numele de miză, miză, myelement etc. Ele diferă între ele, astfel încât momentul ar trebui să fie amintit imediat pentru a evita greșelile în viitor.
Deci, ne-am ocupat de elemente. Acum, să trecem la următorul moment, cum ar fi organizarea logică a documentelor XML.

Organizarea logică a documentelor XML. Structura copacului Datele XML

După cum vă amintiți, principalul design al limbajului XML este elementele care pot conține alte structuri încorporate și astfel formează o structură ierarhică sub forma unui copac. În acest caz, elementul părinte va fi rădăcina, iar toate celelalte filiale vor fi ramuri și frunze ale copacului XML.

Pentru a facilita înțelegerea esenței celor de mai sus, să luăm în considerare următoarea imagine cu un exemplu.

După cum vedem, organizarea documentului XML sub forma unui copac este o structură destul de simplă pentru prelucrare. În același timp, complexitatea expresivă a copacului în sine este destul de mare. Este o reprezentare a copacilor care este cea mai optimă modalitate de a descrie obiectele din XML.

Atribute XML. Atribute Regulile de înregistrare în XML

În XML, elementele pot conține și atribute cu valori atribuite care sunt plasate în ghilimele unice sau duble. Atributul pentru element este dat după cum urmează:

În acest caz, a fost utilizat un atribut cu denumirea "atribut" și valoarea "valoare". Este necesar să observăm imediat că atributul XML trebuie să conțină neapărat o anumită valoare și nu poate fi goală. În caz contrar, codul va fi incorect din punctul de vedere al XML.

De asemenea, merită acordarea atenției la utilizarea citatelor. Valoarea atributului poate fi închisă atât în \u200b\u200bcitatele simple, cât și în dublu. În plus, este posibilă utilizarea unor citate în interiorul celorlalte. Pentru a demonstra, ia în considerare următoarele exemple.

Înainte de a continua cu alte construcții XML, merită remarcat faptul că atunci când creați atribute ca valori astfel de caractere speciale ca ampersand "&" sau paranteze unghiulare "nu pot fi folosite ca valori.<>" Aceste caractere sunt rezervate ca manageri ("&" - esență și "<» и «>»Deschideți și închideți eticheta elementului) și nu poate fi utilizată în" formă pură ". Pentru a le folosi, trebuie să recurgeți la înlocuirea specialităților.

Instrucțiuni de procesare XML (instrucțiuni de procesare). Declarația XML.

În limba XML, este posibil să se permită instrucțiunile din document pe care le transportați anumite informații pentru aplicațiile care vor procesa unul sau alt document. Instrucțiunile pentru prelucrarea XML sunt după cum urmează.

După cum se poate observa din exemplul de mai sus, în XML, instrucțiunile de prelucrare sunt închise în citate unghiulare cu un semn de întrebare. Acest lucru este puțin reamintește obiceiul, pe care l-am luat în considerare în primele lecții despre PHP. În prima parte a instrucțiunii de procesare, aplicația sau sistemul, destinată a doua parte a acestei instrucțiuni sau a conținutului acesteia. În acest caz, instrucțiunile de prelucrare sunt valabile numai pentru aceste aplicații pe care le sunt abordate. Un exemplu de instrucțiune de procesare poate fi următoarea instrucțiune.

Este demn de remarcat faptul că în XML există un design special, care este foarte asemănător cu instrucțiunile de prelucrare, dar ea însăși nu este așa. Vorbim despre declarația XML care transmite procesarea software. Unele informații despre proprietățile documentului XML, cum ar fi codificarea, versiunea lingvistică în conformitate cu care este scrisă acest document etc.

După cum se poate observa din exemplul de mai sus, declarația XML conține așa-numitele atribute Pseudo-atribute care sunt foarte asemănătoare cu atributele obișnuite pe care le-am vorbit puțin mai sus. Faptul este că, prin definiție, declarația XML și instrucțiunile de prelucrare nu pot conține atribute, astfel încât aceste anunțuri numite Pseudo-atributs. Merită să ne amintim pentru viitor pentru a evita greșelile diverse.

De când ne-am ocupat de pseudo-atribudiu, să ne uităm la ceea ce înseamnă.

  • Codificarea - responsabilă de codificare Document XML.. Utilizați de obicei codarea UTF8.
  • Versiunea este versiunea limbajului XML pe care este scris acest document. Aceasta este de obicei versiunea XML 1.0.

Ei bine, acum să mergem la o parte încheiată a articolului și să luăm în considerare astfel de modele XML ca comentarii și secțiuni ale CDATA.

  • Transfer
  • Tutorial

Injectarea SQL, falsă de solicitări transversale, deteriorate XML ... lucruri înfricoșătoare, teribile, de la care ne-ar plăcea toți să vă protejăm, dar știu de ce se întâmplă totul. Acest articol explică conceptul fundamental din spatele tuturor acestor: rânduri și prelucrarea rândurilor în interiorul liniilor.

Problema principala

Acesta este doar textul. Da, doar textul - aici este principala problemă. Aproape totul din sistemul informatic este reprezentat de textul (care, la rândul său, este reprezentat de octeți). Este că unele texte sunt destinate unui computer și altele pentru oameni. Dar aceștia rămân în continuare textul. Pentru a înțelege despre ce vorbesc, voi da un exemplu mic:
Homo sapiens. Să presupunem că există textul în limba engleză, ceea ce nu vreau să traduc în rusă

Nu credeți: este textul. Unii oameni o numesc XML, dar este doar textul. Poate că nu este potrivit pentru a arăta profesorul englez, dar este încă doar text. Puteți să-l imprimați pe un poster și să mergeți cu el la mitinguri, îl puteți scrie în litera pe care mama ta ... acesta este textul.

Cu toate acestea, dorim anumite părți ale acestui text să aibă o anumită valoare pentru calculatorul nostru. Vrem ca computerul să poată extrage autorul textului și textul în sine separat, astfel încât să puteți face ceva cu el. De exemplu, convertiți cele menționate mai sus la aceasta:
Să presupunem că există textul în limba engleză, pe care nu vreau să le traduc în limba rusă de Homo Sapiens
Unde știe computerul cum să o facă? Ei bine, pentru că am înfășurat foarte mult anumite părți ale textului cu cuvinte speciale în paranteze distractive, cum ar fi, de exemplu, și. De când am făcut-o, putem scrie un program care să caute aceste anumite părți, să elimine textul și îl va folosi pentru orice invenție proprie.

Cu alte cuvinte, am folosit anumite reguli în textul nostru pentru a identifica o importanță deosebită ca cineva, observând aceleași reguli, ar putea folosi.
Bine, nu este atât de greu de înțeles. Și dacă vrem să folosim aceste paranteze amuzante, care sunt un înțeles deosebit în textul nostru, dar fără a folosi acest sens? .. ceva de genul acesta:

Homo sapiens. < n and y >

Simboluri "<" и ">"Ei nu sunt speciali, ei pot fi folosiți în mod legal oriunde, în orice text, ca în exemplul de mai sus. Dar cum este ideea noastră despre cuvinte speciale, cum ar fi? Asta înseamnă, ce este un fel de cuvânt cheie? În XML - poate Da. Și poate nu. Acest lucru este ambiguu. Deoarece computerele nu fac obiectul ambiguităților, atunci ceva ca rezultat poate da un rezultat neprevăzut dacă nu interfera cu toate punctele de mai sus și nu eliminăm ambiguitatea.
Puteți rezolva această dilemă, înlocuind simbolurile ambigue ale ceva fără ambiguitate.
Homo sapiens. Matematica de bază ne spune că dacă x< n and y > N, x nu poate fi mai mare decât Y.

Acum, textul ar trebui să fie complet neechivoc. "<" равносильно "<", а ">" - ">".
Definiția tehnică a acestui lucru - ecranul , Evităm simboluri speciale atunci când nu vrem să aibă o importanță deosebită.
Escape | Iskāp | [No Obj. ] Spargeți liber [cu obj. ] Nu observați / nu vă amintiți [...] [cu Obj. ] Aceasta: Pentru a fi interpretat diferit [...]
Dacă anumite caractere sau secvențe de caractere din text au o importanță deosebită, trebuie să existe reguli care să determine modul de rezolvare a situațiilor în care aceste caractere ar trebui utilizate fără a atrage importanța lor specială. Sau cu alte cuvinte, ecranarea răspunde la întrebarea: "Dacă aceste personaje sunt atât de speciale, atunci cum ar trebui să le folosesc în textul tău?".
Așa cum a fost posibil să se observe în exemplul de mai sus, Ampersand (&) este, de asemenea, un simbol special. Dar ce să faceți dacă vrem să scriem "<", но без интерпретации этого как "<"? В XML, escape-последовательность для &, это - " & ", т.е. мы должны написать: " &< "

Alte exemple

XML nu este singurul caz de "suferință" de la personaje speciale. Orice cod sursă în orice limbă de programare poate demonstra:
Var Name \u003d "Homo sapiens"; Var Contents \u003d "Să presupunem că există textul în limba engleză, pe care nu vreau să le traducă în rusă";
Totul este simplu - textul obișnuit este clar separat de citatele duble "nu text". În același mod, se poate utiliza textul meu din cursul de analiză matematică:
Var Name \u003d "Homo sapiens"; Var Contents \u003d "Matematica de bază ne spune că dacă x< n and y > N, x nu poate fi mai mare decât y. ";
Misto! Și nici măcar nu trebuie să recurgeți la ecranare! Dar așteptați și dacă vreau să citez pe cineva?
Var Name \u003d "Homo sapiens"; Var Contents \u003d "Platon se spune că o dată au spus" Lorem Ipsum Dolor Sit Amet ".";
Hmm ... tristețe, dor. Ca persoană, puteți determina unde începe textul și se termină și unde se află cotația. Cu toate acestea, a devenit din nou ambiguu pentru orice computer. Trebuie să venim cu un fel de reguli de protecție care ne-ar ajuta să distingem cu literal "și", ceea ce înseamnă sfârșitul textului. Majoritatea limbilor Programare Utilizați caracteristici oblice:
Var Name \u003d "Homo sapiens"; Var Contents \u003d "Se spune că Platon a spus o dată" Lorem Ipsum Dolor Sit Amet \\ ".";
"\\" face un simbol după ce nu este special. Dar acest lucru, din nou, înseamnă că "este un simbol special. Pentru scrierea neechivocă a acestui simbol în text, trebuie să adăugați același simbol la el scris: "\\\\". Amuzant, nu?

Atac!

Nu totul ar fi atât de rău dacă ar fi trebuit să recurgă la ecranare. Sfaturi, desigur, dar nu este atât de groaznic. Problemele încep când unele programe scrie text pentru alte programe pentru a "citi". Și nu, nu este o ficțiune științifică, se întâmplă în mod constant. De exemplu, pe acest site, publicați un mesaj, nu îl formați în manual în format HTML și scrieți numai textul care, în consecință, este convertit de acest site în HTML, după care browserul converti deja " Generat "HTML din nou în textul citit.

Un alt exemplu comun și sursă de multe probleme de securitate - solicitări SQL. SQL - Limba menită să simplifice comunicarea cu bazele de date:
În acest text, nu există practic caractere speciale, în cea mai mare parte cuvinte în limba engleză. Și totuși, de fapt, fiecare cuvânt din SQL are un înțeles special. Se utilizează în multe limbi de programare la nivel mondial într-o formă sau altul, de exemplu:
$ query \u003d "Selectați telefonul_number de la utilizatori în cazul în care numele \u003d" Alex "; $ rezultat \u003d mysql_query (£ interogare);
Aceste două linii simple se vor rezuma de la noi o sarcină teribil complexă a unei cereri de program de baze de date care să respecte cerințele noastre. Baza de date "site-uri", eventual terabytes de biți și octeți pentru a returna un rezultat frumos formatat al programului care a făcut o cerere. Serios, toate aceste prostii sunt încapsulate într-o propunere simplă anglo.

Pentru a fi util, aceste solicitări nu sunt coduri dificile, ci sunt construite pe baza introducerii utilizatorului. Aceasta este propunerea care vizează utilizarea diferitor utilizatori:
$ nume \u003d $ _post ["nume"]; $ query \u003d "Selectați telefonul_number de la utilizatori în cazul în care numele \u003d" $ nume ""; $ rezultat \u003d mysql_query (£ interogare);
În cazul în care pur și simplu vizualizați acest articol: Acesta este un anti-exemplu! Acesta este cel mai rău pe care l-ați putea face vreodată! Acesta este un coșmar de securitate! De fiecare dată când scrieți așa ceva, veți muri un pisoi nevinovat! Ktulhu îți va mânca sufletul!

Și acum să vedem ce se întâmplă aici. $ _Post ["nume"] - o valoare pe care un utilizator aleatoriu a intrat într-o formă aleatorie pe site-ul dvs. aleator. Programul dvs. va construi o interogare SQL care utilizează această valoare ca nume de utilizator pe care doriți să îl găsiți în baza de date. Apoi, această "ofertă" SQL este trimisă direct în baza de date.

Se pare că totul nu pare atât de teribil, da? Să încercăm să introducem mai multe valori aleatorii care pot fi introduse pe site-ul dvs. aleatoriu și ce cereri din acest lucru se va dovedi:

Alex.
Selectați telefonul_number de la utilizatori unde numele \u003d "Alex"
McDonalds.
Selectați telefonul_number de la utilizatori unde numele \u003d "MC" Donalds "
Joe "; Utilizatori de tabel de drop; -
Selectați Phone_Number de la utilizatori unde numele \u003d "Joe"; Utilizatorii de tabel de drop; - "
Prima cerere nu arată înfricoșătoare, dar destul de drăguță, nu? Numărul 2, se pare, "oarecum" dăunează sintaxei noastre din cauza ambiguă. "La naiba germană! Numărul 4 ceva stupid. Cine ar scrie asta? Nu are sens ...
Dar nu pentru cererea de procesare a bazei de date ... baza de date nu are nimic de unde a venit această cerere și ce ar trebui să însemne. Singurul lucru pe care îl vede este două cereri: găsiți un număr de utilizator numit Joe, apoi ștergeți tabelul utilizatorilor (care este însoțit de un comentariu ") și va fi făcut cu succes.

Pentru tine, asta nu ar trebui să fie știri. Dacă da, atunci, vă rugăm să citiți din nou acest articol, deoarece sunteți fie un nou venit în programare, fie ultimii 10 ani trăiau într-o peșteră. Acest exemplu ilustrează elementele de bază ale injecțiilor SQL utilizate în întreaga lume. Pentru a șterge datele sau pentru a obține date care nu ar trebui să fie pur și simplu obținute sau să vă conectați, fără a avea drepturi etc. Și toate pentru că baza de date percepe "propoziția" asemănătoare anglo prea literalmente.

OOOEEEEE!

Următorul pas: atacuri XSS. Acestea acționează în același mod, se aplică numai HTML.
Să presupunem că ați decis probleme cu baza de date, să primiți date de la utilizator, să scrieți în baza de date și să le trimiteți înapoi la site-ul web, pentru a accesa utilizatorii. Acesta este ceea ce face un forum tipic, un sistem de comentarii etc. Undeva pe site-ul dvs. există ceva de genul acesta:

Postat de. PE.


Dacă utilizatorii dvs. sunt buni și amabili, vor plasa citatele filosofilor vechi, iar mesajele vor avea despre următorul tip:

Postat de Platon pe 2 ianuarie 15:31

Sunt spus că au spus "Lorem Ipsum Dolor Sit Amet, Consertur Adipisicing Elit, Sed do Eiusmod Tempor Incizidunt UT Labore et Dolore Magna Aliqua. UT Enim Ad Minim Veniam, quis Nostrid Exerciții Ullamco Laboris Nisi UT Alicip ex Ea Commodo Conquat".


Dacă utilizatorii sunt inteligenți, probabil vor vorbi despre matematică și vor exista astfel de mesaje:

Postat de Pascal pe 23 noiembrie 04:12

Matematica de bază ne spune că dacă x< n and y > N, x nu poate fi mai mare decât Y.


Hmm ... din nou aceste implicite ale parantezelor noastre. Ei bine, din punct de vedere tehnic, ele pot fi ambigue, dar browser-ul ne va ierta acest lucru, nu?


Opriți-vă, ce iad? Ce a introdus un joker tag-uri JavaScript pe forum? Oricine se uită la acest mesaj pe site-ul dvs., este acum încărcat și execută scripturi în contextul site-ului dvs. care nu poate avea știrile care. Și acest lucru nu este bun.

Nu înțelegeți literalmente

În cazurile de mai sus, dorim să informăm cumva baza noastră de date sau browser-ul, că este doar un text, nu faceți nimic cu el! Cu alte cuvinte, dorim să "ștergem" valorile speciale ale tuturor caracterelor speciale și cuvinte cheie Din orice informație furnizată de utilizator, pentru că nu avem încredere în el. Ce să fac?

Ce? Ce zici, băiete? Oh, spui "ecranare"? Și tu ești absolut corect, ia cookie-ul!
Dacă aplicăm ecranarea datelor de utilizator înainte de a le combina cu cererea, problema este rezolvată. Pentru cererile noastre de baze de date, va fi ceva de genul:
$ nume \u003d $ _post ["nume"]; $ nume \u003d mysql_real_escape_string ($ nume); $ query \u003d "Selectați telefonul_number de la utilizatori în cazul în care numele \u003d" $ nume ""; $ rezultat \u003d mysql_query (£ interogare);
Doar o singură linie de cod, dar acum nimeni altcineva nu poate "hack" baza noastră de date. Să vedem din nou cum vor arăta solicitările SQL, în funcție de intrarea utilizatorului:
Alex.
Selectați telefonul_number de la utilizatori unde numele \u003d "Alex"
McDonalds.
Selectați telefonul_number de la utilizatori unde numele \u003d "MC \\" Donalds "
Joe "; Utilizatori de tabel de drop; -
Selectați telefonul_number de la utilizatori unde numele \u003d "Joe \\"; Utilizatorii de tabel de drop; - "
Mysql_real_escape_string fără parsare locuri oblice linie în fața tuturor, care poate fi un fel de semnificație specială.


Folosim caracteristica HTMLSPERACHATS pentru toate datele de utilizator, înainte de a le aduce departe. Acum mesajul dăunător arată astfel:

Postat de Jacktr, pe 18 iulie 12:56


Vă rugăm să rețineți că valorile primite de la utilizatori nu sunt într-adevăr "deteriorate". Orice browser parasit este ca HTML și afișează totul în forma potrivită.

Ce ne aduce înapoi la ...

Toate cele de mai sus demonstrează problema caracteristică a multor sisteme: textul din text trebuie să fie protejat dacă se presupune că nu ar trebui să aibă caractere speciale. Plasarea valorilor textuale în SQL, acestea trebuie să fie protejate de regulile SQL. Plasarea valorilor textuale în HTML, acestea trebuie să fie protejate de regulile HTML. Prin plasarea valorilor textului în (denumirea tehnologiei), acestea trebuie să fie protejate de reguli (denumire tehnologică). Asta e tot.

Pentru o imagine completă

Există, desigur, alte modalități de combatere a inventatorilor de utilizatori, care ar trebui sau nu ar trebui să conțină caractere speciale:
  • Validare.
    Puteți verifica dacă intrarea utilizatorului se potrivește cu unele specificații specificate. Dacă aveți nevoie de introducerea numărului, iar utilizatorul intră în altceva, programul trebuie să-l informeze despre el și să anuleze intrarea. Dacă toate acestea sunt organizate corespunzător, atunci nu există riscul de a apuca "drop tabelul de mese" unde, a fost presupus, utilizatorul va introduce "42". Acest lucru nu este foarte practic pentru a evita injecțiile HTML / SQL, deoarece Adesea este necesar să se adopte textul unui format gratuit care să conțină "excursii". De obicei, validarea este utilizată în plus față de alte măsuri.
  • Sanitizarea
    De asemenea, puteți "umezi" pentru a elimina orice caractere pe care le considerați periculoase. De exemplu, pur și simplu eliminați ceva similar cu eticheta HTML care evită adăugarea la forumul dvs. Problema este că puteți șterge părți destul de legitime ale textului.
    Declarații SQL pregătite
    Există funcții speciale care fac ceva pe care l-am realizat: forțând baza de date să înțeleagă diferențele dintre cererea SQL și informațiile furnizate de utilizatori. În RNR, arată astfel:
    $ Stmt \u003d $ pdo-\u003e Pregătiți ("Selectați telefonul_number de la utilizatori în cazul în care numele \u003d?"); $ Stmt-\u003e Executare ($ _ Post ["nume"]);
    În același timp, trimiterea are loc în două etape, distinge în mod clar cererea și variabilele. Baza de date are capacitatea de a înțelege mai întâi structura interogării și apoi completează-o cu valori.

  • În lumea reală, toate acestea sunt folosite împreună pentru diferite etape de protecție. Trebuie să utilizați întotdeauna verificarea verificării (validare) pentru a vă asigura că utilizatorul intră în date corecte. Apoi puteți (dar nu sunteți obligat) să scanați datele introduse. Dacă utilizatorul încearcă în mod clar să "conducă" un script pentru dvs., puteți să-l ștergeți pur și simplu. Apoi, întotdeauna trebuie să protejați întotdeauna datele personalizate înainte de a le introduce într-o interogare SQL (același lucru este valabil și pentru HTML).

Pentru o lungă perioadă de timp, standardul prescrie pentru a introduce citatele obișnuite în HTML-White pentru a aplica designul "În interiorul etichetelor de cotație" sunt utilizate pentru a indica atributele.

Cu toate acestea, nu am intrat încă un browser, care nu ar arăta cum este un simbol simplu "în afara oricăror etichete. Deci, spune-mi, dragi colegi, poate că" etichetele exterioare nu există pur și simplu nimeni pentru nimeni? Puteți scrie în siguranță și nu aparent "? În special în textele, în cazul în care multe citate și respectarea regulilor stricte de proiectare (despre utilizarea corectă a cotelor naționale) sunt irelevante.

IMHO, mulți o fac ... dar întrebarea nu este destul de clară: dacă înțelegeți că, conform standardelor, trebuie să scrieți citate cum ar fi ", dar leneș, în ciuda faptului că o mulțime de site-uri funcționează și așa cum vă așteptați Asculta? Mă gândesc dacă afișarea citatelor este menținută în versiunile noi de browsere, nimeni nu știe, astfel încât să puteți da din nou o recomandare evidentă: nu doriți probleme în următoarele standarde de 100% :) Dar știți acest lucru Tu faci. Sau așteptați confirmarea: da. Este totul, Chas, iar după 10 ani totul va fi același, eu sunt (Microsoft, Mozilla I.T.D) garanție?

Lynn "coffeeman" [dosar]
Da, apropo ... acum am urcat să citesc, nicăieri nu este argumentat că citate trebuie să fie reprezentate în forma "
http://www.stack.ru/~julia/html401/CHARSET.HTML:

Unii autori folosesc o referire la esența simbolică "" "pentru codarea instanțelor (") de cotații ("), deoarece acest simbol poate fi utilizat pentru a separa valorile atributului.

despre faptul că trebuie sa Utilizați entitatea doar spune despre<, > Și &:

Dacă autorul dorește să pună simbolul în text "<", во избежание возможной путаницы с началом тега (метка начала тега) он должен использовать ссылку "<" (десятичный код ASCII 60). Точно так же во избежание проблем со старыми версиями пользовательских агентов, некорректно принимающих символы ">"Pentru sfârșitul etichetei (eticheta la sfârșitul etichetei), ar trebui să utilizați linkul"\u003e "(codul zecimal ASCII 62).

Pentru a evita confuzia cu legături cu caractere (eticheta legăturii către simbol), în loc de simbolul "&", ar trebui să utilizați linkul "&" (codul zecimal ASCII 38). În plus, legătura "&" ar trebui să fie utilizată și în valorile atributului, deoarece sunt permise referințele la caracterele din valorile valorilor atributului CDATA.

Dar doar mă aștept la un răspuns ca un răspuns Lynn: că nu există nimic de fapt. Nici măcar nu mi-a deranjat - informațiile mele din manualele populare și pentru considerații "toată lumea face asta".

Sau altă opțiune: dar dacă urmați noile standarde, cu care nu m-am confruntat în practica mea - cum ar fi XHTML (a fost ca, am verificat XHTML), apoi o astfel de accent nu va trece. Prin urmare, nu este necesar să se creeze probleme cu portabilitatea codului HTML scris.

Ei bine, sau în cele din urmă: tu ești singur?

&, apropo, dă naștere la o întrebare similară. În documentul de mai sus, documentul spune "pentru a evita confuzia". Dar confuzia este posibilă numai dacă pentru și urmează unul dintre codurile furnizate. Și dacă este, să spunem, adresa URL de tip "... / script? A \u003d 1 & b \u003d 2"? Riscă ceva dacă din greșeală, deoarece HREF a indicat o astfel de adresă URL (care, desigur, funcționează corect în timpul testului)? Ceva, cu excepția situației extrem de puțin probabile, că în 10 ani (când site-ul devine depășit sau zece ori rescris), va exista o esență cu nume extravagant și fără final; ? Cu alte cuvinte, cât de bine trebuie să verificați toate astfel de cazuri?

Daniel, dacă sunteți încrezător că, cu codurile existente, nu aveți probleme - puteți scrie și pur și simplu &. Dacă un nou cod apare în viitor, atunci se gândește că va fi declarat în mod clar nu în specificația HTML 4.01, prin urmare nu ar trebui să afecteze documentul declarat în mod normal. Sau calculați pentru a vă oferi sprijinul față de standardele viitoare simplu schimbare Scheme de documente?

Daniel Alievky [dosar]
În XML, cotațiile obișnuite, deoarece textul nu este, de asemenea, nici o problemă (respectiv, în XHTML, desigur). Citatele IMHO sunt de obicei traduse în "numai pentru un motiv - nu vreau să scriu două funcții pentru a aduce textul într-o minte sigură atunci când se înlocuiește în XML / HTML / XHTML.