6

Ich habe Probleme, new Function in einem Web Worker zu arbeiten. Ich habe eine HTML-Seite, die einen Web Worker hervorbringt. Dieser Web Worker führt Code durch new Function(str) aus. Ich versuche, dies in einer gepackten Chrome-App zu verwenden, die eine Seite mit eval -ähnlichen Code erfordert, der explizit als Sandkastenseite im Manifest aufgeführt wird.Aktivieren Sie "neue Funktion" in einem Web Worker mit CSP

Nun gibt es zwei Möglichkeiten:

  • Sie Liste der Seite Sandbox werden. Wenn ich das tue, kann ich new Function verwenden, aber ich kann keinen Web Worker erzeugen, weil ich keine Anfragen machen kann (die Sandbox-Seite hat einen eindeutigen Ursprung). new Worker(...) wirft eine SECURITY_ERR.
    • new Function Werke in Sandbox
    • new Worker in Sandbox
  • nicht Liste der Seite aufgrund einzigartige Herkunft nicht Sandbox werden. Wenn ich dies tue, kann ich einen Web Worker erstellen, aber der Worker kann new Function nicht verwenden, da er nicht sandboxed ist. new Function(...) wirft eine EvalError beschweren über die Verwendung davon.
    • new Function nicht in Nicht-Sandbox aufgrund eval -ähnlichen
    • new Worker Werke in Nicht-Sandbox
  • ist

Mein CSP ist wie folgt:

sandbox allow-scripts script-src 'self' 'unsafe-eval'; object-src 'self' 

Was kann ich tun, um new Function in einem Web Worker zu arbeiten?

Antwort

5

Es gibt eine Technik namens Inline-Worker, ich würde vorschlagen, das zu verwenden.

  • ein Blob-Objekt erstellen, die den Quellcode für den Arbeiter zu einem „DataURL“
  • Instantiate den Arbeiter mit diesem DataURL

auf Dies wird beschrieben mit Beispiel-Code konvertiert es

  • enthalten Die HTML5-Website rockt in ihrem WebWorkers tutorial. Auf diese Weise können Sie die Site als Sandboxing auflisten, aber da keine externen Anforderungen erforderlich sind, sollte sie auch im Sandbox-Modus funktionieren.

  • +0

    Es stellte sich heraus, dass 'data:' URLs nicht funktionieren, weil Probleme mit demselben Ursprung auftreten, aber 'createObjectURL' URLs von Blobs (aus dem Artikel) funktionieren. Es ist nicht sehr praktisch, das gesamte Worker-Skript in die Hauptseite einzufügen, aber es scheint die einzige Möglichkeit zu sein, es zum Laufen zu bringen. Vielen Dank. – pimvdb

    +0

    Oh, ich kann jetzt sehen, dass ich Daten-URL anstelle von Objekt-URL in der Antwort verwendet habe, sorry dafür. Sie könnten vielleicht einen Build-Schritt machen, um es bequemer zu machen. – molnarg