heinetz: Content Security Policy per JS ändern

Hallo Forum,

ich habe versucht, per javascript einen iframe auf einer Seite einzubinden und erhalte folgende Meldung in den Dev-Tools:

Refused to frame 'https://example.com/' because it violates the following Content Security Policy directive: "frame-src 'self' http://webassistants.qa.partcommunity.com".

Ich habe folgendes versucht:

    var meta = document.createElement("meta");
    meta.httpEquiv = "Content-Security-Policy";
    meta.content = "frame-src *";
    document.getElementsByTagName("head")[0].appendChild(meta);

An der Fehlermeldung ändert das nichts. Was kann der Fehler sein?

danke für Tipps und

beste gruesse, heinetz

  1. Liebe(r) heinetz,

    Was kann der Fehler sein?

    der Server des eingebundenen Frames muss diesen mit einem passenden Crossdomain-Header ausliefern. Daran kannst Du vermutlich nichts ändern.

    Liebe Grüße

    Felix Riesterer

    1. Hallo Felix,

      ich bin ja vielleicht einfach nur zu unerfahren im Thema (weil ich solche Spielchen normalerweise nicht mache), aber MDN schreibt:

      The HTTP Content-Security-Policy (CSP) frame-src directive specifies valid sources for nested browsing contexts loading using elements such as <frame> and <iframe>.

      D.h. das ist ein Header der Rahmenseite, nicht der eingebundenen Seite. Und die Rahmenseite sagt: frames/iframes dürfen nur vom gleichen Host wie sie selbst kommen (self) oder von http://webassistants.qa.partcommunity.com. Sowas verstehe ich als eine Art Hackerschutz - wenn jemand schafft, HTML in die Seite zu injizieren, das einen bösen iframe einbinden will, dann wird das verhindert.

      Was Du beschreibst, klingt nach der Aufgabe von frame-ancestors, das vom iframe gesetzt werden könnte, um sich nur auf bestimmten Seiten einbetten zu lassen.

      Aber zum Problem:

      Heinetz,

      der HTML Living Standard sieht content-security-policy ausdrücklich als mögliches http-equiv Pragma vor. Allerdings noch nicht immer, die ursprüngliche HTML5 Spec enthielt das z.B. nicht.

      Da Du das meta Tag mit JavaScript nachträgst, besteht die Möglichkeit, dass der iframe schon geladen wird bevor das Script läuft. Ist das <script> Element so platziert, dass es vor dem <iframe> Element steht? Bist Du 100% sicher, dass das Script ausgeführt wurde?

      Könntest Du alternativ das Pragma fix im HTML einbauen? Ich habe keine Ahnung, ob ein gescriptetes csp-Pragma vom Browser akzeptiert würde; eigentlich würde das dem Sinn dieser Sicherheitsmaßnahme zuwiderlaufen.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hallo Rolf,

        nein, ich bauen den iframe per jQuery ein, nachdem ich den head um das metatag erweitert habe.

        Pragma Fix?

        <META http-equiv="Pragma" content="no-cache">
        

        Ich habe das düstere Gefühl, dass das einfach nicht per JS geht. Ausser dass ich keine entsprechendes Meta-Tag finden kann, kann von aussen nicht sehen, wo auf dem Server die aktuelle Konfiguration der content-security-policy hinterlegt ist. Wo könnte das sein? .htaccess oder httpd.conf oder so?

        Gruss, heinetz

      2. The HTTP Content-Security-Policy (CSP) frame-src directive specifies valid sources for nested browsing contexts loading using elements such as <frame> and <iframe>.

        D.h. das ist ein Header der Rahmenseite, nicht der eingebundenen Seite. Und die Rahmenseite sagt: frames/iframes dürfen nur vom gleichen Host wie sie selbst kommen (self) oder von http://webassistants.qa.partcommunity.com. Sowas verstehe ich als eine Art Hackerschutz - wenn jemand schafft, HTML in die Seite zu injizieren, das einen bösen iframe einbinden will, dann wird das verhindert.

        Nachtrag: Ich habe nun mal aus Spass 'http://webassistants.qa.partcommunity.com' als src des iframe definiert. Das führt zu folgender Fehlermeldung:

        Refused to frame 'https://config.qa.partcommunity.com/' because it violates the following Content Security Policy directive: "frame-src 'self' http://webassistants.qa.partcommunity.com".
        

        Die Fehlermeldung ist eindeutig und logisch, denn wenn ich 'http://webassistants.qa.partcommunity.com' direkt dem Browser aufrufe, werde ich nach 'https://config.qa.partcommunity.com/' weitergeleitet. D.h. aufgrund der definierten Regel:

        "frame-src 'self' http://webassistants.qa.partcommunity.com".

        ... lässt der Browser das Laden der angeforderten URL grundsätzlich zu aber das Weiterleiten nicht mehr.