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.
der 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="-550 1 dB "
;;
"vol65") ycmd="-650 1 dB "
;;
"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: