Search Results for: content

DIY werbeblocker

wo wir gerade bei werbung waren… werbeblocker in browsern sind ja eh doof, weil da teilweise auch eine riesige geldmaschine dahinter steht. (also nicht bei der werbung, sondern auch bei den werbeblockern!)

hier eine kurze beschreibung, wie ich mir einen rudimentaeren werbeblocker selbst gebastelt habe. und da ich von natuer aus neugierig bin, wollte ich auch ein bischen statistik haben, was mir das ganze bringt.

als erstes brauchen wir eine liste bekannter urls der anbieter von werbung. es gibt eine android app, welche eine solche liste bzw mehrere listen aus dem netz zieht und diese kumuliert in die hosts datei des geraetes rein kopiert. die hostnamen der “ad-server” werden dann einfach auf localhost (127.0.0.1) umgeleitet und die anfragen landen so im nirvana, weshalb keine werbung angezeigt wird. praktischerweise stehen die urls der gepflegten listen auch als kommentar drin:

# http://adaway.org/hosts.txt
# http://hosts-file.net/ad_servers.asp
# http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext
# http://winhelp2002.mvps.org/hosts.txt

diese laedt man sich einfach runter und fügt sie ans ende seiner eigenen hosts datei an. wo die hosts datei bei welchem betreibssystem liegt, sagt euch wikipedia. theoretisch funktioniert das nun schon. praktisch ist diese liste schon immer beim erscheinen veraltet und muss staendig aktualisiert und ergaenzt werden. deshalb sollte man sich fuer diese arbeit ein scriptchen bauen und regelmaessig laufen lassen. (todo fuer die zukunft: die hosts des dsl routers damit fuettern, damit man das nicht fuer jedes geraet im lan machen muss.)

wie schon erwaehnt wollte ich auch wissen, was da denn ueberhaupt ablaeuft, was wie und wie oft “geblockt”. dazu habe ich die eintraege in der hosts nicht auf 127.0.0.1 umgeleitet, sondern auf die ip eines webservers bei mir im lokalen netz. dieser liefert nur eine leere seite zurueck und schreibt mir die aufrufe in eine logdatei.

das erledigt ein kleines php skriptchen, welches ich als index.php abgespeichert habe:


damit auch alles “funktioniert”, was nach dem hostnamen in aufruf einer url steht und nicht vom webserver mit einem “not found” quittiert wird, werden alle anfragen per .htaccess datei auf die zuvor erstellt datei index.php umgeleitet. um zu verhindern, dass die index.php in einer schleife auf sich selbst umgeleitet wird, muss man sie “excluden”. selbiges macht man mit dem logfile, damit man es sich auch im browser anschauen kann.

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !adblock.log
RewriteRule .* index.php [R=307,L]

voila… 10 minuten arbeit mit testen. ein wenig finetuning kann man natuerlich noch machen. vielleicht poste ich nochmal was.

und was hats gebracht? beim morgendlichen stöbern in den news des tages, die man so bei ner tasse kaffe liest, wurden mir in 15 minuten ganze 358 (!!!!) werbeeinblendungen NICHT angezeigt. wenn man sich diese zahl anschaut – liebe webseitenbetreiber – da wundert ihr euch, dass menschen werbeblocker benutzen? so viel werbung kann man in 15 minuten gar nicht verarbeiten.

20140822_werbeblockerder focus online hats dann aber doch gemerkt, obwohl ich im browser keinen werbeblocker installiert habe. da muss ich nochmal ein bischen forschen, wie die das machen und wie man das umgehen kann.

eine idee fuer einen werbe blocker im browser waere doch, dass die werbung zwar geladen, aber nicht angezeigt wird. so muessten die bloeden webseitenbetreiber nicht mehr rumnoehlen, dass ihnen die werbeeinnahmen (von den einblendungen) floeten gehen und die besucher waeren gluecklich. die paar leute, die es auf der welt gibt, die wirklich werbung anklicken, haben und wollen sicher auch keinen werbeblocker.

to be continued… 🙂

homematic: yamaha av receiver steuern

