    <?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>XmasBXmasB &#187; Geek</title>
	<atom:link href="http://xmasb.com/category/geek/feed/" rel="self" type="application/rss+xml" />
	<link>http://xmasb.com</link>
	<description>Be spontaneous! You go first.</description>
	<lastBuildDate>Wed, 09 May 2012 06:22:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Et lite knippe Android apps</title>
		<link>http://xmasb.com/2011/05/26/et-knippe-android-apps/</link>
		<comments>http://xmasb.com/2011/05/26/et-knippe-android-apps/#comments</comments>
		<pubDate>Thu, 26 May 2011 13:53:52 +0000</pubDate>
		<dc:creator>Yngve Thoresen</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Apps]]></category>
		<category><![CDATA[Mobil]]></category>

		<guid isPermaLink="false">http://xmasb.com/?p=1483</guid>
		<description><![CDATA[Jeg fikk nylig en forespørsel om anbefalinger til apps på Android. Ettersom kanskje flere kunne ha nytte av dette har jeg like så godt lagt ut listen her. Alle appene er gratis eller lite versjoner (noe funksjonalitet kun i fullversjon) med mindre annet er oppgitt. Jeg har delt appene opp i følgender kategorier (noen passer [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg fikk nylig en forespørsel om anbefalinger til apps på Android. Ettersom kanskje flere kunne ha nytte av dette har jeg like så godt lagt ut listen her. Alle appene er gratis eller lite versjoner (noe funksjonalitet kun i fullversjon) med mindre annet er oppgitt.</p>
<p>Jeg har delt appene opp i følgender kategorier (noen passer flere steder):<br />
<a href="#nyttig">Nyttig</a><br />
<a href="#kommunikasjon">Kommunikasjon</a><br />
<a href="#media">Media</a><br />
<a href="#spill">Spill</a><br />
<a href="#sosialt">Sosialt/nettverk</a><br />
<a href="#mindrenyttig">Mindre nyttig</a></p>
<p><strong id="nyttig">Nyttig:</strong><br />
<a href="http://market.android.com/details?id=net.rgruet.android.g3watchdog">3G Watchdog</a>: Lar deg overvåke datatrafikk. Kan også sette grense for bruk.</p>
<p><a href="http://market.android.com/details?id=com.a0soft.gphone.app2sd">App 2 SD Free</a>: Kjekk app som sier ifra om en app kan flyttes til SD. Mest nyttig for de med lite internminne, som f.eks HTC Desire.</p>
<p><a href="http://market.android.com/details?id=com.modroid.battery">Battery Graph</a>: Viser en enkel graf over batteri over tid.</p>
<p><a href="http://market.android.com/details?id=vStudio.Android.Camera360">Camera360 Free</a>: En av de bedre appene heg har testet for kreative effekter med kamera. Har mange muligheter.</p>
<p><a href="http://market.android.com/details?id=com.google.android.apps.chrometophone">Chrome to Phone</a>: Gir mulighet for å sende tekst, linker, bilder mm til mobilen fra Chrome.</p>
<p><a href="http://market.android.com/details?id=com.dropbox.android">Dropbox</a>: Tilgang til filer på Dropbox fra mobilen. Jeg har flere bruksområder for denne, men først og fremst gir det meg en rask måte å få kopiert små filer mellom pc og mobil.</p>
<p><a href="http://market.android.com/details?id=com.ctrlplusz.getpvr">G PVR</a>: Lar meg se TV-guide og sette pgrogram til opptak på Get PVR boksen. I praksis bare en frontend for http://m.get.no.</p>
<p><a href="http://market.android.com/details?id=com.gulesider.android">Gulesider</a>: Navn, adressser, telefonnummer, kart osv. Noen små bugs, men veldig bra. En nyttig funksjon er å slå opp ukjente nr ved anrop.</p>
<p><a href="http://market.android.com/details?id=com.google.android.apps.maps">Kart (Google Maps)</a>: Kart på mobilen brukes oftere enn man skulle tro. Og med Street View er det litt ekstra moro: Street View: http://market.android.com/details?id=com.google.android.street. Nyttig og kunne se et område før man drar dit, så kjenner du deg igjen når du kommer frem.</p>
<p><a href="http://market.android.com/details?id=no.smartphones.matprat">MatPrat</a>:  En haug med oppskrifter.</p>
<p><a href="http://market.android.com/details?id=com.evancharlton.mileage">Mileage</a>: Historikk over bensin-/dieselforbruk. Med alt som er fornuftig av info og litt til.</p>
<p><a href="http://market.android.com/details?id=com.arnonse.savenum">Number Saver</a>: Kjekk liten app som gjør det lettere å notere under samtale.</p>
<p><a href="http://market.android.com/details?id=org.openintents.shopping">OI Shopping list</a>: Den beste handleliste appen jeg har prøvd. SpringPad har også tilsvarende funksjonalitet, men ikke så smooth som denne.</p>
<p><a href="http://market.android.com/details?id=se.petersson.prisjakt">Prisjakt</a>: Prisjakt har etterhvert blitt den beste prisguiden på nett. Nå er den det også på mobil. Jeg har spart en del tusen på denne app&#8217;en ved å sjekke pris mens jeg står i butikk.</p>
<p><a href="http://market.android.com/details?id=com.bwx.bequick">Quick Settings</a>: Gir rask tilgang til de viktigste instillingene ved å dra ned statusbar på skjermen. Kan tilpasses eget behov.</p>
<p><a href="http://market.android.com/details?id=com.fitnesskeeper.runkeeper.pro">RunKeeper</a>: Hold oversikt over treningen med en enkel app. Er på sitt beste ved jogging, sykling og andre aktiveter hvor GPS kan brukes. Toveis kommunikasjon med server på runkeeper.com. Andre alternativ kan være cardiotrainer og endomondo (jeg har ikke prøvd noen av disse).</p>
<p><a href="https://market.android.com/details?id=com.android.inputmethod.norwegian">Scandinavian Keyboard</a>: Jeg bruker SlideIt selv, men dette er et veldig alternativ hvis du vil ha et &laquo;klassisk&raquo; tastatur.</p>
<p><a href="http://market.android.com/details?id=com.geeksoft.screenshot">screenshot</a>: Gjør det enkelt å ta screenshot av på mobilen. Krever root.</p>
<p><a href="http://market.android.com/details?id=com.mattlary.shareMyApps">ShareMyApps</a>: En av de enklere appene for å lage en liste over apps. Som f.eks denne listen her.</p>
<p><a href="http://market.android.com/details?id=com.dasur.slideit">SlideIT Keyboard</a> (&euro;4,50): Don&#8217;t type. Slide. Verdt hver eneste krone/euro. Norsk tastatur: <a href="http://market.android.com/details?id=com.dasur.language.nor.pack">SlideIT Norwegian Pack</a></p>
<p><a href="http://market.android.com/details?id=com.zegoggles.smssync">SMS Backup+</a>: Legger alle SMS og MMS i GMail med egen label. Sammen med søkbarheten til Gmail er det lettere enn noengang å finne igjen gamle SMS. Har også mulighet til å gjenopprette fra Gmail.</p>
<p><a href="http://market.android.com/details?id=com.springpad">Springpad</a>: Genial app og nettside som erstatning for blant annet gule lapper. Jeg bruker det som en kombinasjon av gule lapper og bokmerker.</p>
<p><a href="http://market.android.com/details?id=org.swiftp">SwiFTP</a>: Sett opp mobilen som FTP server. Eneste kabel en mobil trenger er lader.</p>
<p><a href="http://market.android.com/details?id=net.dinglisch.android.taskerm">Tasker</a> (&pound;3,99): Hva denne appen ikke lar deg gjøre er ikke verdt å gjøre. Sett opp alle mulige regler for hvordan mobilen skal oppføre seg under gitte situasjoner. Eksempel: vis meny med oversikt over aktuelle apps når hodetelefoner plugges i, demp lyd når du er på jobb (selvsagt tilbake igjen når du forlater jobb), automatisk skru av lyd på møter (via kalender), og så videre. Her er det (nesten) bare fantasien som setter grenser.</p>
<p><a href="http://market.android.com/details?id=com.keramidas.TitaniumBackup">Titanium Backup</a>: Tar backup av apps og instillinger. Krever root.</p>
<p><a href="http://market.android.com/details?id=com.neuron.trafikanten">Trafikanten</a>: Trafikanten i lomma. Får jobben gjort.</p>
<p><a href="http://market.android.com/details?id=com.alienmanfc6.wheresmyandroid">Where&#8217;s My Droid</a>: Hjelper deg å finne igjen mobilen, og/eller få den til å ringe ved å sende SMS eller epost. Har også en funksjon for å sende SMS ved bytte av SIM kort.</p>
<p><strong id="kommunikasjon">Kommunikasjon:</strong><br />
<a href="http://market.android.com/details?id=com.jb.gosms">GO SMS Pro</a>: Om du ikke er fornøyd med den innebygde appen for meldinger kan jeg anbefale denne. Med popup, tema og masse tilpasningsmuligheter.</p>
<p><a href="http://market.android.com/details?id=com.glympse.android.glympse">Glympse</a>: Send info om hvor du er på SMS, epost eller link. Lar deg selv styre hvor lenge brukere kan se deg. Realtime.</p>
<p><a href="http://market.android.com/details?id=com.google.android.gm">Gmail</a>: Gmail er en naturlig del av enhver Android telefon/nettbrett.</p>
<p><strong id="media">Media:</strong><br />
<a href="http://market.android.com/details?id=com.imdb.mobile">IMDb</a>: Finn info og rating på filmer. Savner mulighet for å logge inn og gi rating fra mobilen, men ellers en veldig god app.</p>
<p><a href="http://market.android.com/details?id=fm.last.android">Last.fm</a>: Scrobble låter til last.fm. Støtter de fleste musikkavspillere, også stock. Også nyttig for å finne info om blant annet artister og album.</p>
<p><a href="http://market.android.com/details?id=com.google.android.apps.listen">Listen</a>: Podcast klient fra Google. Støtter ikke last.fm. <img src='http://xmasb.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Blir enten elsket eller hatet.</p>
<p><a href="http://market.android.com/details?id=com.newsrob">NewsRob</a>: Feedleser med toveis synkronisering mot Google Reader. Offisiel Google Reader er også en god app, men NewsRob har noen ekstra funksjoner jeg liker.</p>
<p><a href="http://market.android.com/details?id=net.nextepisode.android">Next Episode</a> (3&euro;): Genial nettside  for de som ser mye TV-serier har nå kommet med en genial app. Følg serier og hold deg oppdatert på hvilke episoder som er sett og ikke.</p>
<p><a href="http://market.android.com/details?id=com.melodis.midomiMusicIdentifier.freemium">SoundHound</a>: Det finnes flere apps som lar brukeren finne igjen en sang ved å spille den for mobilen. Men SoundHound kan du synge til selv, eller bare nynne! Ikke en jeg bruker ofte, men det hender. Gratisversjonen har begrensinger på antall oppslag og noen features. Fullversjon koster &#36;4,99.</p>
<p><a href="http://market.android.com/details?id=com.spotify.mobile.android.ui">Spotify</a>: Spotify på mobilen. Krever Unlimited abbonoment på 99,-/mnd for full bruk. Støtter også lokal musikk, men organiserer dette veldig dårlig slik at alt av lydfiler dukker opp. Dette inkluderer ringetoner og lydfiler for programmer på SD.</p>
<p><a href="http://market.android.com/details?id=com.google.android.youtube">YouTube</a>: YouTube i lomma. Nuff said.</p>
<p><strong id="spill">Spill:</strong><br />
<a href="http://market.android.com/details?id=com.rovio.angrybirds">Angry Birds</a>, <a href="http://market.android.com/details?id=com.rovio.angrybirdsseasons">Angry Birds Seasons</a> og <a href="http://market.android.com/details?id=com.rovio.angrybirdsrio">Angry Birds Rio</a>: Tidenes mest suksessrike spill på mobil. Gratis på Android, men litt irriterende reklame.</p>
<p><a href="http://market.android.com/details?id=com.magicwach.rdefense">Robo Defense</a> (&#36;2,99): Tower Defense spill. Blir noe ensformig etter cirka 50+ timer.</p>
<p><strong id="sosialt">Sosialt/nettverk:</strong><br />
<a href="http://market.android.com/details?id=com.facebook.katana">Facebook</a>: Facebook i lomma.</p>
<p><a href="http://market.android.com/details?id=com.joelapenna.foursquared">Foursquare</a>: Foursquare lar deg &laquo;sjekke&raquo; inn på steder du besøker. Med ankomsten av Facebook Places mistenker jeg at denne har mistet mange brukere. Bruker den ikke lenger selv.</p>
<p><a href="http://market.android.com/details?id=com.linkedin.android">LinkedIn</a>: LinkedIn i lomma.</p>
<p><a href="http://market.android.com/details?id=com.thedeck.android.app">TweetDeck</a>: Verdens beste Twitter klient etter min mening. Med støtte for flere kontoer og kolonner er den overlegen.</p>
<p><a href="http://market.android.com/details?id=org.wordpress.android">WordPress</a>: Skriv/rediger poster og sider. Håndter og svar kommentarer. Sjekk trafikk. Alt via mobilen.</p>
<p><strong>Verktøy:</strong><br />
<a href="http://market.android.com/details?id=com.hobbyone.HashDroid">Hash Droid</a>: Verktøy for å lage en hash med mange funksjoner fra tekst eller fil. Jeg kan forstå at ikke har bruk for denne, men jeg bruker den ofte nok.</p>
<p><a href="http://market.android.com/details?id=com.google.android.apps.docs">Docs</a>: Google Docs på mobilen. La deg åpne, opprette, endre og slette dokumenter av forskjellige typer på mobilen.</p>
<p><a href="http://market.android.com/details?id=la.droid.qr">QR Droid</a>: Les og lag QR koder via mange kanaler.</p>
<p><strong id="mindrenyttig">Mindre nyttig:</strong><br />
<a href="http://market.android.com/details?id=hu.monsta.bcw">Binary clock widget</a>: Widget som viser tiden binært. Geeky!</p>
<p><a href="http://market.android.com/details?id=com.piviandco.fatbooth">FatBooth</a>: Legger cirka 80 kilo på ansiktsbilder. Ikke populær blant koner og mødre. Trust me.</p>
<p><a href="http://market.android.com/details?id=com.flikie.wallpapers.hd">Flikie Wallpapers HD</a>: Vannvittig mange bakgrunnsbilder lett tilgjengelig.</p>
<p><a href="http://market.android.com/details?id=com.godvillegame.android">Godville</a>: ZPG (Zero Player Game). Nyttverdi = 0. Men noen morsomme kommentarer iblant. Ok, jeg vet ikke helt hvorfor denne er med på listen.</p>
<p><a href="http://market.android.com/details?id=com.google.android.apps.unveil">Goggles</a>: Googles har en del morsomme triks tilgjengelig. Høydepunktet for min del var når jeg tok bilde av et bilde jeg hadde tatt av moske, og den fortalte meg hva moskeen het med tilhørende info. Kan ogsø løse sudoku ved å ta et bilde av brettet. Den kan også oversette tekst og hente ut kontaktinfo ved å ta bilde av visittkort med mer. Prøv den.</p>
<p><a href="http://market.android.com/details?id=com.google.android.stardroid">Google Sky Map</a>: Verdensrommet i lomma. Prøv den. Om ikke annet som en show-off app.</p>
<p><a href="http://market.android.com/details?id=com.eclipsim.gpsstatus2">GPS Status</a>: Få diverse info fra GPS&#8217;en.</p>
<p><a href="http://market.android.com/details?id=com.chartcross.gpstest">GPS Test</a>: Enda en &laquo;Få diverse info fra GPS&#8217;en&raquo;. Husker ikke hvilen jeg likte best, de er ganske like.</p>
<p><a href="http://market.android.com/details?id=net.cachapa.libra">Libra</a>: Lar deg følge vektuvikling med en pen graf. Bare legg inn vekten din (hver dag, ukentlig eller en gang iblant), så ordner den resten. Om ikke annet så kan det være en vekker om grafen stiger jevnt og trutt. <img src='http://xmasb.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://market.android.com/details?id=no.buypass.mobile">Norsk Tipping Mobilspill</a>: Den styggeste appen jeg har. Min første selvlagde app for Android var penere enn denne. Men det er også den eneste og offisielle Norsk Tipping app&#8217;en til Android. Hvorfor de ikke har kopiert blindt fra iPhone versjonen er et stort mysterium.</p>
<p><a href="http://market.android.com/details?id=ar.com.ps3argentina.trophies">PS3 Trophies</a>: Egen app for Playstation 3 trophies. Begrenset bruksverdi.</p>
<p><a href="http://market.android.com/details?id=com.andrewshu.android.reddit">reddit is fun</a>: Les reddit på farten.</p>
<p><a href="http://market.android.com/details?id=com.ringdroid">Ringdroid</a>: Rediger og lag dine egne ringetoner fra mp3 filene dine.</p>
<p>Dette er en høyst subjektiv liste over apps jeg har, eller har hatt, på min mobil. Har du forslag til andre apps som burde være med, eller kanskje bedre alternativer til disse, er du velkommen til å legge igjen en kommentar om dette.</p>
]]></content:encoded>
			<wfw:commentRss>http://xmasb.com/2011/05/26/et-knippe-android-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hotlinkere er som oftest fjortiser</title>
		<link>http://xmasb.com/2010/12/02/hotlinkere-er-som-oftest-fjortiser/</link>
		<comments>http://xmasb.com/2010/12/02/hotlinkere-er-som-oftest-fjortiser/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 13:50:20 +0000</pubDate>
		<dc:creator>Yngve Thoresen</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[Bilder]]></category>
		<category><![CDATA[Blogg]]></category>
		<category><![CDATA[Hotlinking]]></category>
		<category><![CDATA[Tyveri]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://xmasb.com/?p=1403</guid>
		<description><![CDATA[Jeg skrev tidligere en liten innføring i hvordan jeg har stoppet hotlinkere fra å vise bilder liggende på bloggen min. Der beskrev jeg hvordan jeg brukte .htaccess filen for å hindre de jeg la til i listen. Dette fungerer glimrende og har egentlig ingen store ulemper. Jeg oppnår det jeg vil, som altså er å [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg skrev tidligere en liten innføring i hvordan jeg har stoppet hotlinkere fra å vise bilder liggende på bloggen min. Der beskrev jeg hvordan jeg brukte .htaccess filen for å hindre de jeg la til i listen. Dette fungerer glimrende og har egentlig ingen store ulemper. Jeg oppnår det jeg vil, som altså er å hindre uvedkommende i å stjele båndbredden min.</p>
<p>Men det kan bli så mye bedre. Jeg savner nemlig et par ting. Nemlig å se hvilke som blir fanget opp er tungvint, og ikke minst kunne kontrollere tilgang raskt og effektivt basert på data i sanntid.</p>
<p>Eneste måten jeg kan se hvem som snylter på er nemlig å gå gjennom logger, for så å plukke ut de som synder mest (eller bruke fantastisk lang tid på å lete i loggene&#8230;). Og ettersom jeg ønsker å kunne se hvorvidt tiltaket virker (eller bare bidrar til gratis reklame for meg) er det ingen god løsning å lete i logger som kun viser fordeling på måned.</p>
<p>Men det var før. Nå har jeg gjort noen små endringer som fungerer enda bedre. Kan det fungere bedre enn glimrende sier du? Javisst. Følg med.</p>
<p>I den nye versjonen har jeg byttet ut loggfilen med et par tabeller i databasen min. En tabell styrer tilgang og en er for logg. htacces filen er endret til å sende alle forespørsler som ikke er fra eget domene eller et fåtall andre, deriblant bildesøk fra google, til et php script som tar seg kontroll og visning av bilder. Alt som som routes til scriptet logges med nødvendig info.</p>
<p>Tabellen som styrer tilgang har et flagg som forteller om det aktuelle domenet skal få tilgang til bildene. Om domenet ikke ligger i tabellen fra før blir det lagt til, med tilgang. Ønsker jeg å fjerne eller gi tilgang kan jeg når som helst endre dette. Verdien fra denne tabellen brukes for å vise det riktige bildet eller denne <a href="http://xmasb.com/wp-content/uploads/hotlink.jpg">snasne dama</a>.</p>
<p>Tabellen for logging inneholder hver eneste forespørsel som blir gjort med henvisende url, bildets url, domeneid koblet til tilgangstabellen, og hvorvidt tilgang er gitt. Dermed har jeg mulighet til å trekke ut det jeg trenger av statistikk. Og statistikk liker jeg, så det viser jeg med all data jeg har tilgengelig. Jeg har derfor statistikk fordelt på domener, bilder, tilgang, tidspunkt, i topplister og siste treff. IP og denslags logger jeg ikke.</p>
<p>Og hvis noen lurer på overskriften kan jeg fortelle at blogg.no står for brorparten av hotlinkere mot denne bloggen, sammen med et par forum hvor brukere har hotlinket avatar bildet sitt fra bloggen min. De bytter nok ganske snart&#8230;</p>
<p>Se forøvrig mer om <a href="http://www.halolz.com/2008/03/10/hot-link-on-link-action/">hot linking</a> her.</p>
<p><strong>Oppdatering:</strong><br />
Koden for <a href='http://xmasb.com/wp-content/uploads/2010/12/hotlink.txt'>php scriptet er lagt ut</a>. Husk å endre filen til php, samt legge inn server, brukernavn, passord og database. Jeg benytter samme database som for WordPress, men med annet prefix for å skille tilhørighet for tabellene fra hverandre.</p>
<p><strong>PHP (scriptet i filen du finner over):</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'hotlinkimage'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'donthotlink.jpg'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
	<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ref_domain'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'referrer'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fullurl'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://'</span><span style="color: #339933;">.</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_HOST'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// mod_rewrite should have already established that it is a hot-link.</span>
	<span style="color: #666666; font-style: italic;">// This is a double-check. We need to capture the referrer, anyway.</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_REFERER'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'referrer'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_REFERER'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ref_domain'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'referrer'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'referrer'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// splitting the referrer into a domain part, saves us searching for multiple variations.</span>
	<span style="color: #666666; font-style: italic;">// so long as your host name appears somewhere in the domain part, it's not a hot-link.</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">stristr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ref_domain'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_HOST'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000088;">$domain</span> <span style="color: #339933;">=</span> getDomain<span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ref_domain'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			log_hotlink_to_db<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #339933;">,</span> <span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'referrer'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fullurl'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			serveImage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'../'</span><span style="color: #339933;">.</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
			log_hotlink_to_db<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #339933;">,</span> <span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'referrer'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fullurl'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			serveImage<span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'hotlinkimage'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
		serveImage<span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// No url? Redirect them to the main site.</span>
	<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Location: http://&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_HOST'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>En enkel klasse for domene. Kunne godt laget en klasse for referrer også, men er ikke nødvendig.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>46
47
48
49
50
51
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Simple class for domain</span>
<span style="color: #000000; font-weight: bold;">class</span> Domain<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$id</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$domain</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$allow</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Logge til db.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>53
54
55
56
57
58
59
60
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//log the attempt to db</span>
<span style="color: #000000; font-weight: bold;">function</span> log_hotlink_to_db<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referrer</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$allowed</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$db_connection</span> <span style="color: #339933;">=</span> getDBConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db_connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO hotlink_log (domain_id, referrer,url,allow) VALUES (?,?,?,?)&quot;</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Failed to prepare the statement!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bind_param</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;issi&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referrer</span><span style="color: #339933;">,</span><span style="color: #000088;">$url</span><span style="color: #339933;">,</span><span style="color: #000088;">$allowed</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Et par funksjoner for å håndtere domener.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> getDomain<span style="color: #009900;">&#40;</span><span style="color: #000088;">$ref_domain</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/^www./i&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$ref_domain</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// WWW. is deprecated anyway...</span>
		<span style="color: #000088;">$ref_domain</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/^www./i&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ref_domain</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000088;">$domain</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Domain<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">domain</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ref_domain</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$domain</span> <span style="color: #339933;">=</span> checkDomain<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		insertNewDomain<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$domain</span> <span style="color: #339933;">=</span> checkDomain<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$domain</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> checkDomain<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$db_connection</span> <span style="color: #339933;">=</span> getDBConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db_connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT id, allow FROM hotlink_access WHERE domain = ?&quot;</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Failed to prepare the statement!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bind_param</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;s&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">domain</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bind_result</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$allow</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$id</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$allow</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$domain</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> insertNewDomain<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$db_connection</span> <span style="color: #339933;">=</span> getDBConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db_connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO hotlink_access (domain,allow) VALUES (?,1)&quot;</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Failed to prepared the statement!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bind_param</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;s&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">domain</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//$statement-&gt;affected_rows</span>
&nbsp;
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Vær så god, her har du et bilde. Håper du blir fornøyd.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> serveImage<span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span> and <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img_type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">end</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'.'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strcasecmp</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img_type'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'png'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefrompng</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #990000;">imagesavealpha</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strcasecmp</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img_type'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'jpg'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">||</span> <span style="color: #990000;">strcasecmp</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img_type'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'jpeg'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefromjpeg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strcasecmp</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img_type'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'gif'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefromgif</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #990000;">trigger_error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;HOTLINK - Image <span style="color: #006699; font-weight: bold;">$url</span> is of unknown type&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">E_USER_ERROR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #666666; font-style: italic;">//TODO Other file types?</span>
&nbsp;
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Log image not found!</span>
		<span style="color: #990000;">trigger_error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;HOTLINK - Image <span style="color: #006699; font-weight: bold;">$url</span> was not found&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">E_USER_ERROR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// send the image to the browser..</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img_type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'png'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-type: image/png'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">imagepng</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;there was an error. sorry about that...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-type: image/jpg'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">imagejpeg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;there was an error. sorry about that...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #990000;">imagedestroy</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'img'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Skaff en connection til db. Det er her data om server, brukernavn, passord og database skal inn.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>135
136
137
138
139
140
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> getDBConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$db_connection</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mysqli<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;server&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;username&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;password&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;database&quot;</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Failed to obtain connection to db!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$db_connection</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p><strong>Databasetruktur (SQL) er som følger:</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> hotlink_access <span style="color: #66cc66;">&#40;</span>
  id <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">DOMAIN</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  allow <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>  <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> hotlink_log <span style="color: #66cc66;">&#40;</span>
  id <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
  domain_id <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  referrer <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">200</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  url <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  allow tinyint<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">TIME</span> <span style="color: #993333; font-weight: bold;">TIMESTAMP</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CURRENT_TIMESTAMP</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>  <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>Egentlig er det også en timestamp i access tabellen også, men den trengs strengt tatt ikke da samme data ligger i loggtabellen.</p>
<p>Til slutt den delen som gjør selve redirekten:<br />
<strong>.htaccess filen:</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;"># BEGIN Hotlink stopper</span>
<span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">On</span>
<span style="color: #00007f;">RewriteCond</span> %{HTTP_REFERER} !^$
<span style="color: #00007f;">RewriteCond</span> %{HTTP_REFERER} !^http(s)?://(www\.)?xmasb\. [NC]
<span style="color: #00007f;">RewriteCond</span> %{HTTP_REFERER} !^http(s)?://((.+)\.)?google\.(.+imgres) [NC]
<span style="color: #00007f;">RewriteCond</span> %{HTTP_REFERER} !^http(s)?://((.+)\.)?google\.(.+reader) [NC]
<span style="color: #00007f;">RewriteRule</span> ^(.*)\.(gif|jpe?g|png)$ http://%{HTTP_HOST}/hotlink/hotlink.php?url=$1.$2 [R,NC,L]
<span style="color: #adadad; font-style: italic;"># END Hotlink stopper</span></pre></td></tr></table></div>

<p>Alle request som ikke er direkte på bildene (gif|jpe?g|png), via xmasb, google&#8217;s bildesøk eller google reader blir sendt til scriptet. Scriptet sørger for resten.<br />
Her kan alle tillatte domener legges inn, så det ikke brukes unødig prossesering på tillatte domener. Eksempel på andre domener som kanskje bør ligge her er RSS lesere (Google, Bloglines, Netvibes f.eks) og andre sider for bildesøk. Det fine med denne fremgangsmåten er at det er lett å oppdage disse underveis, uten at de er utestengt i mellomtiden.</p>
<p>Det er lett å bare legge inn Google som tillatt domene i htaccess filen, men husk at det også eksisterer noe som heter sites.google.com. Scriptet får et par treff om dagen derfra.</p>
<p><strong>Oppdatering 2:</strong><br />
Har gjort en liten endring til på scriptet mitt. Ettersom blant annet blogg.no er kraftig overrepresentert i loggene er det like greit å sperre de ute med en gang. Jeg kunne selvsagt gjort dette via htaccess filen, men får å få med loggingen tar jeg de via scriptet likevel. For å gjøre dette har jeg gjort følgende endring i insertNewDomain funksjonen:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>138
139
140
141
142
143
144
145
146
147
148
149
150
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> insertNewDomain<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #339933;">,</span> <span style="color: #000088;">$allow</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$hotlink</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>anyNeedleInString<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">domain</span><span style="color: #339933;">,</span> <span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'blockedBaseDomains'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$allow</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$db_connection</span> <span style="color: #339933;">=</span> getDBConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db_connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO hotlinkaccess (domain,allow) VALUES (?,?)&quot;</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Failed to prepared the statement!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bind_param</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;si&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$domain</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">domain</span><span style="color: #339933;">,</span> <span style="color: #000088;">$allow</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//$statement-&gt;affected_rows</span>
&nbsp;
	<span style="color: #000088;">$statement</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>AnyNeedleInString ser slik ut:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>187
188
189
190
191
192
193
194
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> anyNeedleInString<span style="color: #009900;">&#40;</span><span style="color: #000088;">$haystack</span><span style="color: #339933;">,</span> <span style="color: #000088;">$needle</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$needle</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$search_needle</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">stristr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$haystack</span><span style="color: #339933;">,</span> <span style="color: #000088;">$search_needle</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Og så er det bare å definere en array som inneholder de domener man ikke vil ha med:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$hotlink</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'blockedBaseDomains'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'blogg.no'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'nettby.no'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Her illustrert med blogg.no og nettby.no. Dermed slipper jeg å håndtere de som tilhører diverse plattformer. Smart, ikke sant?</p>
]]></content:encoded>
			<wfw:commentRss>http://xmasb.com/2010/12/02/hotlinkere-er-som-oftest-fjortiser/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Hvordan jeg stopper hotlinkere &#8211; og får gratis reklame for xmasb.com</title>
		<link>http://xmasb.com/2010/11/17/hvordan-jeg-stopper-hotlinkere/</link>
		<comments>http://xmasb.com/2010/11/17/hvordan-jeg-stopper-hotlinkere/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 12:02:21 +0000</pubDate>
		<dc:creator>Yngve Thoresen</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[Bilder]]></category>
		<category><![CDATA[Hotlinking]]></category>
		<category><![CDATA[Reklame]]></category>

		<guid isPermaLink="false">http://xmasb.com/?p=1346</guid>
		<description><![CDATA[En gang i blant sjekker jeg statistikk for bloggen. Etter som årene har gått (og hyppigheten på bloggingen har gått noe ned) har jeg sluttet å lese statistikk annen hver dag. Men det hender jeg sjekker litt, mest for å se etter endring i mønsteret, og hvilke poster og sider som mottar mest trafikk. En [...]]]></description>
			<content:encoded><![CDATA[<p>En gang i blant sjekker jeg statistikk for bloggen. Etter som årene har gått (og hyppigheten på bloggingen har gått noe ned) har jeg sluttet å lese statistikk annen hver dag. Men det hender jeg sjekker litt, mest for å se etter endring i mønsteret, og hvilke poster og sider som mottar mest trafikk. En sjelden gang iblant går jeg litt dypere til verks og sjekker da hvilke ressurser på serveren som får mest trafikk, sånn som bilder.</p>
<p>Når jeg gjorde dette i går fant jeg ut, ikke overraskende, at det er mye trafikk fra diverse nettsider som henter bilder fra meg. Begrepet <a href="http://xmasb.com/2007/12/28/stopp-tyven/">hotlinking</a> har jeg vært innom før,  for snart tre år siden satte jeg i gang <a href="http://xmasb.com/2008/01/03/anti-hotlinking/">tiltak</a>. Men som så mye annet krever det en viss vedlikehold, så det var på tide å gjøre noen grep igjen. Etter tre år skulle det vise seg å være mange som stjeler båndbredde av meg.</p>
<p>Mens jeg tidligere har tatt i bruk et bilde som forteller at det er slemt å hotlinke syntes jeg dette var en gyllen mulighet for to ting: å spre reklame for bloggen min (selv om jeg har cirka null kontroll over hvor den blir vist), og en mulighet for å være litt morsom på andres bekostning. Sistnevnte fikk umiddelbart høyest prioritet av åpenbare grunner.</p>
<p>Her er et bilde jeg tidligere har brukt for de som hotlinker fra meg:<br />
<img src="http://xmasb.com/wp-content/uploads/hotlink.jpg" width="300" height="225" alt="Hotlink Text" class="aligncenter" /></p>
<p>Det har jo absolutt gjort nytten sin. De færreste ønsker å vise det fremfor det de egentlig ville ha, som kanskje var en søt valp eller et juletre. Så de bytter til noe annet, eller kopierer bildet fra meg. Å kopiere bilder fra bloggene til andre er et tema vi ikke trenger å gå inn på nå. Så lenge det ikke er bilder jeg selv har tatt/laget tar jeg det uansett ikke så tungt.</p>
<p>Fremgangsmåten for å hindre hotlinkere var omtrent som forrige gang, men med en liten tvist: nytt bilde og logging av misbrukere. Loggingen er ikke så viktig i seg selv, og jeg kommer nok til å endre litt hvordan den virker også, men det kan være grei info å ha når jeg vil vite omfanget av hotlinking.</p>
<p>Det morsomme er bildet. Nedenfor følger et par eksempler på bilder som ofte blir hotlinket til på xmasb.com:</p>
<p>
<img src="http://xmasb.com/wp-content/uploads/sleeping-puppy.jpg" alt="" title="Sleeping Puppy" width="150" height="112" class="alignleft" /><img src="http://xmasb.com/wp-content/uploads/sunt_eple-150x150.jpg" alt="" title="Sunt Eple" width="150" height="150" class="alignleft" /><img src="http://xmasb.com/wp-content/uploads/kong-harald.jpg" alt="" title="Kong Harald i siget" width="106" height="150"  /></p>
<p>Jeg kan godt forstå at disse bildene kan være attraktive å bruke. Men jeg synes da bildet jeg serverer i stedet er mye morsommere. Det ser slik ut:</p>
<p><img src="http://xmasb.com/hotlink/donthotlink.jpg" alt="Don't hotlink xmasb.com!" class="aligncenter" /></p>
<p>Nå vil det ikke spare noe særlig på båndbredden i seg selv ved å servere et annet bilde, men de fleste velger å ikke bruke dette bildet av en eller annen grunn&#8230; Jeg kunne servert for eksempel &laquo;403 Forbidden&raquo; til requestet, og dermed spart hele båndbredden, men det er jo ikke noe moro. Og det gir meg litt ekstra reklame også. I oktober hadde bloggen like over 10000 visninger av bilder fra xmasb.com på andre domener. De fleste av sidene viser nå forrige viste bilde, eller har byttet.</p>
<p>Så hvordan har jeg egentlig gjort dette? Det er ikke vanskelig. Akkurat som forrige gang endret jeg .htaccess filen for å få effekten jeg ville ha. I slutten av denne filen la jeg til følgende:<br />
<code><br />
# BEGIN Hotlink stopper<br />
RewriteEngine on<br />
RewriteCond %{HTTP_REFERER} ^(.+\.)?blogg.no/ [NC,OR]<br />
RewriteCond %{HTTP_REFERER} ^(.+\.)?blogspot.com/ [NC,OR]<br />
RewriteCond %{HTTP_REFERER} ^(.+\.)?clublife.no/ [NC,OR]<br />
RewriteCond %{HTTP_REFERER} ^(.+\.)?livejournal.com/ [NC,OR]<br />
RewriteCond %{HTTP_REFERER} ^(.+\.)?myspace.com/ [NC,OR]<br />
RewriteCond %{HTTP_REFERER} ^(.+\.)?nettby.no/ [NC,OR]<br />
RewriteCond %{HTTP_REFERER} ^(.+\.)?trykker.com/ [NC,OR]<br />
RewriteCond %{HTTP_REFERER} ^(.+\.)?wordpress.com/<br />
RewriteRule ^(.*)\.(gif|jpe?g|png)$ http://%{HTTP_HOST}/hotlink/hotlink.php?url=$1.$2 [R,NC,L]<br />
# END Hotlink stopper<br />
</code><br />
For bedre lesbarhet har jeg fjernet de fleste fra listen. Kort fortalt gjør denne lille snutten at alle forsøk på å vise bilder fra oppgitte domener/sider fører til et kall av hotlink.php, som igjen serverer dama over og logger requestet. Jeg logger da url for siden som kaller, IP for besøkende av siden, tidspunkt og hvilket bilde som er forsøkt hotlinket. Mest sannsynlig kommer jeg også til å endre oppsettet senere til også å logge de som får lov til å vise bilder, for å kunne få en oversikt over disse og eventuelt lett blokkere flere.</p>
<p>Dersom logging ikke trengs eller er ønskelig kan det lett byttes ut med et bilde istedet for php script, men da er det viktig å legge til en linje som tillater bruk av det ene bildet hos de som egentlig ikke skal kunne se bilder fra bloggen. Følgende linje kan da legges inn rett før <code>Rewriterule</code>:</p>
<p><code>RewriteCond %{REQUEST_URI} !http://%{HTTP_HOST}/wp-content/uploads/hotlink.jpg</code></p>
<p>Denne tillater visning av bildet hotlink.jpg. Husk også å legge til en <code>OR</code> for siste i listen før denne.</p>
<p>Tidligere har jeg forsøkt å stoppe alle requests bortsett fra et knippe jeg tillatter, men dette har ikke fungert så godt som håpet. Problemet er blant annet lesere av feeden. Det er ikke noe problem å tillate Google, men hva med alle andre? Hvor mange og hvilke er det? Jeg har ihvertfall ikke en god oversikt. Tidligere forsøkt på dette har bare ført til frustrasjon da bilder i feeden hos for eksempel en som bruker Outlook som leser er vanskelig å ta høyde for. Stikkordet med løsningen jeg har valgt må være &laquo;godt nok&raquo;. Det krever en viss vedlikehold, men ikke verre enn at jeg går inn i loggen en gang iblant og luker ut de verste.</p>
<p>Som oftest er det ikke de bloggene som har to besøkende om dagen som er problemet, men forum og andre sider med høy aktivitet. I mitt tilfelle har jeg nok av båndbredde foreløpig, så da kan jeg godt servere et annet bilde istedet. Men jeg har sørget for at bildet er komprimert så mye som mulig likevel. Dersom du har tenkt å bruke tekst kan det være verdt å sjekke forskjellen i størrelse mellom flere formater (gif/jpg først og fremst).</p>
<p>Et siste tips. Når du tester om dette virker, typisk ved å se om bildet vises eller ikke på den siden som har hotlinket, vil gjerne nettleseren bruke det bildet du allerede har i cahe. De fleste nettlesere kan tvinges til å hente på ny ved å trykke ctrl-F5 eller tilsvarende.</p>
<p><em>Oppdatering: Jeg har gjort dette mye smidigere ved hjelp av litt <a href="http://xmasb.com/2010/12/02/hotlinkere-er-som-oftest-fjortiser/">enkel koding</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://xmasb.com/2010/11/17/hvordan-jeg-stopper-hotlinkere/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Er passordene dine sikre?</title>
		<link>http://xmasb.com/2010/02/23/sikre-passord/</link>
		<comments>http://xmasb.com/2010/02/23/sikre-passord/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 09:36:15 +0000</pubDate>
		<dc:creator>Yngve Thoresen</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[Nettsider]]></category>
		<category><![CDATA[Passord]]></category>
		<category><![CDATA[Sikkerhet]]></category>

		<guid isPermaLink="false">http://xmasb.com/?p=1269</guid>
		<description><![CDATA[I løpet av en vanlig dag benytter jeg mange passord og pinkoder for å verifisere meg mot ulike systemer. Jeg husker de aller fleste passord, men har funnet noen ulike metoder for å håndtere den uoversiktlige mengden av påloggingsinfo som er nødvendig gjennom både jobb og privat. For passord på jobb har jeg et passordbeskyttet [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://xmasb.com/wp-content/uploads/failed-security-259x300.jpg" alt="" title="failed-security" width="259" height="300" class="alignright size-medium wp-image-1270" />I løpet av en vanlig dag benytter jeg mange passord og pinkoder for å verifisere meg mot ulike systemer. Jeg husker de aller fleste passord, men har funnet noen ulike metoder for å håndtere den uoversiktlige mengden av påloggingsinfo som er nødvendig gjennom både jobb og privat. For passord på jobb har jeg et passordbeskyttet regneark for de mindre kritiske passordene. Dette er delt med et par andre utviklere. Det største problemet er faktisk å huske passordet til regnearket, da dette ikke brukes i noen annen sammenheng.</p>
<p>Privat bruker jeg, dessverre, ofte det samme passordet. Jeg har rundt regnet 10 ulike passord jeg benytter privat, de fleste følger det samme mønsteret – alle er kryptiske. Etter at noen misbrukte PayPal kontoen min har jeg endret passord for alle nettsider som kan tappe kredittkortet mitt for penger. Passordene er genererte strenger bestående av masse bokstaver, tall og tegn, som jeg ikke kjenner til. De ligger lagret i et eget program som krever enda et passord for å logge seg inn i. Trenger jeg tilgang til en av disse nettsidene må jeg gå gjennom dette programmet, eller få tilsendt et nytt passord. De aller fleste private passord ligger i dette programmet. Mister jeg nøkkelen inn i programmet, må jeg resette de fleste passord.</p>
<p>Jeg er opptatt av sikkerhet, men også opptatt av brukervennlighet. Ofte blir det et kompromiss for at vil ta i bruk en løsning. For noen systemer og nettsider er ikke sikkerheten like kritisk, og jeg velger å ta i bruk et standard passord. For andre steder velger jeg et autogenerert passord eller en variant av tidligere passord.</p>
<p>Når jeg da velger å ta i bruk smarte løsninger for å ta vare på sikkerheten blir jeg veldig skuffet når store og små leverandører ikke ser ut til å ta sikkerhet på alvor. Min sikkerhet. Et eksempel på dette er strømleverandøren min, Vitel (Tidligere strømleverandør. De har som kjent sluttet med strøm nå.). Som de fleste andre leverandører tilbyr de en mulighet for å få tilsendt innloggingsinformasjon dersom brukeren har glemt dette. Og som så mange andre gjør de den samme feilen og sender en epost med brukernavn og passord jeg registrerte meg med. Som om det ikke er nok finner jeg den samme informasjonen på hver eneste faktura.</p>
<p>Nå er det ikke slik at man kan gjøre spesielt stor skade ved å logge seg inn hos en strømleverandør, men passordet er nok for mange det samme som brukes mange andre steder. Sammen med epostadressen kan dette misbrukes i stor skala.</p>
<p>Så hvordan bør dette løses? Mange har skjønt det, og oppbevarer ikke passord i klartekst. Ei heller kan de hente ut passord når brukeren har glemt det. Man kan kun sjekke inntastet passord mot det som er registrert, ved å gjøre den samme kryptering på inntastet passord som ble gjort når passordet ble lagret første gang. Dersom brukeren har glemt passordet må nytt passord settes, enten ved at et passord genereres automatisk eller at brukeren setter nytt via en link som kan brukes en gang. Uansett bør brukeren kunne velge seg et nytt passord et sted i prosessen. De aller fleste gjør det på denne måten, men veldig mange slurver.</p>
<p><strong>Jeg har for lengst send en epost med min mening til min strømleverandør og flere andre. Gjør det du også, så kanskje de endrer sin praksis!</strong></p>
<p>Dette er eposten jeg sendte dem:</p>
<blockquote><p>
Jeg har en forespørsel angående deres praksis med å lagre og sende passord i klartekst over epost. I tillegg er også mitt passord skrevet i klartekst på alle fakturaer tilsendt meg. Hvorfor har dere behov for å lagre mitt personlige passord i klartekst?</p>
<p>Jeg stiller meg skeptisk til at dere har tilgang på mitt personlige passord og er bekymret over muligheten for at noen av deres ansatte eller andre tredjeparter kan få tilgang på passordet med å lytte på nettverket, lese mine faktura eller andre metoder.</p>
<p>Når dere sender mitt passord på epost, blir det overført over nettverket i klar-tekst og er lett leselig på ulike nettverks-rutere og lokasjoner.</p>
<p>Det burde ikke være noen tekniske eller funksjonelle behov som gjør at dere må lagre mitt personlig passord i klartekst eller med en reversibel kryptering. Det bør være nok med en ikke-reversibel hash av passordet.</p>
<p>Håper dere tar forespørselen til etterretning og forstår min bekymring for mitt privatvern.
</p></blockquote>
<p><em>Oppdatering! Jeg har fått svar på min henvendelse til Vitel:</em></p>
<blockquote><p>
Hei</p>
<p>Vi har hatt oppe denne saken før med post og teletilsynet og vi har gjort endel endringer i vårt system som post og teltilsynet har funnet tilfredstillende godt nok. Jeg lister opp en del punkter under som viser hva som er gjort.</p>
<p>- Ved å gå inn på &laquo;Mine sider&raquo; kan man velg bort at passord vises på faktura</p>
<p>- Ingen ansatte i Vitel har tilgang til å se ditt passord</p>
<p>- du kan selv velge passord på &laquo;Mine sider&raquo;</p>
<p>Når det gjelder at passord blir sendt over nettverk via epost eller sms så er dette helt vanlig praksis og informasjonen som evt. kan leses kan skjelden være av interesse for en tredjepart. Vi har gått gjennom våre rutiner sammen med pt og dette skal være sikret tilstrekkelig godt nok.</p>
<p>Håper dette var et beroligende svar.</p>
<p>Med vennlig hilsen</p>
<p>Kundesenter
</p></blockquote>
<p>De opererer med andre ord etter &laquo;godt nok&raquo;-taktikken. Jeg er ikke spesielt beroliget av en slik taktikk. Selvfølgelig har ansatte hos Vitel adgang til passord om de ønsker det, de sitter jo på dataene. Hvem som helst med tilstrekkelig adgang til riktige databaser kan hente ut denne informasjon. Utro tjenere finnes det mange av, og den beste måten å sikre seg mot disse er å ikke legge frem muligheter som dette. Nå er ikke jeg kunde hos Vitel lenger, da de ikke klarer levere strøm til meg uansett, men jeg endret fort passordet mitt når jeg fant ut av praksisen deres. Da er det greit med et kryptisk passord som jeg ikke kan selv engang. Eksempel på et slikt passord er (tilfeldig generert for meg nå): &laquo;cHQ^smX9G#sW&raquo;.</p>
<p>Jeg jobber i et miljø hvor sikkerhet er utrolig viktig. Dårlige løsninger kan eksponere personsensitive og medisinske data. Skikkelig dårlige løsninger kan gi ledere en grunn til å pakke sammen på dagen, og utvikler følger nok med skulle det skje. Ofte må derfor det vurderes hvor godt disse dataene skal beskyttes. Vi kan velge å gjøre dette &laquo;godt nok&raquo; for å tilfredsstille lover og regler, eller vi kan sørge for å gjøre det så bra at vi sover godt om natten. Vi velger alltid sistnevnte, fordi det ikke koster så mye mer og fordi vi har et rykte å tenke på. Det finnes (dessverre) mange eksempler på brukernavn og passord på avveie, fordi løsningen har vært &laquo;god nok&raquo;. Hva med å bare gjøre det bra med en gang? Så er også risikoen for feil fantastisk mye mindre!</p>
]]></content:encoded>
			<wfw:commentRss>http://xmasb.com/2010/02/23/sikre-passord/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Drømmemobilen</title>
		<link>http://xmasb.com/2009/08/27/drommemobilen/</link>
		<comments>http://xmasb.com/2009/08/27/drommemobilen/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 13:50:19 +0000</pubDate>
		<dc:creator>Yngve Thoresen</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[Mobil]]></category>

		<guid isPermaLink="false">http://xmasb.com/?p=1168</guid>
		<description><![CDATA[Utviklingen av nye mobiler går rasende fort. Det har den i grunn gjort ganske lenge nå virker det som. Min første mobil fikk jeg når jeg var 17 år gammel, ikke for tidlig, men heller ikke for sent den gang. Det var langt fra de fleste av vennene mine som hadde mobil den gangen heller. [...]]]></description>
			<content:encoded><![CDATA[<p>Utviklingen av nye mobiler går rasende fort. Det har den i grunn gjort ganske lenge nå virker det som. Min første mobil fikk jeg når jeg var 17 år gammel, ikke for tidlig, men heller ikke for sent den gang. Det var langt fra de fleste av vennene mine som hadde mobil den gangen heller. Min første mobil var en Motorola jeg kunne brukt som slagvåpen hadde det ikke vært for at den var bortimot hul. Den endte sitt liv i et herlig knas mot fortauskanten i Bardufoss sommeren 2000.</p>
<p>Siden har jeg hatt en del mobiltelefoner, stadig jakten på drømmemobilen. Jeg har enda ikke funnet den, men har vært nære noen ganger. Jeg har vært innom Motorola, Samsung, Nokia, Sony (importert fra Sverige), Sony Ericsson, QTek (senere HTC) og HTC. Litt av problemet er nettopp den raske utviklingen som hele tiden sørger for at mobiler blir foreldet i et voldsomt tempo. Min nåværende mobil, en HTC DIamond er nok den desidert beste telefonen jeg har hatt, men er ikke uten mangler og problemer den heller. Og den er i manges øyne allerede &laquo;gammel&raquo;. Men den fungerer finfint, og passer meg utmerket. Men man har likevel alltid lyst på noe nytt, ikke sant?</p>
<p>Jeg holder meg sånn passe oppdatert på mobiler om dagen. Det betyr at jeg leser noen artikler iblant, og jeg er alltid nysgjerrig når en bekjente eller kollegaer kommer med noe nytt. Men så er jeg også langt over snittet interessert i teknologi og dingser. Og mobiler har på et tidspunkt blitt mer dings enn noe annet. Ihvertfall de jeg ser på. En mobil skal ikke lenger bare brukes til å ringe med, og sende noen meldinger iblant. Nei, med den skal du kunne sjekke epost, surfe på nettet og ta bilder og video i god kvalitet. Sistnevnte er forøvrig det siste jeg ser på, da jeg uansett synes kompaktkamera er begrensende nok. Men det finnes mobiler som kan ta bilder i ganske grei kvalitet, selv om det selvsagt ikke kan måle seg med hverken speilrefleks eller et godt kompaktkamera. Videre skal mobilen støtte alt av teknologi innen datatrafikk, ha mulighet for å koble seg til trådløse nett og GPS. Alt sammen i en pakke som skal være kompakt nok, men med stor skjerm, og batterilevetid nok til at du kan ta den med på telttur. Kompromisser må inngås.</p>
<p>Men hvorfor kan jeg ikke &laquo;sette sammen&raquo; min egen mobil? Det hadde vært noe. Jeg vil kunne velge en grunnmodell, og dermed legge til og fjerne komponenter og programvare som jeg selv ønsker. Jeg ønsker for eksempel ikke å betale for et middels kamera, så det tar jeg bort. Ei heller ønsker jeg å betale for en masse elendige spill. Bort med dem. Men jeg vil ha GPS, WLAN, 3G/EDGE og en del nyttige programmer. Videre vil jeg kunne velge skjerm, minne, lagringskapasitet og prosessor til å passe mine krav til ytelse. Omtrent som jeg forventer om jeg bestiller en ny pc. Men dette kan jeg ikke. Jeg kan ikke velge bort noe, og jeg kan ikke legge til.</p>
]]></content:encoded>
			<wfw:commentRss>http://xmasb.com/2009/08/27/drommemobilen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

