Escapovanie regulárneho výrazu v PHP. Escapovanie (alebo to, čo potrebujete vedieť pre prácu s textom v texte) Špeciálne znaky v jednoduchých a dvojitých úvodzovkách

  • Preklad
  • Návod

SQL injekcie, falšovanie požiadaviek medzi stránkami, poškodené XML... Strašidelné, strašidelné veci, pred ktorými by sme chceli byť všetci chránení, no chceme len vedieť, prečo sa to všetko deje. Tento článok vysvetľuje základný koncept za tým všetkým: reťazce a manipulácia s reťazcami v reťazcoch.

Hlavný problém Je to len text. Áno, len text - to je hlavný problém. Takmer všetko v počítačovom systéme je reprezentované textom (ktorý je zas reprezentovaný bajtmi). Je možné, že niektoré texty sú určené pre počítače, zatiaľ čo iné sú určené pre ľudí. Oba však stále zostávajú textom. Aby ste pochopili, o čom hovorím, tu je malý príklad:
Homo Sapiens Predpokladajme, že existuje anglický text, ktorý nechcem prekladať do ruštiny
Neuveríte: toto je text. Niektorí to nazývajú XML, ale je to len text. Možno sa nehodí na ukazovanie učiteľovi angličtiny, ale stále je to len text. Môžete si to vytlačiť na plagát a ísť s tým na mítingy, môžete to napísať do listu mame... je to text.

Chceme však, aby určité časti tohto textu mali pre náš počítač nejaký význam. Chceme, aby počítač vedel extrahovať autora textu a samotný text oddelene, aby sme s tým mohli niečo urobiť. Napríklad preveďte vyššie uvedené na toto:
Predpokladajme, že existuje anglický text, ktorý nechcem prekladať do ruštiny od Homo Sapiens
Ako počítač vie, ako to urobiť? No pretože sme veľmi vhodne zabalili určité časti textu špeciálnymi slovami do vtipných zátvoriek, ako a. Keďže sme to urobili, môžeme napísať program, ktorý hľadá tieto špecifické časti, extrahuje text a použije ho na nejaký vlastný vynález.

Inými slovami, v našom texte sme použili určité pravidlá na označenie nejakého špeciálneho významu, ktorý by mohol použiť niekto iný podľa rovnakých pravidiel.
Dobre, toto nie je až také ťažké pochopiť. Čo ak chceme použiť tieto vtipné zátvorky, ktoré majú v našom texte nejaký špeciálny význam, ale bez toho, aby sme použili práve tento význam?... Niečo ako toto:
Homo Sapiens< n and y >
Znaky „“ nie sú ničím výnimočným. Môžu byť legálne použité kdekoľvek, v akomkoľvek texte, ako v príklade vyššie. Ale čo naša predstava o špeciálnych slovách, ako napríklad? Znamená to, že je to aj nejaký druh kľúčového slova? V XML - možno áno. Alebo možno nie. Toto je nejednoznačné. Keďže počítače nie sú veľmi dobré pri riešení nejednoznačností, niečo môže viesť k neočakávanému výsledku, ak si sami neoznačíme ja a nevyriešime nejednoznačnosti.
Túto dilemu možno vyriešiť nahradením nejednoznačných symbolov niečím jednoznačným.
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 toho je tienenie, unikáme špeciálnym znakom, keď nechceme, aby mali svoj vlastný špeciálny význam.
uniknúť |iˈskāp| [bez obj. ] oslobodiť sa [ s obj. ] nevšímať si / nepamätať [...] [ s obj. ] IT: dôvod na rozdielny výklad [...]
Ak majú určité znaky alebo sekvencie znakov v texte špeciálny význam, potom musia existovať pravidlá, ktoré špecifikujú, ako postupovať v situáciách, keď sa tieto znaky musia použiť bez toho, aby sa odvolával na ich špeciálny význam. Alebo, inými slovami, únik odpovedá na otázku: "Ak sú tieto symboly také zvláštne, ako ich môžem použiť vo svojom texte?".
Ako môžete vidieť v príklade vyššie, ampersand (&) je tiež špeciálny znak. Ale čo ak chceme napísať"


