internetul Windows. Android

Screening-ul de caractere. Ce caractere speciale ar trebui să fie protejate în expresii regulate? Ce este protejarea în HTML

De obicei, limbile de programare, interfețe de comandă text, text Limbi text (HTML, Tex, Wiki-Markup) care se ocupă de textul structurat în care unele dintre personaje (și combinațiile lor) sunt utilizate ca administrator, inclusiv structura de control a textului. Într-o situație în care este necesar să se utilizeze un astfel de simbol ca un "simbol de limbă convențională", se aplică ecranul.

Scaderea condiționată poate fi împărțită în trei tipuri:

  • singură de ecranare unică
  • screening un grup de caractere utilizând o secvență de simbol "Start Shielding", "ecranul de ecran"
  • folosind secvența de comandă "Start Shielding" și "Sfârșitul ecranului", care este setat la începutul textului ecranat.

Lipsa de ecranare ca o cauză a vulnerabilității

Simbolul de protecție atrage atenția specială atunci când textul structurat este generat automat. Includerea datelor de șir arbitrare implică ecranarea obligatorie a caracterelor de control în ele. În același timp, foarte des, liniile reale ale unor astfel de caractere nu conțin, ceea ce permite programator să renunțe la această operație și să primească un program mai simplu, care funcționează corect cu "orice" date rezonabile "de șir. Cu toate acestea, un astfel de cod simplificat are o vulnerabilitate ascunsă, deoarece o persoană terță parte (autorul datelor de șir) primește o posibilitate neautorizată de a influența structura Textul generat. Vulnerabilitatea devine gravă dacă textul creat este programul cuiva. În mod tradițional, astfel de probleme sunt supuse limbilor SQL (vezi SQL-Injection) și HTML (a se vedea scripturile site-ului SCRS).

Exemple

Singură de ecranare unică

  • În limba de programare SI, în interiorul liniilor, screening-ul caracterelor se efectuează utilizând simbolul "" plasat înainte de simbolul ecranat. (În același timp, simbolul "\\" se poate proteja, adică o combinație "\\\\") este utilizată pentru a scoate un Bexlesh), același simbol este utilizat pentru a proteja caracterele din promptul de comandă UNIX.
  • La promptul de comandă, ecranarea Windows Microsoft a caracterelor este efectuată utilizând simbolul "*" este plasat în fața simbolului umbrit.

Grupul de simboluri de protecție

  • În limba de programare Python, screening-ul grupului de simbol în șir se face prin indicarea literei R (de la limba engleză. Raw - Raw) în fața șirului, adică caracterele sunt protejate de secvențe r "text ecranat "
  • Ecranul de text Wiki-Markup este efectuat cu ajutorul Pseudo și . Dacă aveți nevoie să scrieți Pseudoteg însuși , acest lucru se face prin simbolurile înlocuirii ( ).

Textul ecranului cu simbolul final

Când există multe caractere de control în text, vor exista multe semne de ecranare, textul devine greu. Pentru astfel de cazuri, se utilizează o metodă alternativă de protecție - cu textul final. În acest caz, toate caracterele de control vor fi simboluri (nu suporți funcția de control), iar textul se termină când compilatorul detectează o anumită secvență - textul final.

Pentru a înțelege când și ce să evitați fără încercări, trebuie să înțelegeți cu exactitate lanțul de contexte prin care șirul trece. Veți specifica linia de la cea mai îndepărtată parte la destinația finală, care este o memorie, procesată de analiză a codului regulat.

Amintiți-vă cum șirul este procesat în memorie: dacă poate fi o linie simplă în interiorul codului sau a unui șir introdus în linia de comandă, dar poate fi o linie de comandă interactivă sau o linie de comandă specificată în fișierul script Shell sau În interiorul variabilei de memorie menționate de cod sau (șir) cu o evaluare suplimentară sau un șir care conține codul generat dinamic cu orice încapsulare ...

Fiecare din acest context i se atribuie mai multe caractere cu funcționalitate specială.

Dacă doriți să transferați caracterul literal, fără a utiliza funcția sa specială (pentru un context local), în acest caz trebuie să scăpați pentru următorul context ... care poate necesita un alt caracter de evadare, care poate fi necesar în În plus, a scăpat în contextul anterior (OH). În plus, pot exista lucruri cum ar fi codarea simbolului (cel mai insious este UTF-8, deoarece arată ca ASCII pentru simboluri comune, dar poate fi interpretat suplimentar chiar și de terminalul, în funcție de setările sale, astfel încât se poate comporta diferit, Atributul codificator HTML / XML este necesar pentru înțelegerea corectă a procesului.

De exemplu, o expresie regulată pe linia de comandă, începând cu perl -npe, trebuie transferată la setul de apeluri Sistem Exec Conectarea ca un canal care procesează fișierul, fiecare dintre aceste apeluri Sistem executive pur și simplu are o listă de argumente care au fost separate (nu sunt protejate) și poate canale (|) și redirecționare (\u003e n\u003e n\u003e & m), paranteze, extensie interactivă * și? , $ (()) ... (Toate acestea sunt caractere speciale utilizate de * sh, care pot părea interferarea cu un simbol regulat de expresie în următorul context, dar sunt estimate în ordine: înainte de linia de comandă. Linia de comandă este citiți de program ca Bash / SH / CSH / TCSH / Zsh, în mod substanțial în ghilimele duble sau citate unice, screening-ul mai ușor, dar nu este necesar să fie închise în citatele de comandă, deoarece, în principiu, spațiul trebuie prefixat cu o backslash și marca de cotare nu este necesară, lăsând funcționalitatea accesibilă a dezvăluirii pentru caractere * și?, dar analizează același context ca și în citate. Apoi, atunci când evaluați linia de comandă, expresia obișnuită obținută în memorie (nu așa cum este înregistrată pe linia de comandă) primește aceeași prelucrare ca în fișierul sursă. Pentru expresia regulată în paranteze pătrate există un context setat de simbol, o expresie periodică Perl poate fi închisă într-un set mare de caractere non-alfanumerice (de exemplu, m // il și m: / mai bine / pentru / ca: ...).

Aveți mai multe detalii despre caracterele într-un răspuns diferit, care sunt foarte specifice pentru contextul final al expresiei regulate. După cum am menționat, menționați că veți găsi că încercările Regexp Resex, care se datorează probabil faptului că un context diferit are un set de caractere diferit, care a confundat memoria dvs. despre încercările (adesea înapoi - un simbol folosit în acest alt Context pentru protejarea unui simbol literal în locul funcției sale.).

Nota: Versiunea adaptivă a site-ului este activată, care se ajustează automat la dimensiunea mică a browserului dvs. și se ascunde câteva detalii ale site-ului pentru citire. Vizionarea fericită!

Mă bucur să salut din nou pe toți pe paginile blogului dedicate tuturor complicațiilor creării și promovării cu succes a site-urilor - Site-ul. PE! În lecția PHP de astăzi, vom atinge subiecte precum: tipuri de variabile, ecranare, specialimolți, precum și sintaxa Heredoc în PHP.

Tipuri de variabile

PHP are opt tipuri diferite de variabile, din care

4 Tipuri scalare:

  • boolean (tip boolean sau logic)
  • integer (numere întregi)
  • float (număr de punct plutitor)
  • Şir

2 tipuri mixte:

  • array (matrice)
  • obiect (obiect)

2 tipuri speciale:

  • resursă.

Înainte de a trece la luarea în considerare a fiecărui tip, este în valoare de clarificarea faptului că PHP nu este un limbaj strict scris, ci o limbă cu tastarea dinamică. Aceasta înseamnă că nu avem nevoie în avans (când crearea) declarăm tipul fiecărei variabile. PHP însuși presupune ce tip de una sau altă variabilă, pe baza faptului că am pus în această variabilă. De asemenea, înseamnă că, în contrast cu limbile cu tipizări stricte, putem în variabila cu numărul (întregi) și puneți șirul (șir) și nu va fi o eroare! Aceasta este una dintre caracteristicile PHP, care foarte mult ca oamenii (novice), care nu se ocupă de programare. De regulă, în cele din urmă, toată lumea vine la faptul că este limbă minus și nu plus.

Boolean (logic) - Cel mai simplu tip. Pot dura numai 2 valori: adevărat. sau fals (Dreapta sau rău), sunt înregistrați independenți (puteți scrie adevărat, adevărat și așa mai departe.). Exemplu vizual:

eCHO $ \u200b\u200bNAME, "
", $ Nume2;?\u003e

Rezultat:

După cum puteți vedea, browserul nu înțelege tipul boolean, spre deosebire de PHP, așa că atunci când încercați să obțineți adevărat. sau fals El va afișa numărul 1 sau Șir gol.

La conversia la tipul logic, următoarele valori sunt tratate ca false:

  • întreg 0 (zero)
  • punctul plutitor 0.0 (zero)
  • stringul gol și șirul "0" sau "0"
  • array goală
  • special tip nul (inclusiv variabile neidentificate)

Toate celelalte valori sunt tratate ca fiind adevărate.

// numar decimal $ int \u003d -5; // un număr negativ $ int \u003d 05; // număr octal. $ int \u003d 0x1a; // Numărul hexazecimal
// numere de puncte plutitoare (reale): $ Flt \u003d 1.4; $ Flt \u003d 1.2e3; $ Flt \u003d 7e-10; ?\u003e.

Cu toate acestea, poate fi luată în considerare tipul cel mai frecvent utilizat în PHP PHP corzi (șir). Rândurile pot fi înregistrate fie în citate unică sau dublu, dar nu vă sfătuiesc niciodată să scrieți linii în citate dublu, pe măsură ce faceți un interpret PHP "Puro" șirul dvs. pentru prezența variabilelor în el, dar deși ușor, dar încet, dar lent munca în jos. Chiar dacă doriți să utilizați variabilele în rândul dvs. - acest lucru se poate face folosind citate unică + (lipirea a două sau mai multe linii într-una). De ce sunt necesare citate duble deloc? De exemplu, atunci când vrem să folosim specialimwills (\\ n, \\ r, etc.), dar puțin mai târziu despre ei.

De asemenea, merită remarcat faptul că utilizarea citate unice + concatenare Face codul mult mai ușor de citit decât dacă totul este fără a pavaja citate duale. Dar destul de prefabricate, acum veți vedea totul și înțelegeți:

Numărul $ \u003d 2; // Integer $ Hand1 \u003d "Numărul de mâini la om:"; // string + face persoana pentru variabile $ hand2 \u003d "mâini umane:"; // șir
// Adăugați un număr variabil $ la aceste linii: $ 15 \u003d "Numărul de mâini la om: numărul $ și încă text ..."; // nu recomandăm $2 \u003d "Numărul de mâini într-o persoană:". $ Număr. "Și textul încă ..."; // recomandă!
echo $ Hand1, "
", $2;?\u003e

Rezultat:

Vom vorbi mai mult despre concatenare în următorul articol.

  • ea a primit o constantă NUL.
  • nu a fost încă atribuită nici un sens.
  • a fost eliminată folosind desfaceți ()

Studiul celorlalte tipuri de variabile în acest stadiu ar fi lipsit de sens. Cu restul tipurilor, ne vom ciocni și ne vom descurca cu un studiu mai profund al PHP.

Ecranul în PHP.

Și dacă nu vrem să obținem valoarea variabilei în linia noastră, dar dorim să scriem numărul literal $? Luați în considerare două opțiuni:

$ 15 \u003d "Numărul de mâini la om: \\ $ număr și text încă ..."; // nu recomandăm $2 \u003d "Numărul de mâini la om: $ număr și text încă ..."; // recomandă!
echo $ Hand1, "
", $2;?\u003e

Rezultat:

În prima versiune (cu citate duble), am folosit protecția unui simbol special al dolarului, astfel încât acest specialist să înceapă să aibă propriul scop special (desemnarea variabilelor) și sa transformat într-un semn ordinar de dolar.

În cea de-a doua variantă (cu citate unică), așa cum știți deja, interpretul PHP nu a încercat nici măcar să găsească variabile în linie și, prin urmare, screeningul nu a fost necesar.

Mori speciale în PHP.

Mai ales pentru cititorii blogului Site-ul. PE! Am pregătit o mică listă de caractere speciale în limba de programare PHP:

  • \\ N rândul nou
  • \\ r de întoarcere
  • Tabulare orizontală
  • \\\\ Reverse Skew Lampa (reacția)
  • \\ $ dolar semn
  • \\ "Citat dublu

Să ne uităm la lucrarea de specialiști din exemplul de \\ n - un specialist, ceea ce face ca traducerea la o linie nouă (ca intrare), dar browserele nu înțeleg (și nu ar trebui) să o ignore, dar rezultatul muncii sale poate Fiți vizualizați în pagina sursă a paginii:

eCHO $ \u200b\u200bREGULA "
", $ 2;

Rezultat:

Codul sursă (Ctrl + U):

Dacă pentru vizitatorii din browser, mixerul special nu este afișat în nici un fel, atunci care este sensul său?

În primul rând, cu ajutorul simbolurilor speciale și \\ n, în special, puteți forma în mod convenabil codul de pe pagină (ca în exemplul de mai sus).

În al doilea rând, poate fi utilizat, de exemplu, atunci când înregistrați într-un fișier pentru a efectua transferul (ENTER) și pentru a continua înregistrarea pe o linie nouă.

O alternativă la această formatare este.

Sintaxă Heredoc în PHP

Rezultat:

Codul sursă (Ctrl + U):

Rezultatul vorbește pentru el însuși, acum să vedem cum este aranjat totul:

  • Șirul începe cu trei paranteze de colț<<<, далее следует имя идентификатора.
  • Un șir cu identificatorul de deschidere (eticheta) în nici un caz nu trebuie să conțină după alte caractere, inclusiv un spațiu. Asta este, cu alte cuvinte, imediat după ce eticheta noastră trebuie să punemm, fără un spațiu, intrați imediat!
  • 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:
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ă spunem cumva baza noastră de date sau browser-ului, care este doar text, sunteți cu el, nu faceți nimic! Cu alte cuvinte, dorim să "ștergem" valorile speciale ale tuturor caracterelor speciale și cuvintele 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).

În directorul de expresii regulate, există o astfel de secțiune numită " Meta-simboluri (ecranate) "Asta este exact despre aceste simboluri meta (ele sunt numite și simboluri speciale) și vom vorbi în acest articol.

Simboluri speciale - Acestea sunt personajele care nu sunt litere sau numere. Adică, acestea sunt toate personajele, cu excepția literelor și numerelor.

Caracterele speciale sunt considerate a fi astfel de simboluri ca punct, asterisc, plus, semn de întrebare, grilă și altele.

După cum știm din articolele anterioare, unele personaje speciale au un rol special în expresii regulate. Adică, fiecare simbol special are un fel de performanță.

De exemplu, un punct înseamnă absolut orice caracter. Stelele sunt cuantificarea repetițiilor de la zero la infinit. În plus este, de asemenea, un cuantificator de repetări de la un la infinit. Simbolul imaginar ^ înseamnă începutul liniei, și semnul dolarului ($) capătul șirului. Apropo, simbolul dolarului este, de asemenea, un simbol imaginar. De asemenea, știm că simbolul ^ are un alt rol, dacă îl punem în paranteze pătrate. Am vorbit despre toate aceste valori în articolele anterioare.

În acest articol voi răspunde la întrebarea " Cum să utilizați caractere speciale în termeni regulați ".

Pentru a anula acest rol special, un simbol special în termeni regulați, este necesar scut. Astfel, acest personaj special va reprezenta exact acel simbol care este. Asta este, punctul ecranat înseamnă punctul și nu orice caracter. Stele ecranate, înseamnă standul, și nu cuantificatorul repetițiilor.

Ecranul Făcute de inversul stupid. Adică, pentru a proteja un simbol special, trebuie să puneți în fața lui, reacția.

Să presupunem că avem o astfel de sarcină "Verificați dacă punctul este setat la sfârșitul liniei." Deci, pentru ca acest punct în expresie regulată, este exact un punct și nu prin niciun alt simbol, este necesar să o protejați.

Var Str \u003d "El este un erou". var reg \u003d /. *. $ /; Alertă (Reg.Test (str)); // adevărat

După cum vedem, rezultatul verificării liniei de respectare a expresiei regulate este adevărat. Dacă eliminăm punctul de la sfârșitul liniei, rezultatul va fi deja fals.

În mod similar, sunt protejate și alte caractere speciale.

Var s str \u003d "x + y \u003d .n * m \u003d /, co \\\\ la"; var reg \u003d / x \\ + y \u003d \\. n \\ * m \u003d \\ / co \\\\ la / Alertă (Reg.Test (str)); // adevărat

Aici avem simboluri ecranate plus (\\ +), puncte (\\.), Stele (\\ *), stratul obișnuit (/ /) și stratul invers (\\\\\\). Rețineți că stratul invers în rând este scris de două lovituri inverse. Și este protejat în expresie regulată, de asemenea cu ajutorul a două straturi inverse.

Dacă folosim alertă, scoateți șirul de la variabila Str, apoi în loc de două plăci inverse vom vedea doar unul.

În mod similar, toate caracterele specificate în director sunt ecranate în secțiunea Meta-simboluri.

Și, poate, totul. Din acest articol mic, știi deja cum să protejați caracterele speciale Și cum să le folosiți în pregătirea expresiilor regulate.

Sarcini

  1. Să presupunem că trebuie să verificăm conformitatea, un șir "am câștigat 400 de dolari." Scrieți o expresie regulată care a verificat prezența unui simbol al dolarului la capătul șirului. Verificați șirul pentru conformare.