Closed hduelme closed 3 days 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.
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:
default-src 'none'
Standardmäßig nichts zulassenimg-src 'self' http://fritz.box/favicon.ico https://fritz.box/favicon.ico data: w3.org/svg/2000
Bilder dürfen nur von dem Host, der fritz.box
oder data: w3.org/svg/2000
(svg) geladen werdenfont-src 'self'
Fonts dürfen nur vom Host geladen werdenstyle-src 'self'
Style-Dateien dürfen nur vom Host als Datei geladen werden. Inline CSS ist nicht mehr erlaubt. Hierzu habe ich alle inline Styles nach phoneblock-style.css
ausgelagertscript-src 'self'
Scripts dürfen nur noch vom Host als Datei geladen werden. Inline JS ist nicht mehr erlaubt. Hierzu zählen auch on-click Events. Hierzu habe ich alle inline JS Funktionen in Dateien ausgelagert
addEventListener
im Java Skript hinzugefügt. Hierzu wird entweder die ID verwendet oder anhand einer class
alle elemente gefunden und der Listener hinzugefügt.api.js
)bulma.js
)_
abgeschnitten und der vordere Teil als ID verwendet.frame-ancestors 'none'
verbietet explizit das Nutzen der Website in einem Frame. (Nachfolger von X-Frame-Options
)connect-src 'self'
nur der Host ist für Verbindungen erlaubt.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
@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:
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. :-)
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.
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:
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.
Der Fehler lag in der Funktion. Die hat nicht mehr den request.getContextPath()
verwendet. Habe ich gerade behoben
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.
Jetzt probieren wir's erst mal so... :-)
Change ist auf dem Live-System deployt - scheint prima zu tun.
Mir ist doch noch ein Fehler aufgefallen. Die nums
page verstößt noch gegen die content security policy. https://phoneblock.net/phoneblock/nums/08135937816
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