um einen yamaha av receiver zu steuern (hier z.b. ein RX-V771), brauchts irgendwas, was die kommandos uebers netz zu den diesem sendet. vorraussetzung fuer dieses script ist ein installierter cuxd auf der omemativ ccu2.

dieses script soll nur als beispiel dienen, da die umsetzung doch etwas quick and dirty ist 😉

der erste uebergabeparameter ist der hostname oder die ipadresse des receivert. der zweite uebergabeparameter ist ein kommando, welches im script definiert ist. siehe case anweisung…

#!/bin/sh
export LD_LIBRARY_PATH=/usr/local/addons/cuxd

url="http://$1:80/YamahaRemoteControl/ctrl"
header="Content-Type: text/plain"
curlp="-f -s -X POST"

xmlhead=""
xmlfoot=""

case "$2" in
	"poweron") ycmd="On"
	;;
	"poweroff") ycmd="Standby"
	;;
	"muteon") ycmd="On"
	;;
	"muteoff") ycmd="On/Off"
	;;
	"muteonoff") ycmd="On/Off"
	;;
	"vol55") ycmd="-5501dB"
	;;
	"vol65") ycmd="-6501dB"
	;;
	"volplus2") ycmd="Up 2 dB"
	;;
	"volminus2") ycmd="Down 2 dB"
	;;
esac

/usr/local/addons/cuxd/curl $curlp --header "$header" -d "$xmlhead$ycmd$xmlfoot" $url > /dev/null

ich hab das unter /usr/local/addons/yamaha als “yamaha.sh” abgespeichert.

es ist ein shellscript geworden, da ich mit diesem tcl kram auf der ccu irgendwie auf kriegsfuss stehe. damit ist es ein leichtes, z.b. den receiver auszuschalten, wenn man den raum verlaesst und das licht ausschaltet. (passt in meinem szenario im büro. im wohnzimmer will man es zu filme schauen vielleicht andersrum haben?)

mit geringfuegigen anpassungen was den curl pfad angeht, sollte das auch ohne homematic auf beliebigen linux rechnern laufen.

toetet den boten

eigentlich heissts ja “toetet nicht den boten”, aber irgendwie war das mein erster gedanke beim lesen dieser headline:

Hollywood: Suchmaschinen sind schuld an Copyright-Verletzungen

das wird der content mafia wieder gruende liefern, noch mehr druck auf “unschludige” wie suchmaschinenbetreiber aus zu ueben.

media upload verzeichnis aendern ab wordpress 3.5

ab wordpress 3.5 fehlt im backend die moeglichkeit, das upload verzeichnis zu aendern. diese funktion wurde entfernt, weil sie wenig genutzt, aber immer viel aerger eingebracht hat, wenn nutzer das im nachhinein aenderten.

wenn man das verzeichnis nun aendern will, muss man diese zeile in der wp-config.php einfuegen und natuerlich den eigenen gegebenheiten anpassen:

define( 'UPLOADS', 'wp-content/files' ); 

der default wert war frueher “wp-content/uploads”.

configured post variable limit exceeded

wenn man bei einem debian (lenny oder squeeze) php mit dem suhosin patch installiert (php5-suhosin) und nutzt, kann es z.b. fuer manche content management systeme “zu sicher” eingestellt sein. suhosin begrenzt dabei die maximale groesse der POST requests. im falle von contao fuehrt das dazu, dass manche einstellungen nicht mehr abgespeichert werden koennen und still und heimlich im error.log folgender eintrag zu finden ist:

[warn] mod_fcgid: stderr: ALERT - configured POST variable limit exceeded - dropped variable 'start' (attacker 'xxx.xxx.xxx.xxx', file '/var/www/contao/main.php')

abhilfe schafft eine vergroesserung der entsprechenden werte in der php.ini. z.b. so:

suhosin.post.max_vars = 200000 
suhosin.request.max_vars = 20000 
suhosin.post.max_value_length = 265000 
suhosin.request.max_value_length = 265000

http status code 666

