haumacher / phoneblock

Der Spam-Filter für die Fritz!Box
https://phoneblock.net
GNU General Public License v3.0
161 stars 15 forks source link

add X-Content-Type-Options header #93

Closed hduelme closed 3 days ago

hduelme commented 2 weeks ago

I added the X-Content-Type-Options header to stops a browser from trying to MIME-sniff the content type and forces it to stick with the declared content-type.

I am not sure how a FritzBox react to this header, so I excluded URIs containing /contacts.

If you agree, we could also add some more HTTP Security headers, as described in https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html

haumacher commented 2 weeks ago

Hey vielen Dank für den Patch! Du hattest mir ja vor einer Weile schon mal eine E-Mail zu dem Thema geschrieben - aber das ist irgendwie untergegangen. Ich habe Deinen Branch mal auf dem Test-System deployt: https://phoneblock.net/pb-test/

Auf den ersten Blick scheit das zu funktionieren und keine Nebeneffekte zu haben. Gerne darfst Du noch weitere Security-Optimierungen vornehmen - ich würde es dann nochmal auf dem Test-System deployen, dann kann man auch testen, wie die Fritz!Box reagiert.

hduelme commented 2 weeks ago

Kein Problem, daher habe ich mich ja hier nochmals gemeldet.

Ich habe noch eine weiteren Header hinzugefügt Content-Security-Policy. Dieser steuert, von wo Daten/Skript/Bilder/... geladen werden dürfen. Ich habe ihn wie folgt eingestellt:

Sollte in Zukunft weiter Medien-Inhalte zu Webiste hinzugefügt werden, dann müssen diese in den Header eingetragen werden, für mehr Informationen siehe https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html#fetch-directives

haumacher commented 2 weeks ago

@hduelme Krass... das hätte ich mich nie getraut... machst Du sowas professionell? Da ist mir diese "handgefrickelte" no-tools Webapp jetzt aber ein bisschen peinlich... :-)

Ich hab's wieder auf das Testsystem deployt. Das funktioniert richtig gut. Ein Fehler ist mir aufgefallen. Die Cut&Past-Knöpfe funktionieren nicht alle. Hier gibt's eine ID zweimal - da stimmt irgendwas nicht - auf der setup.jsp Seite wenn man angemeldet ist und daher seine Zugangsdaten direkt von der Seite kopieren kann:

image

hduelme commented 2 weeks ago

Ups da hatte ich 2 IDs übersehen.

Eigentlich bin im Beruflich eher im Backend angesiedelt, aber hatte da eine sehr gute Schulung vor allem im Bezug auf Web-Security. Muss nicht peinlich sein, die Website funktioniert ja richtig gut. :-)

hduelme commented 2 weeks ago

Wir können noch weitere Headers einbinden: Referrer-Policy: Kontrolliert welche URL im Referer-Header beim aufrufen eines Links mitgegeben wird. Aktuell wird die gesamte URL gesendet. Die Beispiele von Mozilla sind hier recht anschaulich https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#no-referrer_2. Da wir keine Nutzerdaten-Serverseitig tracken aktuell, könnten wir auf no-referrer stellen. Dieser Header ist wie Content-Security-Policy nur relevant für den Browser-Teil.

Strict-Transport-Security: Weißt den Browser an nur Https für Zugriffe auf Resourcen der Website zu nutzen. max-age gibt hier an wie lange die Anweisung gelten soll. Üblich hierfür wäre 1 Jahr, der Wert kann aber auch mit der Zeit erhöht werden. Einziges Risiko, Nutzer können nach Laden der Website nicht mehr über HTTP die Seite aufrufen, egal ob der Header noch existiert. Außerdem braucht es einen Config um den Header für lokales Testen auf der eigenen Maschine zu deaktivieren.

haumacher commented 1 week ago

Habe nochmal deployt. Ich habe mit c85884f noch die Flutter-App für die Steuerung des Anrufbeantworters ausgenommen, da die Flutter-Web-Startup-Scripte damit nicht umgehen können (verwenden inline JS).

Ein komischer Effekt fällt aber noch auch: Wenn man die AB-App öffnen will, dann zeigt der Browser die richtige URL in der Vorschau an:

image

Wenn man aber klickt landet man auf https://phoneblock.net/pb-test/anrufbeantworter/phoneblock.net/ab/ und die Seite gibt es natürlich nicht - keine Ahnung wo das herkommt.

hduelme commented 1 week ago

Der Fehler lag in der Funktion. Die hat nicht mehr den request.getContextPath() verwendet. Habe ich gerade behoben

hduelme commented 1 week ago

Flutter selber bietet eine Option

--csp    Disable dynamic generation of code in the generated output. This is necessary to satisfy CSP restrictions (see http://www.w3.org/TR/CSP/).

Hierdurch sollte es möglich sein einen angepassten Header zu verwenden. Aber ganz ohne Inline Java-Script geht es leider nicht.

haumacher commented 3 days ago

Jetzt probieren wir's erst mal so... :-)

haumacher commented 3 days ago

Change ist auf dem Live-System deployt - scheint prima zu tun.

hduelme commented 3 days ago

Mir ist doch noch ein Fehler aufgefallen. Die nums page verstößt noch gegen die content security policy. https://phoneblock.net/phoneblock/nums/08135937816