{"id":647,"date":"2012-09-24T11:00:44","date_gmt":"2012-09-24T09:00:44","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=647"},"modified":"2016-01-11T23:53:30","modified_gmt":"2016-01-11T22:53:30","slug":"content-security-policy-tutorial","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/content-security-policy-tutorial\/","title":{"rendered":"Content Security Policy &#8211; Tutorial"},"content":{"rendered":"<div style=\"background:#FFFD91;padding:10px;margin-bottom:20px\">Prefer this in English? <a href=\"http:\/\/websec.io\/2012\/10\/02\/Intro-to-Content-Security-Policy.html\">An Introduction to Content Security Policy<\/a><\/div>\n<p>Das Problem <a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-1-xss-beispielangriff\/\">Cross-Site-Scripting \/ XSS<\/a> ist pr\u00e4senter denn je &#8211; st\u00e4ndig h\u00f6rt man von neuen Angriffen mit teils verheerenden Folgen, die weit \u00fcber das Entstellen von G\u00e4steb\u00fcchern hinausgehen. Seit 2009 in der Entwicklung und mittlerweile mit einer fast vollst\u00e4ndigen Implementierung in Chrome und Firefox schickt sich die Content Security Policy nun an, XSS den Kampf anzusagen. Aktuell befindet sich die CSP noch im Status <a href=\"http:\/\/www.w3.org\/TR\/CSP\/#sotd\">W3C Working Draft<\/a> und wird speziell um HTML5-relevante Features wie etwa Web-Sockets erg\u00e4nzt. Das hei\u00dft umgekehrt, dass man sie bereits heute problemlos verwenden kann. Aber von vorne.<\/p>\n<h2>Was ist die Content Security Policy<\/h2>\n<p>Haupt-Pattern bei XSS-Angriffen ist das Einschleusen von Inline-Script in den HTML-Code, der dann bei jedem Request mit ausgeliefert und ausgef\u00fchrt wird. Javascript sollte in einer idealen Welt ohnehin ausschlie\u00dflich in externen .js-Dateien ausgeliefert werden. So verfolgt die CSP das Konzept, Javascript nur dann auszuf\u00fchren, wenn es sich in einem Script-File befindet. Selbstverst\u00e4ndlich ist der Browser des Nutzers selbst f\u00fcr die Einhaltung der CSP zust\u00e4ndig, sodass der Schutz auf Clientseite erfolgt &#8211; Inline-Scripts werden also trotz verseuchtem HTML nicht ausgef\u00fchrt, wenn der Browser des Nutzers CSP unterst\u00fctzt. Hierzu m\u00fcssen evtl. einige Anpassungen durchgef\u00fchrt werden:<\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;a id=&quot;mylink&quot; onclick=&quot;foo()&quot;&gt;Foo&lt;\/a&gt;\r\n<\/pre>\n<p>&#8230; wird dann zu &#8230;<\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;script src=&quot;script.js&quot;&gt;&lt;\/script&gt;\r\n&lt;a id=&quot;mylink&quot;&gt;Foo&lt;\/a&gt;\r\n<\/pre>\n<p>&#8230; mit der Hilfe von jQuery in der Datei <i>script.js<\/i>:<\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\n$(document).ready(function()\r\n{\r\n    $(&quot;#mylink&quot;).on(&quot;click&quot;, function()\r\n    {\r\n        foo();\r\n    });\r\n});\r\n<\/pre>\n<p>Ohnehin eine gute Praxis, HTML und JS zu trennen.<\/p>\n<h2>Aber CSP kann noch mehr!<\/h2>\n<p>Die CSP beschr\u00e4nkt sich nicht auf die Bek\u00e4mpfung von Inline-Scripten. Es k\u00f6nnen noch verschiedenste andere Ressourcen reglementiert werden, so etwa von welchen Locations <b>Bilder und CSS-Dateien<\/b> geladen werden d\u00fcrfen. Denn auch von einem Angreifer eingeschleuste, externe CSS-Dateien und Bilder k\u00f6nnen eine Sicherheitsbedrohung darstellen. Die CSP ist so aufgebaut, dass sich f\u00fcr jede Regel Ausnahmen definieren lassen, aber dazu dann sp\u00e4ter mehr in den Beispielen.<\/p>\n<p>F\u00fcr einige Regeln wie z.B. die Behandlung von Javascript ist noch zus\u00e4tzlich festgelegt, dass etwa <b>eval<\/b> nicht mehr ausgef\u00fchrt wird. Dies kann aber auch wieder erlaubt werden. Weiterhin unterst\u00fctzt die CSP ein <b>Reporting-Verfahren<\/b>: Bei jedem festgestellten Versto\u00df gegen die Policy wird ein vorher anzugebendes Script per POST-Request vom Browser des Nutzers aufgerufen und teilt dem Webmaster so mit, dass es potentielle XSS-Probleme auf der entsprechenden Webseite gibt. Auch toll: Es l\u00e4sst sich ein Testmodus aktivieren, bei dem die CSP nicht aktiv durchgesetzt wird, wohl aber das Reporting angeschaltet ist &#8211; so l\u00e4sst sich f\u00fcr den Webmaster schonmal grob absch\u00e4tzen, was die Einf\u00fchrung der CSP auf seinen Seiten f\u00fcr Auswirkungen h\u00e4tte.<\/p>\n<h2>Einbindung der CSP<\/h2>\n<p>Die CSP wird als HTTP-Header \u00fcbermittelt. In einer fr\u00fcheren Version der Spezifikation wurde auch noch die Einbindung per Meta-Tag unterst\u00fctzt, dies wurde aber mittlerweile wieder gestrichen. Der Header sieht im aktuellen, noch experimentierellen Status der Policy wie folgt aus:<\/p>\n<h3>Chrome<\/h3>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nX-WebKit-CSP: &lt;CSP-Regeln hier&gt;\r\n<\/pre>\n<h3>Internet-Explorer + Firefox<\/h3>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nX-Content-Security-Policy: &lt;CSP-Regeln hier&gt;\r\n<\/pre>\n<h3>Der finale Header nach Abschluss der Spezifikation<\/h3>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nContent-Security-Policy: &lt;CSP-Regeln hier&gt;\r\n<\/pre>\n<p>Demnach empiehlt sich folgendes Script, um Redundanz zu vermeiden:<\/p>\n<p><pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n\/\/sample rule\r\n$csp_rules = &quot;script-src &#039;self&#039; cdnjs.cloudflare.com; style-src &#039;self&#039;&quot;;\r\n\r\nforeach (array(&quot;X-WebKit-CSP&quot;, &quot;X-Content-Security-Policy&quot;, &quot;Content-Security-Policy&quot;) as $csp)\r\n{\r\n\theader($csp . &quot;: &quot; . $csp_rules);\r\n}\r\n<\/pre>\n<\/p>\n<p><h2>Was umfasst die CSP alles?<\/h2>\n<ul>\n<li><b>script-src<\/b>: Bestimmt, von welchen Domains externe Scripts geladen werden d\u00fcrfen und ob Inline-Scripte erlaubt sind. Weiterhin kann hier <i>eval<\/i> wieder erlaubt werden, was standardm\u00e4\u00dfig durch die CSP verboten ist.<\/li>\n<li><b>object-src<\/b>: Besitmmt, von welchen Domains Flash und andere Plugins (Silverlight&#8230;) geladen werden &#8211; Gilt f\u00fcr die Tags <i>&lt;object&gt;<\/i>, <i>&lt;embed&gt;<\/i> und <i>&lt;applet&gt;<\/i><\/li>\n<li><b>style-src<\/b>: Bestimmt, von welchen Domains CSS-Dateien geladen werden d\u00fcrfen. Wichtig: Hier l\u00e4sst sich nicht angeben, dass Inline-CSS supported werden soll. Das ist generell bei Verwendung der CSP ausgeschlossen.<\/li>\n<li><b>img-src<\/b>: Bestimmt, von welchen Domains Bilder geladen werden d\u00fcrfen. Gilt nicht nur f\u00fcr den <i>&lt;img&gt;<\/i>-Tag sondern auch f\u00fcr CSS-Background-Images.<\/li>\n<li><b>media-src<\/b>: Bestimmt, von welchen Domains <i>&lt;video&gt;<\/i> und <i>&lt;audio&gt;<\/i>-Elemente geladen werden.<\/li>\n<li><b>frame-src<\/b>: Bestimmt, welche Seiten per Frame oder iframe eingebunden werden d\u00fcrfen. <i>frame-src https:\/\/facebook.com<\/i> w\u00fcrde nur facebook-(i)frames durchgehen lassen.<\/li>\n<li><b>font-src<\/b>: Bestimmt, von welchen Domains externe Schriftarten mit der <i>@font-face<\/i>-Direktive geladen werden d\u00fcrfen.<\/li>\n<li><b>connect-src<\/b>: Bestimmt, zu welchen Seiten eine Verbindung per <i>WebSocket<\/i> und <i>XHR<\/i> erlaubt wird.<\/li>\n<\/ul>\n<p>Und ganz wichtig: <b>default-src<\/b> spezifiziert f\u00fcr alle Ressourcen einen Default-Wert, die nicht explizit aufgef\u00fchrt wurden.<\/p>\n<h2>Standardverhalten<\/h2>\n<p>Standardm\u00e4\u00dfig verh\u00e4lt sich die CSP so, als w\u00e4re <i>default-src: *<\/i> eingestellt &#8211; hei\u00dft: Alle Ressourcen d\u00fcrfen von \u00fcberall geladen werden. Das ist erstmal nicht besonders sicher, unterbindet aber die Ausf\u00fchrung von <b>Inline CSS<\/b>, <b>Inline Script<\/b> und <b>eval<\/b> &#8211; wenn man dies nicht explizit erlaubt, was im Fall von Inline CSS garnicht m\u00f6glich ist. Wie bereits erw\u00e4hnt, wird durch <b>default-src<\/b> f\u00fcr alle Ressourcen ein Standard angegeben, die nicht gesondert in der CSP aufgef\u00fchrt sind.<\/p>\n<h2>Konkrete Beispiele, bitte!<\/h2>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\ndefault-src &#039;self&#039; cdn.foobar.de; script-src &#039;self&#039; cdnjs.cloudflare.com; style-src &#039;self&#039; static.ak.fbcdn.net\r\n<\/pre>\n<ul>\n<li>Alle Ressourcen d\u00fcrfen standardm\u00e4\u00dfig von der eigenen Domain (<i>&#8217;self&#8216;<\/i>) und von <i>cdn.foobar.de<\/i> geladen werden. Wichtig: &#8217;self&#8216; steht in Hochkommas, weil es ein Keyword ist. Sonst w\u00fcrde <i>self<\/i> als Domain interpretiert werden. Dabei ist das Keyword &#8217;self&#8216; streng mit der genauen Domain. Befindet sich eure Seite unter <i>david.myspace.com<\/i> und &#8217;self&#8216; ist als Ressource gewhitelisted, darf nicht von <i>other.myspace.com<\/i> geladen werden. Umgekehrt: Wenn die Domain <i>myspace.com<\/i> ist und &#8217;self&#8216; ist eingestellt, darf von <i>script.myspace.com<\/i> nicht geladen werden. Dies muss explizit noch mit angegeben werden.<\/li>\n<li>Scripte d\u00fcrfen nur von der eigenen Domain und <i>cdnjs.cloudflare.com<\/i> geladen werden. <b>NICHT<\/b> von <i>cdn.foobar.de<\/i>, denn default-src wird f\u00fcr Scripts \u00fcberschrieben, sobald <i>script-src<\/i> explizit angegeben ist. Die Ausf\u00fchrung von Inline-Scripten ist nicht gestattet, eval wird auch nicht erlaubt.<\/li>\n<li>Stylesheets d\u00fcrfen von der eigenen Domain und von <i>static.ak.fbcdn.net<\/i> geladen werden. <b>NIE<\/b> sind Inline-Styles legitim.<\/li>\n<\/ul>\n<p>Selbst ausprobieren?<\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;?php\r\n$csp_rules = &quot;default-src &#039;self&#039; cdn.foobar.de; script-src &#039;self&#039; cdnjs.cloudflare.com; style-src &#039;self&#039; static.ak.fbcdn.net&quot;;\r\n\r\nforeach (array(&quot;X-WebKit-CSP&quot;, &quot;X-Content-Security-Policy&quot;, &quot;Content-Security-Policy&quot;) as $csp)\r\n{\r\n\theader($csp . &quot;: &quot; . $csp_rules);\r\n}\r\n?&gt;\r\n\r\n&lt;link rel=&quot;stylesheet&quot; href=&quot;http:\/\/static.ak.fbcdn.net\/rsrc.php\/v2\/yW\/r\/54gK7YK85pd.css&quot; \/&gt;\r\n&lt;script src=&quot;http:\/\/cdnjs.cloudflare.com\/ajax\/libs\/underscore.js\/1.3.3\/underscore-min.js&quot;&gt;&lt;\/script&gt;\r\n&lt;script src=&quot;http:\/\/local\/csp\/s.js&quot;&gt;&lt;\/script&gt;\r\n\r\n&lt;style&gt;\r\nh1 { color: red }\r\n&lt;\/style&gt;\r\n\r\n&lt;h1&gt;Rot?&lt;\/h1&gt;\r\n\r\n&lt;script&gt;\r\nalert(&quot;123&quot;)\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>Die Konsole im Chrome meldet sich wie folgt zu Wort:<\/p>\n<div id=\"attachment_648\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2012\/09\/csp-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-648\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2012\/09\/csp-1-300x30.png\" alt=\"CSP im Chrome\" title=\"CSP im Chrome\" width=\"300\" height=\"30\" class=\"size-medium wp-image-648\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2012\/09\/csp-1-300x30.png 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2012\/09\/csp-1-1024x103.png 1024w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2012\/09\/csp-1.png 1029w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-648\" class=\"wp-caption-text\">CSP im Chrome<\/p><\/div>\n<h3>N\u00e4chstes Beispiel<\/h3>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nscript-src &#039;self&#039; &#039;unsafe-inline&#039; &#039;unsafe-eval&#039;\r\n<\/pre>\n<p>Hier wird die Verwendung der f\u00fcr <b>script-src<\/b> spezifischen Sonderregeln <i>&#8218;unsafe-inline&#8216;<\/i> und <i>&#8218;unsafe-eval&#8216;<\/i> gezeigt. Man beachte wieder die Hoch<a href=\"http:\/\/de.wiktionary.org\/wiki\/Komma\">kommas<\/a> &#8211; schlie\u00dflich sollen diese Schl\u00fcsselw\u00f6rter nicht als Domain aufgefasst werden. Diese Regel ist im \u00dcbrigen <b>nicht empfehlenswert<\/b>, wird doch Code wie folgender dadurch ausgef\u00fchrt &#8211; was die CSP quasi nutzlos macht:<\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;script&gt;\r\nalert(eval(&quot;2+3&quot;))\r\n&lt;\/script&gt;\r\n<\/pre>\n<p><i>&#8218;unsafe-inline&#8216;<\/i> und <i>&#8218;unsafe-eval&#8216;<\/i> m\u00fcssen explizit &#8222;angeschaltet&#8220; werden.<\/p>\n<h3>N\u00e4chstes Beispiel<\/h3>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\ndefault-src &#039;self&#039; https:\/\/*.site.de; frame-src &#039;none&#039;; object-src &#039;none&#039;\r\n<\/pre>\n<p>Alle Inhalte werden von der eigenen Domain oder von einer beliebigen Subdomain von <i>site.com<\/i> geladen &#8211; allerdings nur per http<b>s<\/b>. Frames und Object-Embeds sind nicht vorhanden und werden <b>garnicht<\/b> geladen. Das wars dann im \u00dcbrigen auch mit den Schl\u00fcsselw\u00f6rtern.<\/p>\n<p><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Security\/CSP\/Using_Content_Security_Policy\">Weitere Beispiele<\/a> befinden sich dr\u00fcben bei Mozilla.<\/p>\n<h2>Verwendung von Reporting<\/h2>\n<p>Wird an die CSP-Regel eine <i>report-uri<\/i> (absolut oder relativ) angehangen, bekommt diese per POST jeden Versto\u00df mitgeteilt und kann diesen dann weiterverarbeiten &#8211; Mailversand, Logdatei, Datenbank&#8230;<\/p>\n<p><b>Ein Beispiel:<\/b><\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;?php\r\n$csp_rules = &quot;script-src &#039;self&#039; &#039;unsafe-inline&#039;; report-uri http:\/\/local\/csp\/reportcspviolation.php&quot;;\r\n\r\nforeach (array(&quot;X-WebKit-CSP&quot;, &quot;X-Content-Security-Policy&quot;, &quot;Content-Security-Policy&quot;) as $csp)\r\n{\r\n\theader($csp . &quot;: &quot; . $csp_rules);\r\n}\r\n?&gt;\r\n&lt;script&gt;\r\nalert(eval(&quot;2+3&quot;))\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>Da hier <i>&#8218;unsafe-eval&#8216;<\/i> nicht als Ausnahme angegeben ist, reported der Browser den Versto\u00df an die angegebene Report-URL.<\/p>\n<div id=\"attachment_649\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2012\/09\/csp-report.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-649\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2012\/09\/csp-report-300x117.png\" alt=\"CSP-Report\" title=\"CSP-Report\" width=\"300\" height=\"117\" class=\"size-medium wp-image-649\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2012\/09\/csp-report-300x117.png 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2012\/09\/csp-report.png 968w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-649\" class=\"wp-caption-text\">CSP-Report<\/p><\/div>\n<p>Der Code der <b>reportcspviolation.php<\/b>-Datei k\u00f6nnte etwa wie folgt aussehen:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$c = file_get_contents(&quot;php:\/\/input&quot;);\r\n\r\nif (!$c)\r\n\texit;\r\n\t\r\n$c = json_decode($c, true);\r\n$c = print_r($c, true);\r\n\r\nfile_put_contents(&quot;csp.errors&quot;, $c, FILE_APPEND);\r\n<\/pre>\n<p>So wird uns sch\u00f6n mitgeteilt, auf welcher Seite gegen welche Direktive versto\u00dfen wurde:<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nArray\r\n(\r\n    [csp-report] =&gt; Array\r\n        (\r\n            [document-uri] =&gt; http:\/\/local\/csp\/x.php\r\n            [referrer] =&gt; \r\n            [blocked-uri] =&gt; self\r\n            [violated-directive] =&gt; inline script base restriction\r\n            [source-file] =&gt; http:\/\/local\/csp\/x.php\r\n            [script-sample] =&gt; alert(eval(&quot;2+3&quot;))\r\n            [line-number] =&gt; 1\r\n        )\r\n)\r\n<\/pre>\n<p>Es ist auch m\u00f6glich, nur das Reporting anzuschalten, die CSP selbst aber noch nicht durchzusetzen. Gut zum Experimentieren. So ist es auch denkbar, eine CSP-Policy im Einsatz zu haben, aber mit einer anderen zu experimentieren.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nheader(&quot;X-Content-Security-Policy: script-src &#039;self&#039; &#039;unsafe-inline&#039;; report-uri \/activeviolation.php&quot;\r\nheader(&quot;X-Content-Security-Policy-Report-Only: script-src &#039;self&#039;; report-uri \/evaluationviolation.php&quot;);\r\n<\/pre>\n<p>Hier l\u00e4sst der Webmaster die obere CSP durchsetzen, experimentiert aber mit der unteren, strengeren CSP.<\/p>\n<h2>Empfehlungen und Bewertung<\/h2>\n<p>Noch ein paar warme Worte zum Schluss. Mit dem Firefox und Firebug hatte ich beim Experimentieren ein paar Probleme. Mag dran liegen, dass Firebug als Plugin nicht vollst\u00e4ndig mit dem Browser verbandelt ist und so das ein oder andere nicht mitbekommt. Zumindest war die Konsole h\u00e4ufig unbrauchbar. Allerdings kann man sich beim Test ja mit der Reporting-URL behelfen, die alle Verst\u00f6\u00dfe mitgeteilt bekommt.<\/p>\n<p>Ein Tipp zum Aufbau der CSP-Regeln: Es wird empfohlen, erstmal <b>alles zu verbieten<\/b> und von da dann mit gezielten Ausnahmen die Policy wieder etwas zu &#8222;relaxxen&#8220;, wo n\u00f6tig.<\/p>\n<p>Das sieht dann etwa so aus:<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nX-Content-Security-Policy: default-src &#039;none&#039;; script-src &#039;self&#039; js.mysite.com; style-src &#039;self&#039; css.mysite.com; img-src &#039;self&#039; images.mysite.com\r\n<\/pre>\n<p>Ich denke, man versteht was gemeint ist. Hier wird durch die Direktive <i>default-src<\/i> erstmal per s\u00e9 alles verboten und dann gezielte Ausnahmen f\u00fcr Scripts, CSS und Bilder ausgesprochen. Frames, Objects \/ Embeds, Audio etc. bleibt aber verboten, weil hier ja keine Ausnahme definiert wurde. <\/p>\n<p>Ein Klasse Bookmarklet, welches eine Empfehlung f\u00fcr die CSP-Regeln basierend auf der aktuellen Seite ausspricht, sei auch noch <a href=\"http:\/\/brandon.sternefamily.net\/posts\/2010\/10\/content-security-policy-recommendation-bookmarklet\/\">empfohlen<\/a>.<\/p>\n<p>Die CSP befindet sich noch in der Entwicklung, deswegen lohnt ein Blick auf den W3C Working-Draft. Gerade wird etwa \u00fcber <a href=\"https:\/\/dvcs.w3.org\/hg\/content-security-policy\/raw-file\/tip\/csp-specification.dev.html#script-nonce--experimental\">script-nonce<\/a> debattiert, um Inline-Scripte nur dann auszuf\u00fchren, wenn sie ein <i>nonce=&#8220;random_string&#8220;<\/i>-Attribut mitbringen &#8211; So wird dem Browser mitgeteilt, dass das Inline-Script &#8222;intentional&#8220; ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prefer this in English? An Introduction to Content Security Policy Das Problem Cross-Site-Scripting \/ XSS ist pr\u00e4senter denn je &#8211; st\u00e4ndig h\u00f6rt man von neuen Angriffen mit teils verheerenden Folgen, die weit \u00fcber das Entstellen von G\u00e4steb\u00fcchern hinausgehen. Seit 2009 &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/content-security-policy-tutorial\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,6,3],"tags":[],"class_list":["post-647","post","type-post","status-publish","format-standard","hentry","category-php","category-security","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/647","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=647"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/647\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}