internet Okná Android
Rozbaľovať

Skríning znakov. Aké špeciálne znaky by mali byť chránené v regulárnych výrazoch? Čo je tienenie v html

Zvyčajne programovacie jazyky, textové rozhrania, označenie textu, jazyky označenia textu (HTML, TEX, WIKI-Markup) sú riešené štruktúrovaným textom, v ktorom sa používajú niektoré znaky (a kombinácie) manažérvrátane kontrolnej štruktúry textu. V situácii, keď je potrebné použiť takýto symbol ako "konvenčný jazykový symbol" tienenie.

Podmienečne tienenie môže byť rozdelené do troch typov:

  • single Symbol tienenie
  • skríning skupiny znakov pomocou sekvencie "Spustiť tienenie", "Dokončiť tienenie"
  • pomocou príkazovej sekvencie "Spustite tienenie" a symbol "Koniec tienenia", ktorý je nastavený na začiatok tieneného textu.

Nedostatok tienenia ako príčina zraniteľnosti

Symbol tienenie priťahuje osobitnú pozornosť, keď je štruktúrovaný text generovaný automaticky. Zahrnutie ľubovoľných údajov reťazcov zahŕňa povinné tienenie kontrolných znakov v nich. Súčasne, veľmi často, skutočné riadky takýchto znakov neobsahujú, čo umožňuje programátorovi túto operáciu vôbec preskočiť a prijímať jednoduchší program, ktorý je správne pracujúci s "akékoľvek rozumné" reťazcové údaje. Takýto zjednodušený kód má však skrytú zraniteľnosť, pretože osoba tretej strany (autor reťazcov údajov) dostáva neoprávnenú možnosť ovplyvniť konštrukcia Generovaný text. Zraniteľnosť sa stáva vážnym, ak je vytvorený text je niekto program. Tradične sú takéto problémy podliehajú jazykom SQL (pozri SQL-injekciu) a HTML (pozri skriptovanie SCRS SCRS).

Príklady