Ak sú vaši používatelia dobrí a láskaví, uverejnia citáty starých filozofov a správy budú vyzerať asi takto:

Uverejnil Platón 2. januára, 15:31

Hovorí sa, že som povedal: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut alisequip."


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

Uverejnil 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äť títo znesvätovatelia našich zátvoriek. No, z technického hľadiska sú možno nejednoznačné, ale to nám prehliadač odpustí, však?


Dobre, STOP, čo do pekla? Nejaký vtipálek zaviedol do vášho fóra javascriptové značky? Každý, kto si prezerá túto správu na vašom webe, teraz sťahuje a spúšťa skripty v kontexte vášho webu, ktoré môžu robiť, kto vie čo. A to nie je dobré.

Nebrať doslovne Vo vyššie uvedených prípadoch chceme nášmu DB alebo prehliadaču nejakým spôsobom povedať, že toto je len text, nič si z toho nerobte! Inými slovami, chceme „odstrániť“ špeciálne významy všetkých špeciálnych znakov a kľúčových slov z akýchkoľvek informácií poskytnutých používateľom, pretože mu neveríme. Čo robiť?

Čo? Čo to hovoríš, chlapče? Oh, hovoríš, "tienenie"? A máš úplnú pravdu, vezmi si koláčik!
Ak použijeme escapovanie na používateľské údaje pred ich zlúčením s dotazom, problém je vyriešený. Pre naše databázové dotazy to bude niečo ako:
$name = $_POST["meno"]; $name = mysql_real_escape_string($name); $query = "VYBERTE telefónne_číslo FROM užívateľov WHERE meno = "$meno""; $vysledok = mysql_query($dotaz);
Len jeden riadok kódu, ale teraz už nikto nemôže "hacknúť" našu databázu. Pozrime sa znova, ako budú vyzerať SQL dotazy v závislosti od vstupu používateľa:
Alex
SELECT phone_number FROM users WHERE name = "Alex"
Mc Donalds
SELECT phone_number FROM users WHERE name = "Mc\"Donalds"
Joe"; používatelia DROP TABLE; --
SELECT phone_number FROM users WHERE name = "Joe\"; používatelia DROP TABLE; --"
mysql_real_escape_string bez rozdielu umiestni lomku pred čokoľvek, čo by mohlo mať nejaký špeciálny význam.


Funkciu htmlspecialchars aplikujeme na všetky používateľské údaje pred ich výstupom. Správa škodcu teraz vyzerá takto:

Uverejnil JackTR 18. júla, 12:56


Upozorňujeme, že hodnoty prijaté od používateľov nie sú v skutočnosti „poškodené“. Každý prehliadač to analyzuje ako HTML a zobrazí všetko na obrazovke v správnej forme.