da hat der webmaster von nuclear blast sich selbst einen ausgedacht 😉
nach RFC2616 gibts den natuerlich nicht. wenn man ein bischen googlet findet man lustige sachen wie: Wird “In deinem Land nicht verfügbar” zum Internetstandard?. da schlaegt “der Google-Mitarbeiter Tim Bray einen neuen HTTP-Status-Code vor, der signalisieren soll, dass eine Datei aus rechtlichen Gründen nicht verfügbar ist“. und in den kommentaren schreibt einer “666 als ein diabolisches Sinnbild für die Contentindustrie” 😉

postie – possible xss attack – ignoring email

das postie plugin nervt seit version 1.4.4 mit “possible xss attack – ignoring email” rum, wenn ich z.b. mit dem iphone per mail ein bild bloggen wollte.

das problem ist schon gut bekannt. abhilfe hat von den entwicklern noch keiner geschaffen. ich hab dann einfach kurzen prozess mit der komischen sicherheitsabfrage gemacht und in der datei /wp-content/plugins/get_mail.php ab zeile 36 den kram auskommentiert.

 // check for XSS attacks - we disallow any javascript, meta, onload, or base64
    if (preg_match("/.*(script|onload|meta|base64).*/is", $email)) {
      echo "possible XSS attack - ignoring email\n";
      continue;
    }

was ich nicht so ganz verstanden habe… in der mail vom iphone ist der anhang base64 codiert. also hab ich erst das rausgeschmissen aus der abfrage. ging trotzdem nicht, obwohl in der ganzen mail nix von “script|onload|meta” drinne stand. erst nachdem ich die komplette abfrage auskommentiert habe, brachte das das gewuenschte ergebnis.

vba: download files (website requires login)

notiz… damit ich das nicht nochmal erfinden muss. die webseite erfordert ein login, bevor man daten runterladen kann. das login formular muss man sich halt mal ansehen und die entsprechenden werte in einem POST request schicken. ich habe dazu einfach irgendein firefox plugin beim login mitlaufen lassen, welches den entsprechenden POST request aufzeichnet. das cookie muss man dann noch aus der antwort des webserver axtrahieren und beim anschliessenden download der dateien mitschicken.
mit excel 2003 und dem ie7 ging das noch ohne login in vba, wenn man sich vorher im browser eingeloggt hatte (mit urlmon o.ä. einfach runterladen). mit excel 2010 und ie9 muss man sich explizit (mit vba) einloggen um die dateien runterladen zu können.

Option Explicit
 
