Detay sou pann Cloudflare nan 2 jiyè 2019

Detay sou pann Cloudflare nan 2 jiyè 2019

Prèske 9 ane de sa Cloudflare te yon ti konpayi, epi mwen pa t 'travay pou li, mwen te jis yon kliyan. Yon mwa apre lanse Cloudflare, mwen te resevwa yon notifikasyon sou sit entènèt mwen an jgc.orgDNS pa sanble ap travay. Cloudflare te fè yon chanjman nan Pwotokòl Tanpon, e te gen yon DNS kase.

Mwen imedyatman te ekri Matthew Prince ak tit la "Kote dns mwen an?" epi li te voye tounen yon repons long plen detay teknik (li tout korespondans la isit la), sa mwen te reponn:

Soti nan: John Graham-Cumming
Dat: 7 oktòb 2010, 9:14
Sijè: Re: Kote dns mwen an?
Pou: Matthew Prince

Rapò bèl, mèsi. Mwen pral definitivman rele si gen pwoblèm. Li pwobableman vo ekri yon pòs sou sa a yon fwa ou te kolekte tout enfòmasyon teknik yo. Mwen panse ke moun pral jwi yon istwa ouvè ak onèt. Espesyalman si ou tache graf sou li pou montre kijan trafik te grandi depi lansman.

Mwen gen bon siveyans sou sit mwen an, epi mwen resevwa yon SMS sou chak echèk. Siveyans montre ke echèk la te fèt soti nan 13:03:07 a 14:04:12. Tès yo fèt chak senk minit.

Mwen sèten ou pral kalkile li. Èske ou sèten ou pa bezwen pwòp moun ou an Ewòp? 🙂

Epi li reponn:

Soti nan: Matthew Prince
Dat: 7 oktòb 2010, 9:57
Sijè: Re: Kote dns mwen an?
Pou: John Graham-Cumming

Mèsi. Nou reponn tout moun ki ekri. Mwen sou wout mwen nan biwo a kounye a epi nou pral ekri yon bagay sou blog la oswa mete yon pòs ofisyèl sou tablo afichaj nou an. Mwen konplètman dakò, onètete se tout bagay.

Koulye a, Cloudflare se yon konpayi vrèman gwo, mwen travay pou li, epi kounye a mwen dwe ekri ouvètman sou erè nou an, konsekans li yo ak aksyon nou yo.

Evènman 2 jiyè

Sou 2 jiyè nou te woule soti yon nouvo règ nan Règ jere pou WAF akòz ki Resous CPU yo te fini sou chak pwosesis debaz pwosesis HTTP/HTTPS trafik sou rezo Cloudflare atravè lemond. Nou toujou ap amelyore règ jere pou WAF yo an repons a nouvo frajilite ak menas. An me, pa egzanp, nou te prese ajoute règpou pwoteje kont yon vilnerabilite grav nan SharePoint. Tout pwen WAF nou an se kapasite pou deplwaye règ rapidman ak globalman.

Malerezman, aktyalizasyon Jedi pase a te genyen yon ekspresyon regilye ki te gaspiye twòp resous HTTP/HTTPS CPU nan fè bak. Fonksyon debaz proxy, CDN, ak WAF nou yo te soufri kòm rezilta. Grafik la montre resous processeur pou sèvi trafik HTTP/HTTPS rive prèske 100% sou sèvè nan rezo nou an.

Detay sou pann Cloudflare nan 2 jiyè 2019
Itilizasyon CPU nan yon pwen prezans pandan yon ensidan

Kòm yon rezilta, kliyan nou yo (ak kliyan kliyan nou yo) te fini ak yon paj erè 502 nan domèn Cloudflare. 502 erè te pwodwi pa Cloudflare sèvè entènèt front-end ki te toujou gen nwayo gratis men yo pa t 'kapab kominike ak pwosesis manyen trafik HTTP / HTTPS.

Detay sou pann Cloudflare nan 2 jiyè 2019

Nou konnen konbyen enkonvenyan sa a te lakòz kliyan nou yo. Nou fò anpil wont. Ak echèk sa a anpeche nou efektivman fè fas ak ensidan an.