Čo nás privádza späť k... Všetko vyššie uvedené demonštruje problém spoločný pre mnohé systémy: text v texte musí byť escapovaný, ak nemá obsahovať špeciálne znaky. Pri umiestňovaní textových hodnôt do SQL musia byť kódované podľa pravidiel SQL. Pri umiestňovaní textových hodnôt do HTML musia byť kódované podľa pravidiel HTML. Pri umiestňovaní textových hodnôt do (názov technológie) musia byť kódované podľa pravidiel (názov technológie). To je všetko. Pre úplnosť, samozrejme, existujú aj iné spôsoby, ako sa vysporiadať so vstupom používateľa, ktorý môže alebo nemusí obsahovať špeciálne znaky:
  • Validácia
    Môžete skontrolovať, či vstup používateľa zodpovedá určitej špecifikácii. Ak požadujete zadanie čísla a používateľ zadá niečo iné, program by mal používateľa informovať a zadanie zrušiť. Ak je toto všetko zorganizované správne, potom nehrozí zachytenie „užívateľov DROP TABLE“ tam, kde mal používateľ zadať „42“. Toto nie je veľmi praktické na vyhýbanie sa HTML/SQL injekciám, pretože... Často musíte akceptovať text vo voľnom formáte, ktorý môže obsahovať triky. Validácia sa zvyčajne používa ako doplnok k iným opatreniam.
  • Sanitácia
    Môžete tiež „potichu“ odstrániť všetky symboly, ktoré považujete za nebezpečné. Napríklad jednoducho odstráňte všetko, čo vyzerá ako značka HTML, aby ste sa vyhli pridaniu do vášho fóra. Problém je v tom, že môžete odstrániť úplne legálne časti textu.
    Pripravené SQL príkazy
    Existujú špeciálne funkcie, ktoré robia to, čo sme chceli: aby databáza pochopila rozdiely medzi samotným SQL dotazom a informáciami poskytovanými používateľmi. V PHP vyzerajú asi takto:
    $stmt = $pdo->prepare("SELECT phone_number FROM users WHERE name = ?"); $stmt->execute($_POST["meno"]);
    V tomto prípade sa odosielanie uskutočňuje v dvoch fázach, pričom sa jasne rozlišuje medzi požiadavkou a premennými. Databáza má schopnosť najprv pochopiť štruktúru požiadavky a následne ju naplniť hodnotami.

  • V reálnom svete sa všetky používajú spolu na rôzne úrovne ochrany. Vždy by ste mali použiť overenie, aby ste sa uistili, že používateľ zadáva správne údaje. Potom môžete (ale nemusíte) naskenovať zadané údaje. Ak sa vám používateľ zjavne snaží predať nejaký skript, môžete ho jednoducho odstrániť. Potom by ste mali vždy pred vložením používateľských údajov do dotazu SQL vždy uniknúť používateľským údajom (to isté platí pre HTML).

2007.11.08 16:07

Narazil som na problém s automatickým pridávaním úvodzoviek v PHP pri zadávaní informácií do databázy.

Po nejakom hrabaní na internete som zistil, že problém sa dá vyriešiť zmenou nastavení servera pomocou direktív v .htaccess: magic_quotes_gpc a magic_quotes_runtime.

Hovoria (a dokonca tomu verím), že vývojári jazyka PHP, ktorí nedokázali prinútiť väčšinu PHP programátorov písať kvalitný kód, sa rozhodli postarať sa o bezpečnosť nášho DBMS a zaviedli automatické pridávanie lomiek pred špeciálnymi znakmi. Lomky sa pridávajú na základe direktív php.ini (magic_quotes_gpc a magic_quotes_runtime).

Smernice sa súhrnne nazývajú „magické citáty“, ale ja ich nazývam „pekelné citáty“. V dobre napísanej aplikácii nie je potrebná automatická cenová ponuka, navyše citácie navyše prekážajú a musia byť odstránené.

Prvá direktíva – magic_quotes_gpc – znamená, že PHP automaticky pridáva lomky k údajom prichádzajúcim od používateľa – z POST, GET požiadaviek a cookies. Druhá premenná – magic_quotes_runtime – znamená, že lomky sa pridávajú k údajom prijatým počas vykonávania skriptu – napríklad zo súboru alebo databázy. Niektoré funkcie, ktoré prezentujú takéto informácie, teda používajú úvodzovky.

Ak chcete odmietnuť takúto rušivú službu, potom buď (v tej zriedkavej a šťastnej situácii, keď ste úplným vlastníkom servera) zakážte tieto konfiguračné premenné v súbore php.ini, alebo (ak, samozrejme, nie ste hosťovanie stránky na bezplatnom hostingu) môžete vykonať zmeny v súbore .htaccess. Toto je súbor, ktorý obsahuje lokálne nastavenia apache pre jeden adresár a nie pre celý server. A pridajte k tomu nasledujúce riadky.


Priatelia!
Sme uprostred veľkého upratovania!
Možné chyby a zakrivenie strán
Nie je možné všetko rýchlo zobraziť!
Ak nájdete nejakú chybu, tak ak vám to nie je ťažké, napíšte adresu...
Teraz ste tu:

http://site/page/php/039_php_kavyichki.html

Php úvodzovky, jednoduché úvodzovky, dvojité úvodzovky, escapovanie

Dnes sa budeme zaoberať úvodzovkami, ale nie jednoduchými, ale úvodzovkami v PHP a plus úvodzovky, možnosti.

Začnime tým, že PHP umožňuje použitie dvojitých aj jednoduchých úvodzoviek.

A existuje niekoľko možností, ako sa vyhnúť úvodzovkám.

Kde sú úvodzovky umiestnené na klávesnici?

Ak sa chystáte pracovať v kóde, musíte vedieť, kde sú úvodzovky na klávesnici v rozložení latinky - toto je

písmeno E – malé písmeno:

a písmeno e je napísané - toto sú jednoduché úvodzovky:

php symbol dvojitých a jednoduchých úvodzoviek

Prirodzene, budete potrebovať znak citátu, t.j. Ak potrebujete vytlačiť cenovú ponuku bez toho, aby sa spustila, na to slúžia znaky citátov.

Dvojité úvodzovky:

"

Jednoduchý znak úvodzoviek:

"Php únikové úvodzovky.

Čo si vlastne predstavujete pod pojmom únikové úvodzovky v PHP.

Pozrime sa na príklad, pretože s príkladmi je vždy ľahšie pochopiť, o čom hovoríme!

Napíšeme php kód:

echo "php úvodzovky";

Ale ak sem vložíme tento kód, obávam sa, že tieto riadky nikdy neuvidíte!?

prečo? Áno, jednoducho preto, že kód nebude fungovať.

Urobil som to špeciálne pre vás, s týmto kódom vloženým do toho, a ak chcete, môžete vidieť, čo z toho vzíde!

Prečo sa to stalo?

Pretože vo vnútri echa sú ďalšie úvodzovky, ktoré sú vnímané ako PHP kód, a ak je ich viac, ako sa očakávalo, tak nastane chyba!

Čo robiť v tomto prípade!?

Dvojité úvodzovky musíte nahradiť jednoduchými úvodzovkami.

Zoberme si rovnaký kód a zmeňte dvojité úvodzovky na jednoduché úvodzovky.

echo '"php úvodzovky"';

Pozrime sa, čo máme!

Tie. Zobrali sme horný kód a vložili ho priamo na túto stránku a toto je výstup:


2. Druhá možnosť pre únikové úvodzovky. Sú situácie, kedy je použitie jednoduchých úvodzoviek nemožné!

V tomto prípade sa používa ľavá lomka. Pred každým prvkom, ktorý je potrebné opustiť, musíte vložiť takúto lomku.

Zoberme si predchádzajúci záznam a urobme to isté, iba pomocou lomky:

ozvena" php úvodzovky";

Pozrime sa na výsledok:

Ako odstrániť úvodzovky.

Aby sa na obrazovke zobrazovali úvodzovky a aby to neboli PHP kód - bez ohľadu na to, aké zvláštne to môže znieť! Citácie je potrebné zmeniť na html entity, napríklad:

Jediná cenová ponuka prostredníctvom html kódu::

" - jednoduchá úvodzovka " " "

Dvojitá cenová ponuka cez html kód:

" - dvojitá úvodzovka " " "

Takýto citát bude na obrazovke vyzerať ako citát, ale už sa nebude zobrazovať v kóde Php...

A ďalej!

So všetkým PHP kódom treba zaobchádzať opatrne! Ak ste napríklad niečo napísali vo Worde, nejaký text, tak ste v ňom začali písať kód, ako sa mi to stalo prvýkrát.

A nemohol som pochopiť, v čom je problém - naozaj mi nechcel ukázať jednoduchý kód. Bol som pripravený rozbiť počítač kladivom!!!

Ukázalo sa však, že úvodzovky v editore kódu sú iné ako vo Worde. A je nemožné pochopiť, ak ste tým neprešli!

Slash, z anglického slash, je spätná lomka, ktorá sa nepochopiteľne náhle objaví vo vašich údajoch. Pridáva sa k niektorým špeciálnym znakom, ale používa sa hlavne na umiestnenie úvodzoviek. Lomka je potrebná len pri práci s databázou. A je to absolútne nevyhnutné. Vo všetkých ostatných prípadoch to len prekáža. Teraz sa pozrieme na oba prípady a naučíme sa písať programy, ktoré nie sú závislé od nastavení PHP.


Direktívy php.ini sú zodpovedné za automatické pridávanie lomiek



magic_quotes_gpc
magic_quotes_runtime



Prvý – ak je povolený – automaticky pridáva lomky k údajom prichádzajúcim od používateľa – z požiadaviek POST, GET a cookies. Druhý je z tých, ktoré boli prijaté počas vykonávania skriptu - napríklad zo súboru. Ale nie vždy je prístup k nastaveniam PHP, najmä ak je program napísaný na distribúciu.


Pre vlastnú bezpečnosť si prečítajte CELÝ text bez ohľadu na prípad.


1. Ak pracujete BEZ databázy
To znamená, že nemusíte automaticky pridávať lomky. Ak bolo pridané PHP, musíte sa ho zbaviť.


Pomocou funkcie get_magic_quotes_gpc() môžete skontrolovať, či bolo pridané PHP.
Funkcia stripslashes() odstraňuje lomky.
Teraz nám ostáva už len skontrolovať, a či to PHP pridalo, tak prejsť všetky premenné v skripte a odstrániť lomky. Dá sa to urobiť jednou funkciou pomocou poľa $GLOBALS, ktoré obsahuje všetky premenné prítomné v skripte:



if (get_magic_quotes_gpc()) strips($GLOBALS);


funkčné pásy (&$el) (
if (is_array($el)) (
foreach($el ako $k=>$v) (
if($k!="GLOBALS") (
strips($el[$k]);
}
}
) inak (
$el = stripslashes($el);
}
}



Lomky budú odstránené z globálnych polí aj zo všetkých premenných, ktoré sa vytvoria, keď register_globals=on.


Tu musíme urobiť malú odbočku. Iterácia cez pole $GLOBALS je potrebná len vtedy, ak máte povolenú funkciu register_globals a používate premenné, ktoré sú automaticky priradené k hodnotám odovzdaným skriptu. Ak ich nepoužívate, jednoducho odstráňte lomky z požadovaných polí -
$_POST, $_GET a tak ďalej.


Ak sa chcete zbaviť pridávania lomítok pri získavaní údajov zo súboru, stačí napísať na začiatok skriptu:



set_magic_quotes_runtime(0);



2. Ak pracujete s MySQL
Dve základné pravidlá pre písanie dotazov v mysql:


  • Vo všetkých premenných musia byť špeciálne znaky ukončené lomkami.
    Dôležitá poznámka. Pridané lomky NEVSTUPUJÚ do databázy. Potrebné sú iba v žiadosti.
    Pri náraze na základňu sú lomky odhodené. V súlade s tým rozšírené
    Pri získavaní údajov z databázy je chybou používať lomítka.

  • Všetky reťazcové premenné musia byť uzavreté v úvodzovkách (jednoduché alebo dvojité, ale jednoduché sú pohodlnejšie a častejšie používané). Číselné premenné môžete pre jednoduchosť uzavrieť aj do úvodzoviek – samotný mysql ich prevedie do požadovanej podoby. To znamená, že z dôvodu spoľahlivosti musia byť všetky údaje vložené do žiadosti uvedené v úvodzovkách. Len robiť addlashes() by bolo nesprávne. Čo ak už bolo pridané samotné PHP? Toto je potrebné skontrolovať. Na to slúži funkcia get_magic_quotes_gpc().
    Ak údaje pochádzajú z prehliadača používateľa pomocou metódy GET alebo POST, mali by ste ich napísať takto:

    if (!get_magic_quotes_gpc()) $var=addslashes($var);



    Ak sú údaje prevzaté zo súboru (čo sa stáva zriedka, ale stále), potom

    if (!get_magic_quotes_runtime()) $var=addslashes($var);



    Ale čo je zaujímavé. Špeciálne pre mysql najnovšie verzie PHP zaviedli funkciu mysql_escape_string(), ktorá uniká o jeden znak viac ako addlashes. Asi má zmysel ho použiť.
    Ak máte špeciálnu funkciu na skladanie dotazov, tak do nej možno vložiť escapovanie. Ak nie, môžete použiť túto funkciu:

funkcia pridáva(&$el,$level=0) (
if (is_array($el)) (
foreach($el ako $k=>$v) pridá($el[$k],$úroveň+1);
) inak (
$el = lomítka ($el);
if (!$level) return $el;
}
}

Táto funkcia má dve použitia.
Ak zadáte reťazec ako parameter, funkcia ho vráti s uniknutými špeciálnymi znakmi.
Pohodlné na vloženie do požiadavky, napr



"SELECT * FROM table WHERE name="".adds($name).""";



Ak je parametrom pole, funkcia nevráti nič, ale jednoducho „prejde“ všetky svoje prvky rekurzívne. Napríklad pridá($_POST); bude pre toto pole vykonávať normálnu prácu magic_quotes.


Všimnite si, že žiadna z funkcií, ktoré pridávajú lomky, ich nepridáva do vyhľadávacích metaznakov „%“ a „_“ používaných v operátore LIKE. Preto, ak používate tento operátor, pridajte lomky ručne.



$data=preg_replace("/(%|_)/","\\\\\1",$data);




Pravidlá úniku sa môžu líšiť pre iné DBMS.


Poznámka:.
Pri zobrazovaní hodnoty vo vstupných značkách formulárov lomky nepomáhajú. Aby sa zobrazil celý text v takomto poli, hodnota musí byť uzavretá v úvodzovkách a na výstupné dáta musí byť použitá funkcia htmlspecialchars.
Príklad:



výsledok:

V prvej verzii (s dvojitými úvodzovkami) sme použili escapovanie špeciálneho znaku dolára, čím tento špeciálny znak prestal mať svoj špeciálny účel (variabilné označenie) a zmenil sa na obyčajný znak dolára.

V druhej možnosti (s jednoduchými úvodzovkami), ako už viete, sa interpret PHP ani nesnažil nájsť premenné v riadku, a preto nebolo potrebné escapovanie.

Špeciálne znaky v PHP

Špeciálne pre čitateľov blogu Stránka na! Pripravil som malý zoznam špeciálnych znakov v programovacom jazyku PHP:

  • \n nový riadok
  • návrat vozíka
  • \t vodorovný tabulátor
  • \\ spätná lomka (obrátená lomka)
  • \$ znak dolára
  • \" dvojitá úvodzovka

Pozrime sa na prácu špeciálnych znakov na príklade \n - špeciálny znak, ktorý vytvorí nový riadok (ako Enter), ale prehliadače mu nerozumejú (a nemali by) a ignorujú ho, ale výsledok jeho práce môže vidieť v zdrojovom kóde stránky:

výsledok:

Zdrojový kód (Ctrl + U):

Ak sa špeciálny znak \n návštevníkom v prehliadači nijako nezobrazuje, aký má potom význam?

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

Po druhé, \n sa dá použiť napríklad počas operácií zápisu do súboru, aby sa zalomilo (Enter) a pokračovalo sa v písaní na nový riadok.

Alternatívou k tomuto formátovaniu je .

Syntax Heredoc v PHP

výsledok:

Zdrojový kód (Ctrl + U):

Výsledok hovorí sám za seba, teraz poďme zistiť, ako všetko funguje:

  • Čiara začína tromi uhlovými zátvorkami
Pokračovanie v téme:
Android

Týmto článkom otváram sériu – popis práce Social CRM, t.j. softvérové ​​produkty zamerané na prácu so záujmom používateľov o sociálne siete. Rovnako ako ostatné CRM...