apache
x-forwarded-for
httpd.conf:
...
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
LogFormat "%h %l %u %t \"%r\" %>s %b" common
...
CustomLog "logs/access_log" combined env=!forwarded
CustomLog "logs/access_log" proxy env=forwarded
MS IIS Server Header
Im IIS den Server Header zu deaktivieren ist nicht leicht. Es finden sich jede Menge Anleitungen dazu – aber nichts funktioniert.
Im Apache verändert man diesen Header über eine Zeile in einem Textfile (ServerTokens Prod). Eigentlich erwarte ich da, dass Microsoft für den IIS ein Häkchen oder ein Dropdown im GUI anbietet, mit dem man das ändern kann. Gibt es das nicht, würde ich einen Wert in der Registry erwarten – den gibt es aber auch nicht wirklich.
Eine einfache Möglichkeit bietet EASILY REMOVE UNWANTED HTTP HEADERS IN IIS 7.0 TO 8.5. Einfach das .msi Paket herunterladen, installieren, fertig.
Das ist natürlich gleichzeitig der Nachteil – man muss dazu ein MSI Paket installieren.
Das Paket ist laut Virustotal sauber. Ob jemand das auf einem produktiven Server installieren will, muss aber jeder für sich selbst entscheiden.
Apache AllowEncodedSlashes
Webserver zeigen manchmal ein ganz lustiges Verhalten, etwa wenn ein URL encoded Base64 String übergeben wird.
Benutzt wird das zum Beispiel beim Aufruf eines OCSP Responders wo die Information über das zu prüfende Zertifikat als urlencodetes Base64 übergeben wird.
Ein Beispiel in Base64
jA0EAxMcxamDRMfOGV5/gyZPnyX1BBPOQAE4BHbh7=
Und urlencoded
jA0EAxMcxamDRMfOGV5%2FgyZPnyX1BBPOQAE4BHbh7%3D
Wird jetzt der String „jA0EAwMCxamDRMfOGV5%2FgyZPnyX1BBPOQAE4BHbh7%3D“ z.B. als http://example.com/test/jA0EAwMCxamDRMfOGV5%2FgyZPnyX1BBPOQAE4BHbh7%3D aufgerufen, macht ein Apache draus wieder den Schrägstrich und meldet einen „404 File not found“ zurück, weil das als Pfad und Datei interpretiert wird. Eigentlich sollte das aber wie alle URLs unter /test/ an ein Backend übergeben werden.
Lösung: Per Default ist die Option AllowEncodedSlashes auf Off, wird die Option gesetzt, wird der String sauber durchgereicht.
Die Beispiele sind übrigens Kauderwelsch und haben keine tatsächliche Bedeutung.