Single Symbol tienenie

  • V programovacom jazyku SI vo vnútri riadkov sa skríning znakov vykonáva pomocou symbolu "" umiestnené pred tieneným symbolom. (Súčasne sa systém "" symbol môže nasadiť, to znamená, že kombinácia ") sa používa na výstup bexlesh), rovnaký symbol sa používa na štít znakov v príkazovom riadku UNIX.
  • V príkazovom riadku Microsoft Windows je premietanie znakovej časti znakov vykonávať pomocou symbolu "^" umiestnený pred tieneným symbolom.

Ochranná skupina symbolov

  • V programovacom jazyku Python sa vyrába skríning symbolovej skupiny v reťazci indikuje písmeno r (z angličtiny. RAO - RAO) pred reťazcom, t.j. znaky sú tienené sekvenciami r "tienený text "
  • Wiki-Markup Textové tienenie sa vykonáva s pomocou Pseudo a . Ak potrebujete písať pseudoteg sám , Toto sa vykonáva zo symbolov substitúcie ( ).

Ochranný text s konečným symbolom

Keď existuje mnoho kontrolných znakov v texte, bude veľa ochranných značiek, text sa stáva ťažkým. V takýchto prípadoch sa používa alternatívna metóda tienenia - s konečným textom. V tomto prípade budú všetky ovládacie znaky symboly (nenesú riadiacu funkciu) a text končí, keď kompilátor zistí určitú sekvenciu - konečný text.

Ak chcete pochopiť, kedy a čo sa vyhnúť bez pokusov, musíte presne pochopiť reťazec kontextov, cez ktoré prechádza reťazec. Určíte reťazec z najdlhšej strany do svojho konečného cieľa, čo je pamäť spracovávaná regulárnym kódom syntaktickej analýzy.

Pamätajte si, ako je reťazec spracovaný v pamäti: ak to môže byť jednoduchý riadok vo vnútri kódu alebo reťazec zadaného do príkazového riadku, ale môže to byť buď interaktívny príkazový riadok alebo príkazový riadok uvedený v súbore shell skriptu, alebo Vnútri premennej pamäte uvedenej kódom, alebo (reťazec) argumentom s ďalším hodnotením alebo reťazcom obsahujúcim kód generovaný dynamicky s akoukoľvek enkapsuláciou ...

Každý z tohto kontextu je pridelený niekoľko znakov so špeciálnou funkčnosťou.

Ak chcete symbol, doslova, bez použitia svojej špeciálnej funkcie (lokálne pre kontext), potom v tomto prípade ho musíte ochrániť na ďalší kontext ..., ktorý môže potrebovať iné únikové znaky, ktoré môžu byť potrebné navyše utiecť Predchádzajúci kontext (OH). Okrem toho, môžu byť veci, ako je symbol kódovanie (najkrajší je UTF-8, pretože vyzerá ako ASCII pre bežné symboly, ale môže byť dodatočne interpretovaný aj v termináli v závislosti od jeho nastavení, takže sa môže správať odlišne, Atribút kódovania HTML / XML je potrebný na správne pochopenie procesu.

Napríklad regulárny výraz na príkazovom riadku, počnúc perlom -NPE, musí byť prenesený na nastavenie hovoru Exec System Pripojenie ako kanál, ktorý spracováva súbor, každý z týchto hovorov systému, jednoducho má zoznam argumentov, ktoré boli oddelené (nie sú tienené) medzery a možno kanály (|) a presmerovanie (\u003e n\u003e n\u003e & m), držiaky, interaktívne rozšírenie * a? , $ (()) ... (všetky tieto sú špeciálne znaky používané * SH, ktoré sa môžu zdať zasahovanie s regulárnym symbolom expresie v nasledujúcom kontexte, ale odhadujú sa v poriadku: pred príkazovým riadkom. Prečítajte si program AS BASH / SH / CSH / TCSH / ZSH, v podstate vo vnútri dvojitej ponuky bunky alebo jednosmernej citácie, tienenie je jednoduchšie, ale nie je potrebné, aby sa riadok v príkazovom riadku v príkazovom riadku, pretože väčšinou Priestor musí začínať s reverzným čerpeným funkciou a citáciou, nie je potrebné, zanechať funkčnosť zverejnenia znakov * a?, Ale analyzuje rovnaký kontext ako v citácii. Potom pri hodnotení príkazového riadku, regulárny výraz získaný v pamäti (Nie je zaznamenané na príkazovom riadku) prijíma rovnaké spracovanie ako v zdrojovom súbore. Pre regulárny výraz v hranatých zátvorkách je symbol nastavený kontext, pravidelný perl expresia môže byť uzavretý vo veľkom množine ne-alfanumerických znakov (napríklad m // il a m: / lepšia / pre / cesta: ...).

Máte viac informácií o znakoch v inej reakcii, ktoré sú veľmi špecifické pre konečný kontext pravidelného výrazu. Ako som už poznamenal, spomeniete sa, že zistíte, že Regexp sa resetuje s pokusmi, čo je pravdepodobne spôsobené tým, že iný kontext má ďalšiu sadu znakov, ktoré nakonfigurovali vašu pamäť o pokusoch (často reverzná lomka je symbolom používaný symbolom kontext na tienenie doslovného symbolu namiesto jeho funkcie.).

Poznámka: Adaptívna verzia stránky je aktivovaná, ktorá sa automaticky prispôsobuje malej veľkosti vášho prehliadača a skryje niektoré detaily stránky na čítanie. Šťastné sledovanie!

Som rád, že opäť vítam všetkých na stránkach blogu venovaných všetkým zložitým spôsobom úspešného vytvárania a propagácie stránok - Miesto. Na! V dnešnej lekcii PHP sa dotkneme tém, ako sú: typy premenných, tienenie, špecialimov, ako aj syntaxe Heredoc v PHP.

Typy premenných

PHP má osem rôznych typov premenných, z ktorých

4 Skarové typy:

  • boolean (boolean alebo logický typ)
  • integer (celé čísla)
  • float (číslo plávajúceho bodu)
  • reťazec

2 zmiešané typy:

  • array (pole)
  • objekt (objekt)

2 špeciálne typy:

  • zdroj.

Predtým, ako bude pokračovať v posudzovaní každého typu podrobnejšie, stojí za to objasniť, že PHP nie je striktne napísaný jazyk, ale jazyk s dynamickým písaním. To znamená, že vopred nepotrebujeme (pri vytváraní) vyhlasujeme typ každej premennej. PHP samotný odhad, ktorý typ jednej alebo inej premennej, na základe skutočnosti, že sme v tejto premennej. To tiež znamená, že na rozdiel od jazykov s prísnymi typizáciami môžeme v premennej s číslom (celého čísla) vziať a dať reťazec (reťazec) a nebude to chyba! Toto je jedna z funkcií PHP, ktorá je veľmi podobná ľuďom (nováčikom), predtým nezaoberajúci programovaním. Spravidla, nakoniec, každý príde na skutočnosť, že je to mínus jazyk a nie plus.

Boolean (logické) - najjednoduchší typ. Môže trvať iba 2 hodnoty: pravda. alebo falošný (Vpravo alebo zlé), sú registrované nezávislé (môžete napísať TRUE, TRUE a tak ďalej.). Vizuálny príklad:

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

Výsledok:

Ako vidíte, prehliadač nerozumie boolean typu, na rozdiel od PHP, takže keď sa snaží odvodiť pravda. alebo falošný Zobrazí číslo 1 alebo prázdny reťazec.

Pri konverzii na logickom type sa nasledujúce hodnoty považujú za nepravdivé:

  • celé 0 (nula)
  • plávajúci bod 0,0 (nula)
  • prázdny reťazec a reťazec "0" alebo "0"
  • prázdne pole
  • Špeciálny typ NULL (vrátane neidentifikovaných premenných)

Všetky ostatné hodnoty sa považujú za pravdivé.

// desatinné číslo $ INT \u003d -5; // záporné číslo $ Int \u003d 05; // Octal číslo $ int \u003d 0x1a; // hexadecimálne číslo
// Čísla plávajúcich bodov (skutočné): $ Flt \u003d 1,4; $ Flt \u003d 1,2E3; $ Flt \u003d 7E-10; ?\u003e

Najčastejšie používaný typ v PHP sa však môže zvážiť struny (reťazec). Riadky môžu byť zaznamenané buď v jednotlivých alebo dvojnásobných úvodzovkách, ale nikdy vám neodporúčam, aby ste zapisovali čiary v dvojitých úvodzoch, ako si vyrábate php tlmočník "PURO" váš reťazec pre prítomnosť premenných v ňom, ale aj mierne, ale pomaly práce. Aj keď chcete použiť premenné vo vašom riadku - to možno vykonať pomocou jednoduchých úvodzoviek + (lepenie dvoch alebo viacerých riadkov v jednom). Prečo sú vôbec potrebné dvojité úvodzovky? Napríklad, keď chceme použiť Compeciamwills (N, atď.), Ale o niečo neskôr.

Treba tiež zaznamenať, že použitie jednotné úvodzovky + zreťazenie Robí kód oveľa čitateľnejší, ako keby bolo všetko bez dlažieb duálnych citácií. Ale dosť prefačeho, teraz uvidíte všetko sami a pochopíte:

$ Číslo \u003d 2; // Integer $ hand1 \u003d "počet rúk u ľudí:"; // String + Make Osoba pre premenné $ hand2 \u003d "ľudské ruky:"; // reťazec
// Pridajte k týmto riadkom variabilné $: $ hand1 \u003d "počet rúk u ľudí: $ číslo a stále text ..."; // Neporučte $ hand2 \u003d "počet rúk v osobe:". $ Číslo. "A stále text ..."; // Odporučiť!
echo $ hand1, "
", $ hand2;?\u003e

Výsledok:

Budeme hovoriť viac o zreťazení v nasledujúcom článku.

  • bola pridelená konštanta NULOVÝ.
  • ešte nebola pridelená žiadny význam.
  • bol odstránený pomocou ()

Štúdium zostávajúcich typov premenných v tomto štádiu by bolo zmyselné. S ostatnými typmi, budeme ich zraziť a rozoznať hlbšiu štúdiu PHP.

Tienenie v PHP.

A čo ak nechceme dostať hodnotu premennej v našej linke, ale chceme písať doslova $ číslo? Zvážte dve možnosti:

$ hand1 \u003d "počet rúk u ľudí: $ číslo a stále text ..."; // neodporúčam $ hand2 \u003d "počet rúk u ľudí: $ číslo a stále text ..."; // Odporučiť!
echo $ hand1, "
", $ hand2;?\u003e

Výsledok:

V prvej verzii (s dvojitými citáciami) sme použili tienenie špeciálneho symbolu dolára, takže tento špecialista prestal mať svoj vlastný špeciálny účel (označenie premenných) a premenil sa na obyčajný znak dolára.

V druhom variante (s jednoduchými citáciami), ako už viete - PHP tlmočník ani sa nepokúšal nájsť premenné v riadku, a preto sa skríning nevyžadoval.

Špeciálne mlyny v PHP.

Najmä pre čitateľov blogu Miesto. Na! Pripravil som malý zoznam špeciálnych znakov v programovacom jazyku PHP:

  • N nový riadok
  • r návratu
  • M Horizontálna tabuľka
  • reverzný šikmý sakra (baclash)
  • $ dollar znamenie
  • "Dvojitá citácia

Pozrime sa na prácu Špecializmov na príklad n - špecialistu, ktorý robí preklad na nový riadok (ako vstup), ale prehliadače nerozumejú (a nemali by) ignorovať, ale výsledok jeho práce Pozrite sa na zdrojovej stránke stránky:

echo $ pravidlo, "
", $ pravidlo2;?\u003e

Výsledok:

Zdrojový kód (CTRL + U):

Ak pre návštevníkov v prehliadači, špeciálny mixér sa nezobrazuje žiadnym spôsobom, čo je jeho význam?

Po prvé, s pomocou špeciálnych symbolov a najmä, môžete pohodlne naformátovať kód na stránke (ako v uvedenom príklade).

Po druhé, môže byť použitý, napríklad pri nahrávaní do súboru, aby sa prenos (ENTER) a pokračoval v nahrávaní na novom riadku.

Alternatívou k tomuto formátovaniu je.

Heredoc syntax v PHP

Výsledok:

Zdrojový kód (CTRL + U):

Výsledok hovorí o seba, teraz pozrime, ako je všetko usporiadané:

  • String začína tromi rohovými konzolami<<<, далее следует имя идентификатора.
  • Reťazec s identifikátorom otvárania (štítok) v žiadnom prípade by nemala obsahovať akékoľvek iné znaky vrátane priestoru. To znamená, že inými slovami, bezprostredne po našom štítku musíme dať vstup, bez priestoru, okamžite zadajte!
  • Prevod
  • Návod

SQL injekcie, falošné cross-line požiadavky, poškodené XML ... desivé, hrozné veci, z ktorých všetci by sme chceli chrániť, ale len vedieť, prečo sa to všetko stane. Tento článok vysvetľuje základnú koncepciu za všetkým: riadky a spracovanie riadkov vo vnútri riadkov.

Hlavný problém

Toto je len text. Áno, len text - Tu je hlavným problémom. Takmer všetko v počítačovom systéme je reprezentované textom (ktorý je zase reprezentovaný bodumi). Je to, že niektoré texty sú určené pre počítač a iné pre ľudí. Ale tí a tí stále zostávajú text. Chápať, o čom hovorím, budem dať malý príklad:
Homo sapiens. Predpokladajme, že existuje anglický text, ktorý nechcem preložiť do ruštiny

Neverte tomu: Je to text. Niektorí ľudia to nazývajú xml, ale je to len text. Možno nie je vhodné pre zobrazenie učiteľa angličtiny, ale je to stále len text. Môžete ho vytlačiť na plagáte a chodiť s ním k zhromaždeniu, môžete ho napísať v písmene vašej matke ... Toto je text.

Chceme však, aby určité časti tohto textu mali určitú hodnotu pre náš počítač. Chceme, aby počítač mohol extrahovať autora textu a samotného textu samostatne, aby ste s ním mohli urobiť. Napríklad konvertujte vyššie uvedené:
Predpokladajme, že existuje anglický text, ktorý som nechcel preložiť do ruštiny homo sapiens
Kde je počítač vedieť, ako to urobiť? No, pretože sme vysoko zabalime určité časti textu so špeciálnymi slovami v zábavných zátvorkách, ako napríklad a. Keďže sme to urobili, môžeme napísať program, ktorý by vyhľadal tieto určité časti, odstránila text a použil by ho pre akýkoľvek vlastný vynález.

Inými slovami, použili sme určité pravidlá v našom texte na identifikáciu určitého osobitného významu, že niekto, pozorovanie rovnakých pravidiel, by mohlo použiť.
Dobre, nie je to tak ťažké pochopiť. A čo ak chceme použiť tieto vtipné zátvorky, ktoré sú nejakým špeciálnym významom v našom texte, ale bez použitia tohto veľmi zmyslu? .. niečo také:

Homo sapiens. < n and y >

Symboly "<" и ">"Nie sú výnimočne. Môžu byť legálne používané kdekoľvek, v akomkoľvek texte, ako je to v tomto príklade. Ale ako je naša myšlienka o špeciálnych slovách, ako je? Znamená to, čo je nejaký druh kľúčového slova? V XML - možno Áno. A možno nie. Je to nejednoznačné. Vzhľadom k tomu, počítače sa nedotýkajú nejednoznačnostiam, potom niečo ako výsledok môže poskytnúť nepredvídaný výsledok, ak nezasahujeme do všetkých bodov nad i a neodstránime nejednoznačnosť.
Môžete vyriešiť túto dilemu, nahradiť nejednoznačné symboly niečoho jednoznačného.
Homo sapiens. Základná matematika nám hovorí, že ak x< n and y > N, x nemôže byť väčšie ako Y.

Teraz by mal byť text úplne jednoznačný. "<" равносильно "<", а ">" - ">".
Technická definícia tohto - tienenie , Vyhýbame sa špeciálnym symbolom, keď nechceme, aby mali svoj osobitný význam.
Escape | Iskāp | [No obj. ] Break zadarmo [s obj. ] Nezabudnite / nepamätajte si [...] [s obj. ] IT: príčina je interpretovaná inak [...]
Ak určité znaky alebo sekvencie znakov v texte majú mimoriadny význam, musia existovať pravidlá, ktoré určujú, ako vyriešiť situácie, keď by sa tieto znaky mali používať bez prilákania ich osobitného významu. Alebo inými slovami, tienenie odpovedá na otázku: "Ak sú tieto znaky také zvláštne, potom ako by som ich mal použiť vo vašom texte?".
Ako bolo možné upozorniť v príklade vyššie, AMPERSAnd (&) je tiež špeciálny symbol. Ale čo robiť, ak chceme písať "<", но без интерпретации этого как "<"? В XML, escape-последовательность для &, это - " & ", т.е. мы должны написать: " &< "

Ďalšie príklady

XML nie je jediným prípadom "utrpenia" zo špeciálnych znakov. Akýkoľvek zdrojový kód v akomkoľvek programovacom jazyku ho môže preukázať:
Var name \u003d "homo sapiens"; Valec obsahu \u003d "Predpokladajme, že existuje anglický text, ktorý by som nechcel prekladať do ruštiny";
Všetko je jednoduché - obvyklý text je jasne oddelený od "nie textu" dvojité úvodzovky. Rovnakým spôsobom je možné použiť môj text z kurzu matematického analýzy:
Var name \u003d "homo sapiens"; Var Contents \u003d "Základná matematika nám hovorí, že ak x< n and y > N, x nemôže byť väčšie ako Y. ";
COOL! A nie sú ani nemusíte uchýliť sa k tienianiu! Ale počkaj, a čo ak chcem niekoho citovať?
Var name \u003d "homo sapiens"; Var Obsah \u003d "Plato sa hovorí, že raz povedal" Lorem Ipsum Dolor Sit Amet ".";
Hmm ... smútok, túžba. Ako človek, môžete určiť, kde sa text začína a končí a kde sa nachádza cenová ponuka. Avšak, to sa opäť stal nejednoznačný pre akýkoľvek počítač. Musíme prísť s nejakým druhom tienenia pravidiel, ktoré by nám pomohli rozlišovať s doslovným "a", čo znamená koniec textu. Väčšina jazykov Programovanie používajte šikmé funkcie:
Var name \u003d "homo sapiens"; Val obsah \u003d "Plato sa hovorí, že raz povedali" Lorem Ipsum Dolor Sit Amet ".";
"" robí symbol po nie je výnimočný. Ale toto, to znamená, že "" je špeciálny symbol. Pre jednoznačné písanie tohto symbolu v texte musíte k nemu pridať rovnaký symbol tým, že píše: "". Funny, však?

Útok!

Nie všetko by bolo tak zlé, keby sa museli uchýliť k tieniu. Kmene samozrejme, ale nie je to tak hrozné. Problémy Začiatok, keď niektoré programy napíšu text pre iné programy na "čítať". A nie, to nie je vedecká fikcia, stane sa to neustále. Napríklad na tejto stránke, publikujete správu, nevytočte ju do manuálu vo formáte HTML a napíšte len text, ktorý je v dôsledku toho konvertovaný touto stránkou v HTML, po ktorom prehliadač už konvertuje " generované "HTML opäť v čitateľnom texte.

Ďalší spoločný príklad a zdroj mnohých bezpečnostných problémov - požiadavky SQL. SQL - jazyk určený na zjednodušenie komunikácie s databázami:
V tomto texte sú prakticky žiadne špeciálne znaky, väčšinou anglické slová. A napriek tomu, v skutočnosti, každé slovo v SQL má osobitný význam. Používa sa v mnohých programovacích jazykoch po celom svete v jednej forme alebo inom, napríklad:
$ downder \u003d "Select Telefón_Number od užívateľov, kde meno \u003d" Alex "; $ výsledok \u003d mysql_query ($ dotaz);
Tieto dva jednoduché linky od nás abstrujú strašne zložitú úlohu žiadosti o databázový program, ktorý spĺňa naše požiadavky. Databáza "Sieves", prípadne terabajty bitov a bajtov na vrátenie krásne formátovaného výsledku programu, ktorý urobil žiadosť. Vážne, všetko toto kecy je zapuzdrené v jednoduchom Anglovom návrhu.

Aby bolo možné užitočné, tieto požiadavky nie sú tvrdé kódy, ale sú postavené na základe vstupu používateľa. Toto je návrh zameraný na používanie rôznych používateľov:
$ NAME \u003d $ _POST ["NAME"]; $ downder \u003d "Select Telefón_Number od užívateľov, kde názov \u003d" $ name ""; $ výsledok \u003d mysql_query ($ dotaz);
V prípade, že ste si tento článok jednoducho zobrazoval: Toto je anti-príklad! Toto je najhoršie, čo ste kedy mohli urobiť! Toto je bezpečnostná nočná mora! Zakaždým, keď napíšete niečo také, zomrie jeden nevinný mačiatko! KTULHU BEZPLATNOSTI VAŠEJ DUŠE!

A teraz pozrime, čo sa tu stane. $ _POST ["NAME"] - hodnota, ktorú náhodný používateľ zadal do náhodného formulára na vašej náhodne. Váš program bude vybudovať dotaz SQL, ktorý používa túto hodnotu ako používateľské meno, ktoré chcete nájsť v databáze. Potom sa táto ponuka SQL "posiela priamo do databázy.

Zdá sa, že všetko znie nie tak hrozné, áno? Poďme sa pokúsiť zadať niekoľko náhodných hodnôt, ktoré možno zadať na vašej náhodnej stránke a aké požiadavky z toho sa ukážu:

Alex.
Vyberte Telefónne číslo od používateľov, kde názov \u003d "Alex"
MC "DONALDS.
Vyberte položku Phone_Names od používateľov, kde názov \u003d "MC" Donalds "
Joe ";
Vyberte položku Phonel_number od používateľov, kde názov \u003d "Joe"; Používatelia stola; - "
Prvá žiadosť nevyzerá desivé, ale dosť pekné, že? Číslo 2, zdá sa, "trochu" poškodzuje našu syntax kvôli nejednoznačným. "Sakram nemecká! Číslo 4 nejaký hlúpy. Kto by to napísal? Nie je to zmysel ...
Ale nie pre požiadavku na spracovanie databázy ... Databáza nemá nič, odkiaľ táto žiadosť prišla, a čo by mal znamenať. Jediná vec, ktorú vidí, je dva požiadavky: nájsť užívateľské číslo menom Joe a potom odstrániť tabuľku používateľov (čo je sprevádzané komentárom ") a bude úspešne vykonaná.

Pre teba by to nemalo byť novinky. Ak áno, potom prosím, prečítajte si tento článok, pretože ste buď nováčik v programovaní, alebo posledných 10 rokov žije v jaskyni. Tento príklad ilustruje základy injekcie SQL používané po celom svete. S cieľom odstrániť údaje alebo získať údaje, ktoré by sa nemali jednoducho získať, alebo prihlásiť, bez toho, aby ste mali práva, atď. A všetko, pretože databáza vníma anglo-ako "vetu" príliš doslova.

OOOOEEEEE!

Ďalší krok: XSS útoky. Pôsobia rovnakým spôsobom, platia len pre HTML.
Predpokladajme, že ste sa rozhodli problémy s databázou, prijímať údaje od užívateľa, zapíšte do databázy a výstup na webovú stránku, na prístup k používateľom. To je to, čo robí typické fórum, komentár systém atď. Niekde na vašich stránkach je niečo také:

Pridané. Na.


Ak sú vaši používatelia dobrí a láskaví, umiestnia citácie starých filozofov a správy budú mať o nasledujúcom type:

Poslal Plato 21. januára 15:31

Hovoril som, že povedal, že "Lorem ipsum dolista Sit Amet, Concentretur Adipisicing Elit, Sed Do Esiusmod Domčeka MAGNA ALILESKA. UT ENIM AD MINIMA MINIOSTI ALILESKA.


Ak sú používatelia chytré, pravdepodobne budú hovoriť o matematike, a tam budú takéto správy:

Zaslal Pascal 23. novembra, 04:12

Základná matematika nám hovorí, že ak x< n and y > N, x nemôže byť väčšie ako Y.


Hmm ... opäť tieto predvolené nastavenia našich zátvoriek. No, z technického hľadiska, môžu byť nejednoznačné, ale prehliadač nám to odpúšťa?


No, zastavte, čo peklo? Čo Joker predstavila JavaScript Tagy na vaše fórum? Každý, kto sa pozerá na túto správu na vašich stránkach, teraz načítava a vykoná skripty v kontexte vašich stránok, ktoré nemôže mať novinky. A to nie je dobré.

Nerozumiete doslova

Vo vyššie uvedených prípadoch chceme nejako informovať našu databázu alebo prehliadač, že je to len text, nič s ním! Inými slovami, chceme "odstrániť" špeciálne hodnoty všetkých špeciálnych znakov a kľúčových slov z akýchkoľvek informácií poskytnutých užívateľom, pretože mu neveríme. Čo robiť?

Čo? Čo hovoríte, chlapec? Oh, hovoríte "tienenie"? A ste absolútne správne, vezmite si cookie!
Ak aplikujeme tienenie na používateľské údaje pred ich kombináciou s požiadavkou, problém je vyriešený. Pre naše požiadavky databázy to bude niečo podobné:
$ NAME \u003d $ _POST ["NAME"]; $ NAME \u003d MYSQL_REAL_SECAPE_STRING ($ NAME); $ downder \u003d "Select Telefón_Number od užívateľov, kde názov \u003d" $ name ""; $ výsledok \u003d mysql_query ($ dotaz);
Len jedna línia kódu, ale teraz nikto iný nemôže "hack" naša databáza. Pozrime sa znova, ako sa požiadavky SQL pozerá, v závislosti od zadania používateľa:
Alex.
Vyberte Telefónne číslo od používateľov, kde názov \u003d "Alex"
MC "DONALDS.
Vyberte Telefónne číslo od používateľov, kde názov \u003d "MC" Donalds "
Joe ";
Vyberte položku Phone_Names od používateľov, kde názov \u003d "Joe"; Používatelia stola; - "
MySQL_REAL_SECAPE_STRING bez analýzy miest šikmého línia pred všetkým, čo môže byť nejaký špeciálny význam.


Používame funkciu HTMLPECIALARS na všetky používateľské údaje, predtým, než ich odložíte. Teraz vyzerá správa škodcov:

Zaslal Jacktr 18. júla, 12:56


Upozorňujeme, že hodnoty prijaté od užívateľov nie sú naozaj "poškodené". Akýkoľvek prehliadač Parsit to je ako HTML a zobrazuje všetko v správnom formulári.

Čo nás privádza späť do ...

Všetky vyššie uvedené demonštruje problémovú charakteristiku mnohých systémov: text v texte by mal byť chránený, ak sa predpokladá, že by nemalo mať špeciálne znaky. Umiestnenie textových hodnôt v SQL, musia byť tienené pravidlami SQL. Umiestnenie textových hodnôt do HTML, musia byť tienené pravidlami HTML. Umiestnením textových hodnôt do (technológie) musia byť tienené pravidlami (technologický názov). To je všetko.

Pre úplný obrázok

Samozrejme, iné spôsoby, ako bojovať proti vynálezcom užívateľov, ktoré by mali alebo nemali obsahovať špeciálne znaky:
  • Validácie.
    Môžete skontrolovať, či prihláška používateľa zodpovedá určitej špecifikácii. Ak potrebujete vstup čísla, a užívateľ vstupuje na niečo iné, program ho musí o tom informovať a zrušiť vstup. Ak je to všetko riadne organizované, potom neexistuje riziko, že chcú chytiť "Drop Table Table", kde sa predpokladalo, užívateľ predstaví "42". Toto nie je veľmi praktické, aby sa zabránilo injekciám HTML / SQL, pretože Často je potrebné prijať text voľného formátu, ktorý môže obsahovať "túru". Okrem iných opatrení sa zvyčajne používa validácia.
  • Dezinfekčný
    Môžete tiež "vlhčiť" na odstránenie všetkých znakov, ktoré považujete za nebezpečné. Jednoducho odstráňte niečo podobné značke HTML, ktoré sa vyhýbajú pridaniu do vášho fóra. Problém je, že môžete odstrániť celkom legitímne časti textu.
    Pripravené príkazy SQL
    Existujú špeciálne funkcie, ktoré urobia niečo, čo sme dosiahli: nútenie databázy pochopiť rozdiely medzi požiadavkou SQL a informáciami poskytnutých užívateľmi. V RNR vyzerajú takto:
    $ STMT \u003d $ CHOP-\u003e Pripravte ("Select Phone_Number od užívateľov, kde názov \u003d?"); $ STMT-\u003e Execute ($ _ príspevok ["Name"]);
    Zároveň vystupuje v dvoch etapách, čo jasne rozlišuje požiadavku a premenné. Databáza má schopnosť najprv pochopiť štruktúru dotazov a potom ho vyplniť hodnotou.

  • V reálnom svete sa toto všetko používa spoločne pre rôzne kroky ochrany. Vždy musíte použiť kontrolu overovania (validácia), aby ste si boli istí, že používateľ zadá správne údaje. Potom môžete (ale nie je povinné) skenovať zadané údaje. Ak sa užívateľ jasne snaží "riadiť" skript pre vás, môžete ho jednoducho odstrániť. Potom vždy musíte vždy ochrániť vlastné údaje pred ich umiestnením do dotazu SQL (to isté platí pre HTML).

V adresári o registračných výrazoch je taká sekcia s názvom " Meta-symboly (tienené) ". To je presne na týchto metach symboloch (nazývajú sa aj špeciálne symboly) a budeme hovoriť v tomto článku.

Špeciálne symboly - Toto sú znaky, ktoré nie sú písmenámi alebo číslami. To znamená, že sú to všetky znaky okrem písmen a číslic.

Špeciálne znaky sa považujú za takéto symboly ako bod, hviezdičku, plus, otázniku, mriežku a ďalšie.

Ako vieme z predchádzajúcich článkov, niektoré špeciálne znaky majú osobitnú úlohu v regulovaných výrazoch. To znamená, že každý špeciálny symbol má nejaký druh výkonu.

Napríklad bod znamená absolútne akýkoľvek charakter. Hviezdy sú kvantizátorom opakovania z nuly do nekonečna. Plus je tiež kvantizátor opakovania z jedného do nekonečna. Imaginárny symbol ^ znamená začiatok riadku a znamenie dolára ($) koniec reťazca. Mimochodom, symbol dolára je tiež imaginárnym symbolom. Tiež vieme, že symbol ^ má inú úlohu, ak ju vložíme do štvorcových zátvoriek. Hovorili sme o všetkých týchto hodnotách v predchádzajúcich článkoch.

V tomto článku odpoviem na otázku " Ako používať špeciálne znaky pravidelne ".

S cieľom zrušiť túto konkrétnu úlohu, v pravidelných podmienkach, je to potrebné štít. Tento špeciálny znak teda bude presne reprezentovať tento symbol, ktorý je. To znamená, že tienený bod znamená bod, a nie žiadny znak. Tienené hviezdy, znamená stánok a nie kvantifikátor opakovania.

Tienenie Urobil opačne hlúpy. To znamená, že na to, aby ste ochránili nejaký špeciálny symbol, musíte pred ním pred ním umiestniť späť.

Predpokladajme, že máme takúto úlohu "Skontrolujte, či je bod nastavený na konci riadku." Takže v poriadku, aby tento bod v regulárnom vyjadrení, je to presne bod, a nie žiadny iný symbol, je potrebné ho chrániť.

Var str \u003d "On je hrdina."; var reg \u003d /. *. $ /; Upozornenie (reg.test (str)); // pravda

Ako vidíme, výsledok kontroly riadku pre dodržiavanie pravidelného výrazu je pravdivý. Ak odstránime bod od konca riadku, výsledok bude už nepravdivý.

Podobne sú tienené aj iné špeciálne znaky.

Var str \u003d "x + y \u003d .n * m \u003d /, co la"; var reg \u003d / x + y \u003d n * m \u003d / co \\ _; Upozornenie (reg.test (str)); // pravda

Tu máme tienené symboly plus (+), body (), hviezdy (*), obvyklá vrstva (/ /) a reverzná vrstva (). Upozorňujeme, že reverzná vrstva v rade je napísaná dvoma spätnými ťahmi. A je chránený v regulárnom výraze, a to aj pomocou dvoch reverzných vrstiev.

Ak používame upozornenie, stiahnite reťazec z premennej Strovej, potom namiesto dvoch opačných dosiek uvidíme len jeden.

Podobne sú všetky znaky uvedené v adresári tienené v sekcii Meta-Symboly.

A na tom, snáď, všetko. Z tohto malého článku, už viete ako štítovať špeciálne znaky A ako ich používať pri príprave regulárnych výrazov.

Úlohy

  1. Predpokladajme, že potrebujeme kontrolovať dodržiavanie, taký reťazec "Vyhral som 400 dolárov." Napíšte pravidelný výraz, ktorý skontroloval prítomnosť symbolu dolára na konci reťazca. Skontrolujte reťazec pre dodržiavanie predpisov.