Sub DownloadData()
 
    Dim strSavePath As String
    Dim strURL As String
    Dim strURLDownload As String
    Dim strHeaders As String
    Dim strResult As String
    Dim strRequest As Variant
    Dim objXMLhttp: Set objXMLhttp = CreateObject("msxml2.xmlhttp")
    Dim strUsername As String
    Dim strPassword As String
    Dim strFileToSave As String
    Dim xArr As Variant
    Dim yArr As Variant
    Dim strTheCookie As String
    Dim strCookie As String
    Dim objStream: Set objStream = CreateObject("ADODB.Stream")
    Dim i
    Dim WkSh As Worksheet ' das Quell-Tabellenblatt - die Herkunft der Daten
    Dim lZeile As Long
 
    ' Variablen
    Set WkSh = ThisWorkbook.Worksheets("DOWNLOADFILES") ' den Tabellenblattnamen ggf. anpassen!
    ' Format in dem Tabellenblatt DOWNLOADFILES.. einfach eine Auflistung der Download URLs:
    'http://www.website.com/download/data/file_1.xls
    'http://www.website.com/download/data/file_2.xls
    'http://www.website.com/download/data/file_3.xls

    ' Pfad zum speichern der XLS Dateien 
    strSavePath = "c:\temp\"
    strUsername = "vorname.nachname%40domain.tld" ' URL encoded: @ = %40
    strPassword = "mypassword"
    ' Login URL
    strURL = "http://www.website.com/login-user"
    ' mitgehörter request header (mit Firefox Plugin aufgezeichnet)
    ' Benutzername und Passwort durch Variablen ersetzt
    strRequest = "viewFrom=viewLOGIN&forward=%2Fbackend%2Findex.html&referer=%2Flogin.html&username= " & strUsername & "&password=" & strPassword & "&actionSUBMIT.x=0&actionSUBMIT.y=0"

    ' Login
    With objXMLhttp
        .Open "POST", strURL, False
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .send strRequest
    End With
   
    strHeaders = objXMLhttp.getAllResponseHeaders()
   
    ' ggf Response speichern um das Cookie anzuschauen
    'Open "C:\temp\response.txt" For Output As #1
    '  Print #1, , strHeaders
    'Close
   
    ' Beispiel Cookie aus strHeaders
    'Set-Cookie: BALANCERID=b.cocoon0a0815; Expires=Tue, 07-Aug-2012 08:00:00 GMT; Path=/
   
    ' Cookie extrahieren
    xArr = Split(strHeaders, "Set-Cookie: ")
    For i = 1 To UBound(xArr)
        strTheCookie = Left(xArr(i), InStr(xArr(i), "Path=/") - 2)
        strCookie = strCookie & " " & strTheCookie
    Next
    yArr = Split(strCookie, ";")
    strCookie = yArr(0)
 
   For lZeile = 1 To WkSh.Cells(Rows.Count, 1).End(xlUp).Row

        ' Downloadlink
        strURLDownload = WkSh.Range("A" & lZeile).Value

        ' Dateiname aus URL extrahieren
        strFileToSave = Mid$(strURLDownload, InStrRev(strURLDownload, "/") + 1)
       
        ' Download der xls Datei
        With objXMLhttp
            .Open "GET", strURLDownload, False
            .setRequestHeader "cache-control", "no-cache, must revalidate"
            'Cookie 2mal setzen... Bug: http://support.microsoft.com/kb/290899
            .setRequestHeader "Cookie", strCookie
            .setRequestHeader "Cookie", strCookie
            .send
        End With
       
        ' Speichern der xls Datei als Binary
        With objStream
            .Type = 1 ' adTypeBinary
            .Open
            .Write objXMLhttp.responseBody
            .SaveToFile strSavePath & strFileToSave, 2 ' adSaveCreateOverWrite
        End With
        objStream.Close
       
   Next lZeile
   
    Set objStream = Nothing
    Set objXMLhttp = Nothing
 
End Sub
 

wordpress gehackt

nein… nicht mein wordpress wurde gehackt, sondern das eines anderen. ich hab nur ein bischen analysiert und so…

das ergebnis war, dass der webserver permanent spammails rausgeschickt hat. aufgefallen ist es dadurch, dass die boesen buben keine spezielle mailadresse als absender benutzt haben, sondern die des wordpress users. dieser bekam dann haufenweise bouncemails und wurde (zu recht) misstrauisch. die logfileanalyse brachte zu tage, dass die angreifer sich mit einer laengeren bruteforce attacke zugriff verschafften und dann mit dem eingebauten theme editor die datei 404.php modifizierten. diese wurde dann permanent aufgerufen (/wp-content/themes/twentyten/404.php?kak) um spammails zu verschicken. man beachte das “kak” am ende… das ist echt mal kacke 😉
wie man anhand des screenshots erkennen kann, kann man den code noch fuer viel mehr gebrauchen… (klick zum vergroessern)

das installierte wordpress hatte natuerlich nicht die aktuellste version. wobei ich bezweifle, dass das in diesem fall geholfen haette.
neben vernuenftigen, langen passwoertern sollte man auch plugins wie z.b. Limit Login Attempts installieren. dieses plugin sperrt den login fuer eine einstellbare zeit nach einer anzahl fehlgeschlagener logins. auf wunsch gibts auch eine benachrichtigung per email. so ein plugin bietet sicherlich keinen 1005igen schutz, wird aber einen angriff hoffentlich erschweren und keine sicherheitsluecken mitbringen 😉

excel: kalender mit bedingten formatierungen (in vba)

vor langer zeit hab ich schonmal einmal einen kalender mit bedingten formatierungen in excel gebastelt. jetzt habe ich das mal mit vba gemacht… that’s it (eine von 100000 moeglichkeiten in quick & dirty):