Si ou te youn nan kliyan sa yo, ou te pwobableman pè, fache ak fache. Anplis, nou pa te gen yon dezòd mondyal yo. Konsomasyon CPU segondè te akòz yon sèl règ WAF ak yon ekspresyon regilye mal libellé ki te lakòz twòp backtracking. Men ekspresyon koupab la: (?:(?:"|'|]|}||d|(?:nan|infinity|true|false|null|undefined|symbol|math)|`|-|+)+[)]*;?((?:s|-|~|!|{}||||+)*.*(?:.*=.*)))

Pandan ke sa a se enteresan nan pwòp dwa li yo (epi mwen pral pale sou li an plis detay anba a), sèvis la Cloudflare te desann pou 27 minit pa sèlman akòz yon move ekspresyon regilye. Li te pran yon ti tan pou nou dekri sekans evènman ki te mennen nan echèk la, kidonk nou te ralanti pou reponn. Nan fen pòs la, mwen pral dekri backtracking nan yon ekspresyon regilye epi di w kisa pou w fè ak li.

Sa ki te pase

Ann kòmanse nan lòd. Tout tan isit la yo se nan UTC.

A 13:42 p.m., yon enjenyè nan ekip firewall la te fè yon ti chanjman nan règ deteksyon yo. XSS lè l sèvi avèk yon pwosesis otomatik. An konsekans, yo te kreye yon tikè demann chanjman. Nou jere tikè sa yo atravè Jira (screenshot anba a).

Apre 3 minit, premye paj PagerDuty parèt, ki rapòte yon pwoblèm ak WAF. Sa a se te yon tès sentetik ki teste fonksyonalite WAF yo (nou gen dè santèn de yo) deyò Cloudflare pou kontwole operasyon nòmal. Sa a te imedyatman swiv pa paj alèt sou lòt tès sèvis Cloudflare fen-a-fen echèk, pwoblèm trafik mondyal, erè 502 toupatou, ak yon tòn rapò ki soti nan Pwen Prezans nou yo (PoP) nan vil atravè mond lan ki endike yon mank. nan resous CPU yo.

Detay sou pann Cloudflare nan 2 jiyè 2019

Detay sou pann Cloudflare nan 2 jiyè 2019

Mwen te resevwa plizyè nan alèt sa yo, mwen te soti nan yon reyinyon, epi mwen te sou wout mwen sou tab la lè chèf depatman devlopman solisyon nou an te di ke nou te pèdi 80% nan trafik nou an. Mwen kouri al jwenn enjenyè SRE nou yo, ki te deja travay sou pwoblèm nan. Okòmansman, nou te panse se te yon kalite atak enkoni.

Detay sou pann Cloudflare nan 2 jiyè 2019

Enjenyè Cloudflare SRE yo gaye atravè mond lan epi kontwole sitiyasyon an nan revèy la. Tipikman, alèt sa yo fè w konnen pwoblèm lokal espesifik ki gen limit limite, yo swiv sou tablodbò entèn yo, epi yo rezoud plizyè fwa pa jou. Men, paj sa yo ak notifikasyon yo te endike yon bagay ki vrèman grav, epi enjenyè SRE imedyatman te deklare nivo severite P0 la epi yo te kontakte jesyon ak enjenyè sistèm yo.

Enjenyè London nou yo t ap koute yon konferans nan sal prensipal la nan moman sa a. Konferans la te dwe entèwonp, tout moun te rasanble nan yon gwo sal konferans, epi yo te rele plis espesyalis. Sa a pa t 'yon pwoblèm tipik ke SRE yo te kapab fè fas ak tèt yo. Li te ijan pou enplike bon espesyalis yo.

A 14:00 nou te detèmine ke pwoblèm nan se ak WAF la epi pa te gen okenn atak. Ekip pèfòmans lan te rale done CPU yo epi li te vin klè ke WAF te blame. Yon lòt anplwaye konfime teyori sa a lè l sèvi avèk strace. Yon lòt moun te wè nan mòso bwa yo ke te gen yon pwoblèm ak WAF. A 14:02 p.m., tout ekip la te vin jwenn mwen lè yo te pwopoze pou itilize global kill, yon mekanis ki te bati nan Cloudflare ki fèmen yon sèl eleman atravè lemond.

Ki jan nou te touye mondyal pou WAF se yon istwa diferan. Se pa sa senp. Nou itilize pwòp pwodwi nou yo, epi depi sèvis nou an Aksè pa t travay, nou pa t kapab otantifye epi konekte nan panèl kontwòl entèn la (lè tout bagay te fikse, nou te aprann ke kèk manm ekip la te pèdi aksè akòz yon karakteristik sekirite ki enfim kalifikasyon si panèl kontwòl entèn la pa itilize pou yon lontan).

Epi nou pa t kapab jwenn sèvis entèn nou yo, tankou Jira oswa sistèm konstriksyon an. Nou te bezwen yon mekanis solisyon, ke nou te itilize raman (sa a pral bezwen tou travay deyò). Finalman, yon enjenyè te jere enfim WAF a 14:07, ak nan 14:09, trafik ak nivo CPU yo te tounen nan nòmal toupatou. Rès mekanis pwoteksyon Cloudflare yo te travay nòmal.

Lè sa a, nou mete sou restorasyon WAF la. Sitiyasyon an te soti nan òdinè, kidonk nou te fè tès negatif (mande tèt nou si chanjman an te reyèlman pwoblèm nan) ak tès pozitif (asire w ke rollback la te travay) nan yon vil lè l sèvi avèk trafik separe, transfere kliyan peye soti nan la.

A 14:52 nou te konvenki ke nou te konprann rezon an epi fè yon koreksyon, ak pèmèt WAF ankò.

Ki jan Cloudflare travay

Cloudflare gen yon ekip enjenyè ki dedye a jere règ pou WAF yo. Yo fè efò pou amelyore pousantaj deteksyon, diminye fo pozitif, epi byen vit reponn a nouvo menas pandan y ap parèt. Nan 60 dènye jou yo, te gen 476 demann chanjman ki te trete pou règ jere pou WAF (yon mwayèn yon chak 3 èdtan).

Chanjman patikilye sa a te bezwen deplwaye nan mòd simulation, kote trafik kliyan reyèl pase nan règ la, men pa gen anyen ki bloke. Nou itilize mòd sa a pou teste efikasite règ yo epi mezire pousantaj fo pozitif ak fo negatif. Men, menm nan mòd simulation, règ yo dwe aktyèlman egzekite, ak nan ka sa a règ la genyen yon ekspresyon regilye ki te konsome twòp resous processeur.

Detay sou pann Cloudflare nan 2 jiyè 2019

Kòm ou ka wè nan demann chanjman an pi wo a, nou gen yon plan deplwaman, yon plan rollback, ak yon lyen nan yon pwosedi operasyon estanda entèn (SOP) pou kalite deplwaman sa a. SOP pou chanje yon règ pèmèt yo pibliye l globalman. Aktyèlman, nan Cloudflare, bagay yo fè yon fason konplètman diferan, ak SOP la dikte ke nou premye bato lojisyèl an pou tès ak itilizasyon entèn nan yon pwen prezans entèn (PoP) (ki anplwaye nou yo itilize), answit nan yon ti kantite kliyan nan yon kote izole, Lè sa a, nan yon gwo kantite kliyan, epi sèlman Lè sa a, nan lemonn antye.

Sa a se sa li sanble. Nou itilize git entèn atravè BitBucket. Enjenyè k ap travay sou chanjman yo soumèt kòd, ki se bati nan TeamCity, epi lè bati a pase, evalè yo asiyen. Yon fwa yo apwouve yon demann rale, kòd la reyini epi yo kouri yon seri tès (ankò).

Si konstriksyon an ak tès yo fini avèk siksè, yo kreye yon demann chanjman nan Jira epi manadjè ki apwopriye a oswa dirijan dwe apwouve chanjman an. Apre apwobasyon, deplwaman fèt nan sa yo rele "Menajri PoP": DOG, PIG ak Canary (chen, kochon ak kanari).

DOG PoP se yon Cloudflare PoP (tankou tout lòt vil nou yo) ke anplwaye Cloudflare yo itilize sèlman. PoP pou itilizasyon entèn pèmèt ou trape pwoblèm anvan trafik kliyan kòmanse koule nan solisyon an. Bagay itil.

Si tès CHEN an reyisi, kòd la deplase nan etap KOchon (kochon Gine). Sa a se Cloudflare PoP, kote yon ti kantite trafik kliyan gratis ap koule nan nouvo kòd.
Si tout byen, kòd la antre nan Canary. Nou gen twa PoP Canary nan diferan pati nan mond lan. Nan yo, trafik la nan kliyan peye ak gratis pase nan nouvo kòd la, e sa a se dènye chèk la pou erè.

Detay sou pann Cloudflare nan 2 jiyè 2019
Pwosesis lage lojisyèl nan Cloudflare

Si kòd la ok nan Canary, nou lage li. Ale nan tout etap yo - DOG, PIG, Canary, lemonn antye - pran plizyè èdtan oswa jou, tou depann de chanjman nan kòd. Akòz divèsite rezo ak kliyan Cloudflare yo, nou byen teste kòd anvan nou lage li globalman bay tout kliyan yo. Men, WAF pa espesyalman suiv pwosesis sa a paske menas yo bezwen reponn byen vit.

WAF menas
Pandan kèk ane ki sot pase yo, te gen yon ogmantasyon siyifikatif nan menas nan aplikasyon komen. Sa a se akòz disponiblite a pi gwo nan zouti tès lojisyèl. Pa egzanp, nou fèk ekri sou fuzzing).

Detay sou pann Cloudflare nan 2 jiyè 2019
Sous: https://cvedetails.com/

Trè souvan, yo kreye yon prèv konsèp epi imedyatman pibliye sou Github pou ekip ki kenbe aplikasyon an ka byen vit teste li epi asire ke li se ase sekirite. Se poutèt sa, Cloudflare bezwen kapasite pou reponn a nouvo atak pi vit ke posib pou kliyan yo gen opòtinite pou ranje lojisyèl yo.

Yon bon egzanp repons rapid Cloudflare se deplwaman pwoteksyon vilnerabilite SharePoint nan mwa me (li isit la). Prèske imedyatman apre anons yo te fè, nou remake yon gwo kantite tantativ pou eksplwate vilnerabilite nan enstalasyon SharePoint kliyan nou yo. Mesye nou yo toujou ap kontwole nouvo menas epi ekri règ pou pwoteje kliyan nou yo.

Règ ki te lakòz pwoblèm nan Jedi te sipoze pwoteje kont cross-site scripting (XSS). Atak sa yo te vin pi souvan pi souvan nan dènye ane yo.

Detay sou pann Cloudflare nan 2 jiyè 2019
Sous: https://cvedetails.com/

Pwosedi estanda pou chanje yon règ jere pou yon WAF se fè tès entegrasyon kontinyèl (CI) anvan deplwaman mondyal la. Jedi pase a nou te fè sa epi woule règ yo. A 13:31 p.m., yon enjenyè te soumèt yon demann pou rale apwouve ak yon chanjman.

Detay sou pann Cloudflare nan 2 jiyè 2019

A 13:37 TeamCity te kolekte règ yo, te fè tès yo epi li te bay ale. Suite tès WAF la teste fonksyonalite debaz WAF la epi li konsiste de yon gwo kantite tès inite pou fonksyon endividyèl yo. Apre tès inite yo, nou teste règ yo pou WAF lè l sèvi avèk yon gwo kantite demann HTTP. Demann HTTP tcheke ki demann yo ta dwe bloke pa WAF (pou entèsepte atak la) ak kilès yo ka pèmèt yo pase (pou yo pa bloke tout bagay epi evite fo pozitif). Men, nou pa t teste pou itilizasyon CPU twòp, epi egzamine mòso bwa yo nan bati WAF anvan yo montre ke tan an ekzekisyon tès règ la pa t ogmante, epi li te difisil yo sispèk ke pa t ap gen ase resous.

Tès yo te pase epi TeamCity te kòmanse otomatikman deplwaye chanjman an a 13:42 p.m.

Detay sou pann Cloudflare nan 2 jiyè 2019

Quicksilver

Règ WAF yo konsantre sou ratrapaj menas imedya, kidonk nou deplwaye yo lè l sèvi avèk magazen kle-valè distribiye Quicksilver, ki pwopaje chanjman globalman an kèk segonn. Tout kliyan nou yo sèvi ak teknoloji sa a lè yo chanje konfigirasyon an nan tablodbò a oswa atravè API a, epi se gras a li ke nou reponn a chanjman ak vitès zèklè.

Nou pa t pale anpil sou Quicksilver. Anvan nou te itilize Kyoto Tycoon kòm yon magazen kle-valè distribye globalman, men te gen pwoblèm operasyonèl ak li, epi nou te ekri pwòp magazen nou an, replike nan plis pase 180 vil. Koulye a, nou itilize Quicksilver pou pouse chanjman nan konfigirasyon kliyan yo, mete ajou règ WAF yo, epi distribye kòd JavaScript ekri pa kliyan yo bay Travayè Cloudflare yo.

Li pran sèlman kèk segonn nan klike sou yon bouton sou yon tablodbò oswa rele yon API pou fè yon chanjman konfigirasyon atravè lemond. Kliyan yo te renmen vitès konfigirasyon sa a. Ak Travayè yo ba yo deplwaman lojisyèl mondyal prèske enstantane. An mwayèn, Quicksilver pwopaje anviwon 350 chanjman pa segonn.

Ak Quicksilver trè vit. An mwayèn, nou reyalize 99yèm percentile 2,29 segonn pou difize chanjman nan chak òdinatè atravè lemond. Vitès anjeneral se yon bon bagay. Apre yo tout, lè ou pèmèt yon fonksyon oswa netwaye kachèt la, li rive prèske imedyatman ak toupatou. Voye kòd atravè Cloudflare Workers fèt nan menm vitès la. Cloudflare pwomèt kliyan li yo mizajou rapid nan bon moman an.

Men, nan ka sa a, vitès te jwe yon blag mechan sou nou, ak règ yo chanje toupatou nan yon kesyon de segonn. Ou ka remake ke kòd WAF la itilize Lua. Cloudflare itilize Lua anpil nan pwodiksyon ak detay Lua nan WAF nou ye deja diskite. Lua WAF itilize PCRE entèn epi aplike backtracking pou matche. Li pa gen okenn mekanis pou pwoteje kont ekspresyon ki soti nan kontwòl. Anba a mwen pral pale plis sou sa a ak sa nou ap fè sou li.

Detay sou pann Cloudflare nan 2 jiyè 2019

Anvan règ yo te deplwaye, tout bagay te ale san pwoblèm: demann rale a te kreye ak apwouve, tiyo CI/CD kolekte epi teste kòd la, demann chanjman an te soumèt dapre SOP ki gouvène deplwaman ak rollback, epi deplwaman an te konplete.

Detay sou pann Cloudflare nan 2 jiyè 2019
Pwosesis Deplwaman Cloudflare WAF

Yon bagay ale mal
Kòm mwen te di, nou deplwaye plizyè douzèn nouvo règ WAF chak semèn, epi nou gen anpil sistèm an plas pou pwoteje kont konsekans negatif deplwaman sa yo. Men, lè yon bagay ale mal, li se anjeneral yon konbinezon de plizyè sikonstans nan yon fwa. Si w jwenn yon sèl rezon, sa a, nan kou, se rasire, men li pa toujou vre. Sa yo se rezon ki fè yo ansanm te mennen nan echèk nan sèvis HTTP/HTTPS nou an.

  1. Yon enjenyè te ekri yon ekspresyon regilye ki ka lakòz twòp fè bak.
  2. Yon karakteristik ki ta ka anpeche ekspresyon regilye a gaspiye twòp CPU yo te retire erè nan yon refactoring nan WAF plizyè semèn anvan - refactoring la te bezwen fè WAF a konsome mwens resous.
  3. Motè a ekspresyon regilye pa te gen okenn garanti konpleksite.
  4. Suite tès la pa t 'kapab detekte twòp CPU konsomasyon.
  5. SOP a pèmèt chanjman règ ki pa ijan yo dwe lanse globalman san yon pwosesis ki gen plizyè etap.
  6. Plan rollback la te mande pou fè yon WAF konplè de fwa, sa ki te pran yon bon bout tan.
  7. Premye alèt sou pwoblèm trafik mondyal te deklanche twò ta.
  8. Nou te pran yon ti tan pou mete ajou paj estati a.
  9. Nou te gen pwoblèm aksè nan sistèm akòz yon glitch ak pwosedi kontoune pa te byen etabli.
  10. Enjenyè SRE te pèdi aksè a kèk sistèm paske kalifikasyon yo te ekspire akòz rezon sekirite.
  11. Kliyan nou yo pa t gen aksè nan tablodbò Cloudflare oswa API paske yo te pase nan yon rejyon Cloudflare.

Sa ki chanje depi Jedi pase a

Premyèman, nou konplètman sispann tout travay sou lage pou WAF epi n ap fè bagay sa yo:

  1. Nou ap re-entwodwi pwoteksyon CPU abuze ke nou retire. (Pare)
  2. Manyèlman tcheke tout 3868 règ nan règ yo jere pou WAF a jwenn ak korije lòt ka potansyèl de bak twòp. (Verifikasyon fini)
  3. Nou enkli pwofil pèfòmans pou tout règ nan seri tès la. (Atann: 19 jiyè)
  4. Chanje nan yon motè ekspresyon regilye RE2 oswa Rouye - tou de bay garanti ègzekutabl. (Atann: 31 jiyè)
  5. Nou ap reekri SOP pou deplwaye règ yo pa etap, tankou lòt lojisyèl nan Cloudflare, men an menm tan gen kapasite pou deplwaman mondyal ijans si atak yo te deja kòmanse.
  6. Nou ap devlope kapasite pou retire tablodbò Cloudflare ak API ijan nan rejyon Cloudflare.
  7. Otomatik mizajou paj yo Estati Cloudflare.

Alontèm nou ap deplase lwen Lua WAF mwen te ekri kèk ane de sa. Deplase WAF nan nouvo sistèm firewall. Nan fason sa a WAF la pral pi rapid epi resevwa yon nivo pwoteksyon adisyonèl.

Konklizyon

Echèk sa a te lakòz pwoblèm pou nou ak kliyan nou yo. Nou te aji byen vit pou korije sitiyasyon an epi kounye a ap travay sou defo nan pwosesis ki te lakòz aksidan an, ansanm ak fouye menm pi fon pou pwoteje kont pwoblèm potansyèl ak ekspresyon regilye nan tan kap vini an lè n ap migrasyon nan nouvo teknoloji.

Nou wont anpil pou pann sa a epi eskize kliyan nou yo. Nou espere ke chanjman sa yo pral asire yon bagay tankou sa a pa rive ankò.

Aplikasyon. Fè bak ekspresyon regilye yo

Pou konprann kijan ekspresyon an:

(?:(?:"|'|]|}||d
(?:nan|infinity|true|false|null|undefined|symbol|math)|`|-
|+)+[)]*;?((?:s|-|~|!|{}||||+)*.*(?:.*=.*)))

te manje tout resous CPU yo, ou bezwen konnen yon ti kras sou ki jan motè a estanda ekspresyon regilye travay. Pwoblèm nan isit la se modèl la .*(?:.*=.*). (?: ak korespondan ) se yon gwoup ki pa kaptire (ki vle di, ekspresyon ki nan parantèz yo gwoupe kòm yon sèl ekspresyon).

Nan kontèks konsomasyon CPU twòp, modèl sa a ka dekri kòm .*.*=.*. Nan fòm sa a, modèl la sanble san nesesite konplèks. Men, sa ki pi enpòtan, nan mond reyèl la, ekspresyon (tankou ekspresyon konplèks nan règ WAF) ki mande motè a matche ak yon fragman ki te swiv pa yon lòt fragman ka mennen nan backtracking katastwofik. Epi se poutèt sa.

Detay sou pann Cloudflare nan 2 jiyè 2019

Nan ekspresyon regilye . vle di ou bezwen matche ak yon karaktè, .* - matche zewo oswa plis karaktè "avis", se sa ki, kaptire yon maksimòm de karaktè, se konsa ke .*.*=.* vle di matche ak zewo oswa plis karaktè, Lè sa a, matche ak zewo oswa plis karaktè, jwenn literal = karaktè, matche ak zewo oswa plis karaktè.

Ann pran liy tès la x=x. Li koresponn ak ekspresyon an .*.*=.*. .*.* anvan siy egal a matche ak premye a x (youn nan gwoup yo .* Korespondan x, ak dezyèm karaktè yo - zewo). .* apre = alimèt dènye x.

Konparezon sa a mande pou 23 etap. Premye gwoup .* в .*.*=.* aji visye ak matche ak tout fisèl la x=x. Motè a deplase nan pwochen gwoup la .*. Nou pa gen okenn karaktè plis matche ak, kidonk dezyèm gwoup la .* matche ak zewo karaktè (sa a pèmèt). Lè sa a, motè a deplase nan siy la =. Pa gen okenn senbòl ankò (premye gwoup .* itilize tout ekspresyon an x=x), pa gen okenn konparezon ki fèt.

Lè sa a, motè a ekspresyon regilye retounen nan kòmansman an. Li ale nan premye gwoup la .* epi konpare li с x= (olye de x=x), ak Lè sa a, pran dezyèm gwoup la .*. Dezyèm gwoup .* yo konpare ak dezyèm lan x, epi nou ankò pa gen okenn karaktè kite. Epi lè motè a rive ankò = в .*.*=.*, anyen pa mache. Epi li fè bak ankò.

Fwa sa a gwoup la .* toujou matche ak x=, men dezyèm gwoup la .* pa plis x, ak zewo karaktè. Motè a ap eseye jwenn yon karaktè literal = nan modèl la .*.*=.*, men li pa soti (apre tout, premye gwoup la te deja okipe li .*). Epi li fè bak ankò.

Fwa sa a premye gwoup la .* pran sèlman premye x la. Men, dezyèm gwoup la .* "avide" kaptire =x. Eske ou deja devine sa ki pral rive? Motè a eseye matche ak literal la =, echwe epi fè yon lòt fè bak.

Premye gwoup .* toujou matche ak premye a x... Dezyèm lan .* sèlman pran =. Natirèlman, motè a pa ka matche ak literal la =, paske dezyèm gwoup la deja fè sa .*. Epi ankò fè bak. Epi nou ap eseye matche ak yon seri de twa karaktè!

Kòm yon rezilta, premye gwoup la .* matche ak premye a sèlman x, dezyèm .* - ak zewo karaktè, ak motè a finalman matche ak literal la = nan ekspresyon с = nan liy. Next se dènye gwoup la .* yo konpare ak dènye a x.

23 etap sèlman pou x=x. Gade yon ti videyo sou itilizasyon Perl Regexp::Debugger, ki montre kouman etap ak backtracking rive.

Detay sou pann Cloudflare nan 2 jiyè 2019

Sa a se deja yon anpil nan travay, men e si olye x=x nou pral gen x=xx? Sa se 33 etap. E si x=xxx? 45. Relasyon an pa lineyè. Grafik la montre yon konparezon apati de x=x до x=xxxxxxxxxxxxxxxxxxxx (20 x apre =). Si nou gen 20 x apre =, motè a konplete matche a nan 555 etap! (Anplis, si nou te pèdi x= ak fisèl la tou senpleman konsiste de 20 x, motè a pral pran 4067 etap pou konprann ke pa gen okenn alimèt).

Detay sou pann Cloudflare nan 2 jiyè 2019

Videyo sa a montre tout backtracking pou konparezon x=xxxxxxxxxxxxxxxxxxxx:

Detay sou pann Cloudflare nan 2 jiyè 2019

Pwoblèm lan se ke kòm gwosè fisèl la ogmante, tan an matche ap grandi super-lineyèman. Men, bagay yo ka vin pi mal menm si ekspresyon regilye a yon ti kras modifye. Ann di nou te genyen .*.*=.*; (sa vle di, te gen yon pwent-viròl literal nan fen modèl la). Pou egzanp, matche ak yon ekspresyon tankou foo=bar;.

Ak isit la fè bak ta dwe yon dezas reyèl. Pou konparezon x=x li pral pran 90 etap, pa 23. E nimewo sa a ap grandi byen vit. Pou konpare x= ak 20 x, 5353 etap yo nesesè. Men tablo a. Gade valè aks yo Y konpare ak tablo anvan an.

Detay sou pann Cloudflare nan 2 jiyè 2019

Si w enterese, tcheke tout 5353 etap matche echwe x=xxxxxxxxxxxxxxxxxxxx и .*.*=.*;

Detay sou pann Cloudflare nan 2 jiyè 2019

Lè w itilize matche parese olye ke visye, yo ka kontwole limit nan fè bak. Si nou chanje ekspresyon orijinal la .*?.*?=.*?, pou konparezon x=x li pral pran 11 etap (pa 23). Tankou x=xxxxxxxxxxxxxxxxxxxx... Tout paske ? apre .* di motè a matche ak yon kantite minimòm karaktè anvan li deplase sou.

Men, kat parese pa konplètman rezoud pwoblèm nan backtracking. Si nou ranplase egzanp katastwofik la .*.*=.*; sou .*?.*?=.*?;, tan ekzekisyon an ap rete menm jan an. x=x toujou mande pou 555 etap, ak x= ak 20 x - NAN.

Bagay la sèlman ki ka fè (anplis konplètman reekri modèl la pou pi gwo espesifik) se abandone motè a ekspresyon regilye ak mekanis backtracking li yo. Sa a se sa nou pral fè pandan kèk semèn kap vini yo.

Solisyon pwoblèm sa a te konnen depi 1968, lè Kent Thompson te ekri yon atik Teknik pwogramasyon: Algorithm rechèch ekspresyon regilye ("Metòd pwogramasyon: Algorithm rechèch regilye ekspresyon"). Atik la dekri yon mekanis ki pèmèt ou konvèti yon ekspresyon regilye nan machin eta fini ki pa detèminist, epi apre chanjman eta nan machin eta ki pa determinis, sèvi ak yon algorithm ki gen tan ekzekisyon depann lineyèman sou kòd la matche.

Detay sou pann Cloudflare nan 2 jiyè 2019

Metòd pwogramasyon
Algorithm rechèch ekspresyon regilye
Ken Thompson

Bell Telephone Laboratories, Inc., Murray Hill, New Jersey

Li dekri yon metòd pou chèche yon seri karaktè espesifik nan tèks epi li diskite sou aplikasyon metòd sa a sou fòm konpilatè. Konpilateur la pran ekspresyon regilye a kòm kòd sous epi li pwodui pwogram IBM 7094 la kòm kòd objè. Pwogram objè a pran opinyon sou fòm tèks rechèch la epi li emèt yon siyal chak fwa yon seri tèks matche ak yon ekspresyon regilye bay yo. Atik la bay egzanp, pwoblèm ak solisyon.

Algorithm la
Algoritm rechèch anvan yo te lakòz bak si yon rechèch pasyèlman siksè echwe pou pou pwodui yon rezilta.

Nan mòd konpilasyon, algorithm la pa travay ak senbòl. Li pase enstriksyon nan kòd konpile. Egzekisyon se trè vit - apre yo fin pase done nan tèt lis aktyèl la, li otomatikman chèche tout karaktè youn apre lòt posib nan ekspresyon regilye a.
Konpilasyon ak algorithm rechèch la enkli nan editè tèks tan pataje kòm rechèch kontèks. Natirèlman, sa a se lwen aplikasyon an sèlman nan yon pwosedi rechèch konsa. Pou egzanp, yo itilize yon varyant algorithm sa a kòm yon rechèch senbòl nan yon tablo nan asanblaj.
Yo sipoze ke lektè a abitye ak ekspresyon regilye ak langaj pwogramasyon òdinatè IBM 7094.

Konpilateur
Konpile a konsiste de twa etap kouri nan paralèl. Premye etap la se filtraj sentaks, ki pèmèt sèlman ekspresyon regilye sentaktik kòrèk yo pase. Etap sa a tou foure "·" operatè a matche ak ekspresyon regilye. Nan dezyèm etap la, ekspresyon regilye a konvèti nan fòm postfix. Nan twazyèm etap la, yo kreye kòd objè. 2 premye etap yo evidan, epi nou pa pral rete sou yo.

Atik Thompson a pa pale sou machin eta fini ki pa detèmine, men li eksplike byen algorithm tan lineyè a epi li prezante yon pwogram ALGOL-60 ki jenere kòd langaj asanblaj pou IBM 7094. Aplikasyon an difisil, men lide a trè senp.

Detay sou pann Cloudflare nan 2 jiyè 2019

chemen rechèch aktyèl la. Li reprezante pa yon icon ⊕ ak yon antre ak de rezilta.
Figi 1 montre fonksyon twazyèm etap konpilasyon lè w ap transfòme yon egzanp ekspresyon regilye. Twa premye karaktè nan egzanp lan se a, b, c, epi yo chak kreye yon pil antre S[i] ak yon jaden NNODE.

NNODE nan kòd ki egziste deja pou jenere ekspresyon regilye ki lakòz nan yon sèl antre pil (gade Figi 5)

Men sa yon ekspresyon regilye ta sanble .*.*=.*, si ou imajine li tankou nan foto yo nan atik Thompson la.

Detay sou pann Cloudflare nan 2 jiyè 2019

Nan Fig. 0 gen senk eta ki kòmanse nan 0, ak 3 sik ki kòmanse nan eta 1, 2 ak 3. Twa sik sa yo koresponn ak twa. .* nan yon ekspresyon regilye. 3 oval ak pwen koresponn ak yon senbòl. Oval ak yon siy = matche ak yon karaktè literal =. Eta 4 final la. Si nou rive jwenn li, Lè sa a, ekspresyon regilye a matche.

Pou wè ki jan yon dyagram eta konsa ka itilize pou matche ekspresyon regilye .*.*=.*, nou pral gade nan matche fisèl x=x. Pwogram nan kòmanse nan eta 0, jan yo montre nan Fig. 1.

Detay sou pann Cloudflare nan 2 jiyè 2019

Pou algorithm sa a travay, machin eta a dwe nan plizyè eta ansanm. Yon machin fini ki pa detèminist pral fè tout tranzisyon posib an menm tan.

Anvan li gen tan li done yo antre, li ale nan tou de premye eta yo (1 ak 2), jan yo montre nan Fig. 2.

Detay sou pann Cloudflare nan 2 jiyè 2019

Nan Fig. 2 montre sa k ap pase lè li gade premye a x в x=x. x ka kat jeyografik nan pwen an tèt, ale soti nan eta 1 epi tounen nan eta 1. Oswa x ka kat jeyografik nan pwen ki anba a, ale soti nan eta 2 epi tounen nan eta 2.

Apre matche premye a x в x=x nou toujou nan eta 1 ak 2. Nou pa ka rive nan eta 3 oswa 4 paske nou bezwen yon karaktè literal. =.

Algorithm a Lè sa a, konsidere = в x=x. Tankou x anvan li, li ka matche ak youn nan de bouk ki pi wo yo soti nan eta 1 a nan eta 1 oswa soti nan eta 2 a nan eta 2, men algorithm la ka matche ak literal la. = epi deplase soti nan eta 2 a nan eta 3 (e imedyatman 4). Sa a montre nan Fig. 3.

Detay sou pann Cloudflare nan 2 jiyè 2019

Lè sa a, algorithm la deplase sou dènye a x в x=x. Soti nan eta 1 ak 2 menm tranzisyon yo posib tounen nan eta 1 ak 2. Soti nan eta 3 x ka matche ak pwen ki sou bò dwat la epi retounen nan eta 3.

Nan etap sa a, chak karaktè x=x konsidere, epi depi nou rive nan eta 4, ekspresyon regilye a matche ak fisèl sa a. Chak karaktè trete yon fwa, kidonk algorithm sa a se lineyè nan longè fisèl D '. E pa gen bak.

Li evidan, apre yo fin rive nan eta 4 (lè algorithm la matche x=) tout ekspresyon regilye a matche, epi algorithm la ka fini san yo pa konsidere li ditou x.

Algorithm sa a depann lineyèman sou gwosè fisèl D '.

Sous: www.habr.com

Add nouvo kòmantè