Option Explicit

Sub Kalender()
   
    'Variablen deklarieren
    Dim MyStartDate As Date
    Dim MyEndDate As Date
    Dim MyTempDate As Date
    Dim OffsetX As Integer
    Dim OffsetY As Integer
    Dim BGWE As Integer
    Dim BGKW1 As Integer
    Dim BGKW2 As Integer
    Dim MyTempKW As Integer
    Dim Zähler As Integer
    Dim MyWorksheet As String
    Dim KWBackgrund As Integer
    Dim MyHeadLine As Variant
    Dim i As Integer

    'Start- und Endedatum setzen; möglich mit verschiedenen Schreibweisen
    MyStartDate = "01. Mai 2012"
    MyEndDate = "31.01.2014"
    'Tabellenblatt für den Kalender
    MyWorksheet = "Tabelle1"
    'in welcher Zeile soll der Kalender beginnen?
    OffsetY = 1
    'in welcher Spalte soll der Kalender beginnen?
    OffsetX = 1
    'Hintergrundfarbe für Wochenende
    BGWE = 15
    'Hintergrundfarbe für KW im Wechsel
    BGKW1 = 0
    BGKW2 = 16
    'Überschriften
    MyHeadLine = Array("Datum", "Tag", "KW")
    
    'Inhalt aller Zeilen löschen
    Rows("1:65536").ClearContents
    'Alle Formatierungen löschen
    Cells.ClearFormats

    'Überschriften
    For i = 0 To UBound(MyHeadLine)
        Worksheets(MyWorksheet).Cells(OffsetY, OffsetX + i).Value = MyHeadLine(i)
        Worksheets(MyWorksheet).Cells(OffsetY, OffsetX + i).Font.FontStyle = "Fett"
    Next
      
    
    'Kalender ausgeben
    For Zähler = 0 To DateDiff("d", MyStartDate, MyEndDate)
    
        MyTempDate = DateAdd("d", Zähler, MyStartDate)
        
        'Wochenende grau Markieren
        If Format(MyTempDate, "DDD") = "Sa" Or Format(MyTempDate, "DDD") = "So" Then
            Worksheets(MyWorksheet).Cells(1 + Zähler + OffsetY, OffsetX + 1).Interior.ColorIndex = BGWE
        End If
        
        'Farbwechsel für die KW
        KWBackgrund = IIf(kw_nach_din(MyTempDate) And 1, BGKW1, BGKW2)
        Worksheets(MyWorksheet).Cells(1 + Zähler + OffsetY, OffsetX + 2).Interior.ColorIndex = KWBackgrund

        'aktuellen Tag rot Markieren
        If MyTempDate = Date Then
            Worksheets(MyWorksheet).Range(Cells(1 + Zähler + OffsetY, OffsetX), Cells(1 + Zähler + OffsetY, OffsetX + 2)).Interior.Color = vbRed
        End If
        
        'erste Spalte mit Datum
        Worksheets(MyWorksheet).Cells(1 + Zähler + OffsetY, OffsetX).Value = MyTempDate
        
        'zweite Spalte mit Wochentag
        Worksheets(MyWorksheet).Cells(1 + Zähler + OffsetY, OffsetX + 1).Value = Format(MyTempDate, "DDD")
        
        'dritte Spalte mir KW (aber nur am ersten Tag der KW ausgeben)
        If MyTempKW <> kw_nach_din(MyTempDate) Then
            Worksheets(MyWorksheet).Cells(1 + Zähler + OffsetY, OffsetX + 2).Value = kw_nach_din(MyTempDate)
            MyTempKW = kw_nach_din(MyTempDate)
        End If
        
    Next Zähler
    
End Sub


Function kw_nach_din(datum As Date) As Byte
 Dim kw As Date
 kw = 4 + datum - Weekday(datum, 2)
 kw_nach_din = (kw - DateSerial(Year(kw), 1, -6)) \ 7
End Function

das ergebnis ist vergleichbar mit dem von damals: