ใ“ใฎใƒšใƒผใ‚ธใฏใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใƒผใฎๅฐฝๅŠ›ใง่‹ฑ่ชžใ‹ใ‚‰็ฟป่จณใ•ใ‚Œใพใ—ใŸใ€‚MDN Web Docs ใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใƒผใซใคใ„ใฆใ‚‚ใฃใจ็Ÿฅใ‚Šใ€ไปฒ้–“ใซใชใ‚‹ใซใฏใ“ใกใ‚‰ใ‹ใ‚‰ใ€‚

View in English Always switch to English

CSP: script-src

Baseline Widely available *

This feature is well established and works across many devices and browser versions. Itโ€™s been available across browsers since โจ2016ๅนด8ๆœˆโฉ.

* Some parts of this feature may have varying levels of support.

HTTP ใฎ Content-Security-Policy (CSP) ใซใŠใ‘ใ‚‹ script-src ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใฏใ€ JavaScript ใฎๆƒ…ๅ ฑใชใ‚ฝใƒผใ‚นใ‚’ๆŒ‡ๅฎšใ—ใพใ™ใ€‚ใ“ใ‚Œใฏ <script> ่ฆ็ด ใฎไธญใซ็›ดๆŽฅ่ชญใฟ่พผใพใ‚Œใ‚‹ URL ใ ใ‘ใงใชใใ€ใ‚คใƒณใƒฉใ‚คใƒณใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚คใƒ™ใƒณใƒˆใƒใƒณใƒ‰ใƒฉใƒผ (onclick) ใ‚„ใ‚นใ‚ฏใƒชใƒ—ใƒˆๅฎŸ่กŒใฎใƒˆใƒชใ‚ฌใƒผใจใชใ‚Šใ†ใ‚‹ XSLT ใ‚นใ‚ฟใ‚คใƒซใ‚ทใƒผใƒˆใฎใ‚ˆใ†ใชใ‚‚ใฎใ‚‚ๅซใพใ‚Œใพใ™ใ€‚

CSP ใƒใƒผใ‚ธใƒงใƒณ 1
ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–็จฎๅˆฅ ใƒ•ใ‚งใƒƒใƒใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–
default-src ใซใ‚ˆใ‚‹ไปฃๆ›ฟ ใ‚ใ‚Šใ€‚ใ“ใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใŒใชใ„ๅ ดๅˆใ€ใƒฆใƒผใ‚ถใƒผใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใฏ default-src ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใ‚’ๆŽขใ—ใพใ™ใ€‚

ๆง‹ๆ–‡

http
Content-Security-Policy: script-src 'none';
Content-Security-Policy: script-src <source-expression-list>;

ใ“ใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใฏใ€ๆฌกใฎใ„ใšใ‚Œใ‹ใฎๅ€คใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

'none'

ใ“ใฎ็จฎ้กžใฎใƒชใ‚ฝใƒผใ‚นใฏ่ชญใฟ่พผใพใ‚Œใพใ›ใ‚“ใ€‚ๅ˜ไธ€ๅผ•็”จ็ฌฆใฏๅฟ…้ ˆใงใ™ใ€‚

<source-expression-list>

ใ‚ฝใƒผใ‚น่กจ็พใฎๅ€คใ‚’็ฉบ็™ฝใงๅŒบๅˆ‡ใฃใŸใƒชใ‚นใƒˆใงใ™ใ€‚ใ“ใฎ็จฎ้กžใฎใƒชใ‚ฝใƒผใ‚นใฏใ€ๆŒ‡ๅฎšใ•ใ‚ŒใŸใ‚ฝใƒผใ‚น่กจ็พใฎใ„ใšใ‚Œใ‹ใจไธ€่‡ดใ—ใŸๅ ดๅˆใซ่ชญใฟ่พผใพใ‚Œใพใ™ใ€‚ใ“ใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใงใฏใ€ใƒ•ใ‚งใƒƒใƒใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใฎๆง‹ๆ–‡ใซๆŽฒ่ผ‰ใ•ใ‚Œใฆใ„ใ‚‹ใ‚ฝใƒผใ‚น่กจ็พใฎใ„ใšใ‚Œใ‹ใŒ้ฉ็”จใงใใพใ™ใ€‚

ไพ‹

ไฟก้ ผใ•ใ‚ŒใŸใƒ‰ใƒกใ‚คใƒณใ‹ใ‚‰ใฎใƒชใ‚ฝใƒผใ‚นใ‚’่จฑๅฏใƒชใ‚นใƒˆใซ่ฟฝๅŠ 

ใ“ใฎ CSP ใƒ˜ใƒƒใƒ€ใƒผใŒใ‚ใ‚‹ๅ ดๅˆใ€ https://example.com ใ‹ใ‚‰ใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎใฟใ‚’่จฑๅฏใ—ใพใ™ใ€‚

http
Content-Security-Policy: script-src https://example.com/

ไปฅไธ‹ใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใฏใƒ–ใƒญใƒƒใ‚ฏใ•ใ‚Œใ€่ชญใฟ่พผใฟใ‚„ๅฎŸ่กŒใŒ่กŒใ‚ใ‚Œใพใ›ใ‚“ใ€‚

html
<script src="https://not-example.com/js/library.js"></script>

ใชใŠใ€ใ‚คใƒณใƒฉใ‚คใƒณใฎใ‚คใƒ™ใƒณใƒˆใƒใƒณใƒ‰ใƒฉใƒผใ‚‚ๅŒๆง˜ใซใƒ–ใƒญใƒƒใ‚ฏใ•ใ‚Œใพใ™ใ€‚

html
<button id="btn" onclick="doSomething()"></button>

ใ“ใ‚Œใ‚’ addEventListener ใฎๅ‘ผใณๅ‡บใ—ใซ็ฝฎใๆ›ใˆใฆใใ ใ•ใ„ใ€‚

js
document.getElementById("btn").addEventListener("click", doSomething);

ใ‚คใƒณใƒฉใ‚คใƒณใ‚คใƒ™ใƒณใƒˆใƒใƒณใƒ‰ใƒฉใƒผใ‚’็ฝฎใๆ›ใˆใ‚‹ใ“ใจใŒใงใใชใ„ๅ ดๅˆใ€ 'unsafe-hashes' ใ‚ฝใƒผใ‚นๅผใ‚’ไฝฟ็”จใ—ใฆใ‚คใƒ™ใƒณใƒˆใƒใƒณใƒ‰ใƒฉใƒผใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ่ฉณใ—ใ„ๆƒ…ๅ ฑใฏๅฎ‰ๅ…จใงใฏใชใ„ใƒใƒƒใ‚ทใƒฅใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„ใ€‚

ใƒใƒƒใ‚ทใƒฅใ‚’ไฝฟ็”จใ—ใฆๅค–้ƒจใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’่จฑๅฏใƒชใ‚นใƒˆใซ่ฟฝๅŠ 

ไธŠ่จ˜ใง็คบใ—ใŸใ‚ˆใ†ใซใ€ไฟก้ ผใ•ใ‚ŒใŸใƒ‰ใƒกใ‚คใƒณใ‚’่จฑๅฏใ™ใ‚‹ใ“ใจใฏใ€ใ‚ณใƒผใƒ‰ใŒๅฎ‰ๅ…จใซ่ชญใฟ่พผใพใ‚ŒใŸๅ ดๆ‰€ใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใŸใ‚ใฎๅคงใพใ‹ใชๆ‰‹ๆณ•ใงใ™ใ€‚ ใ“ใ‚Œใฏใ€็‰นใซใ‚ตใ‚คใƒˆใŒๅคšใใฎใƒชใ‚ฝใƒผใ‚นใ‚’ไฝฟ็”จใ—ใฆใŠใ‚Šใ€ไฟก้ ผใ•ใ‚ŒใŸใ‚ตใ‚คใƒˆใŒไพตๅฎณใ•ใ‚Œใ‚‹ใ“ใจใฏใชใ„ใจ็ขบไฟกใ—ใฆใ„ใ‚‹ๅ ดๅˆใฎ็พๅฎŸ็š„ใชๆ‰‹ๆณ•ใงใ™ใ€‚

ไปฃๆ›ฟใฎๆ–นๆณ•ใจใ—ใฆใ€ใƒ•ใ‚กใ‚คใƒซใƒใƒƒใ‚ทใƒฅใ‚’ไฝฟ็”จใ—ใฆ่จฑๅฏใ™ใ‚‹ใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ๆ–นๆณ•ใŒใ‚ใ‚Šใพใ™ใ€‚ ใ“ใฎๆ‰‹ๆณ•ใ‚’ไฝฟ็”จใ™ใ‚‹ใจใ€<script> ่ฆ็ด ๅ†…ใฎๅค–้ƒจใƒ•ใ‚กใ‚คใƒซใฏใ€ integrity ๅฑžๆ€งใฎๆœ‰ๅŠนใชใƒใƒƒใ‚ทใƒฅๅ€คใŒใ™ในใฆ CSP ใƒ˜ใƒƒใƒ€ใƒผใง่จฑๅฏใ•ใ‚ŒใŸๅ€คใจไธ€่‡ดใ—ใŸๅ ดๅˆใซใฎใฟใ€่ชญใฟ่พผใพใ‚ŒๅฎŸ่กŒใ•ใ‚Œใพใ™ใ€‚ ใ‚ตใƒ–ใƒชใ‚ฝใƒผใ‚นๅฎŒๅ…จๆ€งใฎๆฉŸ่ƒฝใฏใ€ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใ—ใŸใƒ•ใ‚กใ‚คใƒซใŒ็คบใ™ใƒใƒƒใ‚ทใƒฅๅ€คใ‚’ๆŒใกใ€ๅค‰ๆ›ดใ•ใ‚Œใฆใ„ใชใ„ใ“ใจใ‚’่ฟฝๅŠ ็š„ใซ่ชฟในใพใ™ใ€‚ ใ“ใ‚Œใฏใƒ‰ใƒกใ‚คใƒณใ‚’ไฟก้ ผใ™ใ‚‹ใ‚ˆใ‚Šใ‚‚ๅฎ‰ๅ…จใงใ™ใ€‚ใƒ•ใ‚กใ‚คใƒซใฏใ€ใŸใจใˆไพตๅฎณใ•ใ‚ŒใŸใ‚ตใ‚คใƒˆใ‹ใ‚‰่ชญใฟ่พผใพใ‚ŒใŸใจใ—ใฆใ‚‚ใ€ๆ”นๅค‰ใ•ใ‚Œใฆใ„ใชใ„ๅ ดๅˆใซใฎใฟไฝฟ็”จใ•ใ‚Œใ‚‹ใ‹ใ‚‰ใงใ™ใ€‚ ใ—ใ‹ใ—ใ€ใ“ใ‚Œใฏใ‚ˆใ‚Š็ฒ’ๅบฆใฎ็ดฐใ‹ใ„ใ‚‚ใฎใงใ‚ใ‚Šใ€้–ข้€ฃไป˜ใ‘ใ‚‰ใ‚ŒใŸใ‚นใ‚ฏใƒชใƒ—ใƒˆใŒๅค‰ๆ›ดใ•ใ‚Œใ‚‹ใŸใณใซใ€ CSP ใจใ‚นใ‚ฏใƒชใƒ—ใƒˆ่ฆ็ด ใงใƒใƒƒใ‚ทใƒฅๅ€คใ‚’ๆ›ดๆ–ฐใ™ใ‚‹ใ“ใจใŒ่ฆๆฑ‚ใ•ใ‚Œใพใ™ใ€‚ ไธ‹่จ˜ใฎ CSP ใƒ˜ใƒƒใƒ€ใƒผใฏใ€ใใฎๆ‰‹ๆณ•ใ‚’็คบใ—ใฆใ„ใพใ™ใ€‚ SHA384 ใƒใƒƒใ‚ทใƒฅใŒ oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC ใงใ‚ใ‚‹ใ‹ใ€ใพใŸใฏ SHA256 ใƒใƒƒใ‚ทใƒฅใŒ fictional_value ใงใ‚ใ‚‹ใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’่จฑๅฏใ—ใพใ™ใ€‚

http
Content-Security-Policy: script-src 'sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC' 'sha256-fictional_value'

ไธ‹่จ˜ใฎ example-framework.js ใ‚นใ‚ฏใƒชใƒ—ใƒˆใฏ่ชญใฟ่พผใพใ‚Œใ‚‹ใฏใšใงใ™ใ€‚ใชใœใชใ‚‰ใ€ใใฎ integrity ๅฑžๆ€งใฎใƒใƒƒใ‚ทใƒฅๅ€คใŒ CSP ๅ†…ใซใ‚‚ๅญ˜ๅœจใ™ใ‚‹ใ‹ใ‚‰ใงใ™๏ผˆใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใ—ใŸใƒ•ใ‚กใ‚คใƒซใซๅฎŸ้š›ใซใใฎใƒใƒƒใ‚ทใƒฅใŒๅญ˜ๅœจใ™ใ‚‹ใ“ใจใ‚’ๆŒ‡ๅฎšใ—ใŸๅ ดๅˆใฏ๏ผ‰ใ€‚

html
<script
  src="https://example.com/example-framework.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
  crossorigin="anonymous"></script>

integrity ๅฑžๆ€งใฏ่ค‡ๆ•ฐใฎๅ€คใ‚’ๆŒใคใ“ใจใŒใงใใ€ใใ‚Œใžใ‚Œ็•ฐใชใ‚‹ใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใ‚’ไฝฟ็”จใ—ใฆ่จˆ็ฎ—ใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซใฎใƒใƒƒใ‚ทใƒฅใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ๅค–้ƒจใ‚นใ‚ฏใƒชใƒ—ใƒˆใŒ่ชญใฟ่พผใพใ‚Œใ‚‹ใŸใ‚ใซใฏใ€ CSP ใงใฏใ€ๅฑžๆ€งๅ†…ใฎใ™ในใฆใฎๆœ‰ๅŠนใชใƒใƒƒใ‚ทใƒฅๅ€คใŒ CSP ใฎ script-src ๅฎฃ่จ€ใซใ‚‚ๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใ‚‹ใ“ใจใŒ่ฆๆฑ‚ใ•ใ‚Œใพใ™ใ€‚ ใ—ใŸใŒใฃใฆใ€ไธ‹่จ˜ใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใฏ่ชญใฟ่พผใพใ‚Œใพใ›ใ‚“ใ€‚ใชใœใชใ‚‰ใ€ 2 ใค็›ฎใฎใƒใƒƒใ‚ทใƒฅใฏไธŠ่จ˜ CSP ใƒ˜ใƒƒใƒ€ใƒผใซใฏๅญ˜ๅœจใ—ใชใ„ใ‹ใ‚‰ใงใ™ใ€‚

html
<script
  src="https://example.com/example-framework.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC sha256-not-in-csp"
  crossorigin="anonymous"></script>

ใ“ใฎใƒซใƒผใƒซใฏใ€ๆœ‰ๅŠนใชใƒใƒƒใ‚ทใƒฅๅ€คใฎใฟใซ้ฉ็”จใ•ใ‚Œใพใ™ใ€‚ ใƒ–ใƒฉใ‚ฆใ‚ถใƒผใŒใƒใƒƒใ‚ทใƒฅใจใ—ใฆ่ช่ญ˜ใ—ใชใ„ๅ€คใฏ็„ก่ฆ–ใ•ใ‚Œใ‚‹ใŸใ‚ใ€ๆฌกใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใฏ่ชญใฟ่พผใพใ‚Œใ‚‹ใฏใšใงใ™ใ€‚

html
<script
  src="https://example.com/example-framework.js"
  integrity="invalid-or-unsupported-hash sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
  crossorigin="anonymous"></script>

ใ‚ตใƒ–ใƒชใ‚ฝใƒผใ‚นๅฎŒๅ…จๆ€งใซใฏใ€ใƒใƒƒใ‚ทใƒฅใฎ่จˆ็ฎ—ใจ integrity ๅฑžๆ€งใฎไฝฟ็”จใซ้–ขใ™ใ‚‹ใ‚ˆใ‚Šๅคšใใฎๆƒ…ๅ ฑใŒๅซใพใ‚Œใฆใ„ใพใ™ใ€‚

ๅฎ‰ๅ…จใงใฏใชใ„ใ‚คใƒณใƒฉใ‚คใƒณใ‚นใ‚ฏใƒชใƒ—ใƒˆ

ใƒกใƒข: ใ‚คใƒณใƒฉใ‚คใƒณใ‚นใ‚ฟใ‚คใƒซใจใ‚คใƒณใƒฉใ‚คใƒณใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’็ฆๆญขใ™ใ‚‹ใ“ใจใฏใ€CSP ใŒๆไพ›ใ™ใ‚‹ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃไธŠใฎๆœ€ๅคงใฎๅˆฉ็‚นใฎไธ€ใคใงใ™ใ€‚ ใฉใ†ใ—ใฆใ‚‚ไฝฟ็”จใ—ใชใ‘ใ‚Œใฐใชใ‚‰ใชใ„ๅ ดๅˆใฏใ€ใใ‚Œใ‚‰ใ‚’่จฑๅฏใ™ใ‚‹ไป•็ต„ใฟใŒใ„ใใคใ‹ใ‚ใ‚Šใพใ™ใ€‚ ใƒใƒƒใ‚ทใƒฅใฏใ‚คใƒณใƒฉใ‚คใƒณใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚„ใ‚นใ‚ฟใ‚คใƒซใซ้ฉ็”จใ•ใ‚Œใพใ™ใŒใ€ใ‚คใƒ™ใƒณใƒˆใƒใƒณใƒ‰ใƒฉใƒผใซใฏ้ฉ็”จใ•ใ‚Œใพใ›ใ‚“ใ€‚ ่ฉณใ—ใ„ๆƒ…ๅ ฑใฏๅฎ‰ๅ…จใงใฏใชใ„ใƒใƒƒใ‚ทใƒฅใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„ใ€‚

ใ‚คใƒณใƒฉใ‚คใƒณใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚„ใ‚นใ‚ฟใ‚คใƒซใ‚’่จฑๅฏใ™ใ‚‹ใŸใ‚ใซ 'unsafe-inline' ใ‚„ใ€ใ‚คใƒณใƒฉใ‚คใƒณใƒ–ใƒญใƒƒใ‚ฏใซไธ€่‡ดใ™ใ‚‹ใƒŽใƒณใ‚นใ‚ฝใƒผใ‚นใพใŸใฏใƒใƒƒใ‚ทใƒฅใ‚ฝใƒผใ‚นใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ไปฅไธ‹ใฎใ‚ณใƒณใƒ†ใƒณใƒ„ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใƒใƒชใ‚ทใƒผใงใฏใ€ใ‚คใƒณใƒฉใ‚คใƒณใฎ <script> ่ฆ็ด ใฏใ™ในใฆ่จฑๅฏใ•ใ‚Œใพใ™ใ€‚

http
Content-Security-Policy: script-src 'unsafe-inline';

ไปฅไธ‹ใฎ <script> ่ฆ็ด ใฏใ€ใƒใƒชใ‚ทใƒผใซใ‚ˆใฃใฆ่จฑๅฏใ•ใ‚Œใพใ™ใ€‚

html
<script>
  const inline = 1;
  // โ€ฆ
</script>

ใ™ในใฆใฎใ‚คใƒณใƒฉใ‚คใƒณใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’่จฑๅฏใ™ใ‚‹ใ“ใจใฏใ€ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃไธŠใฎใƒชใ‚นใ‚ฏใŒใ‚ใ‚‹ใจ่€ƒใˆใ‚‰ใ‚Œใ‚‹ใฎใงใ€ไปฃใ‚ใ‚Šใซ nonce-source ใพใŸใฏ hash-source ใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใŒๆŽจๅฅจใ•ใ‚Œใพใ™ใ€‚ nonce-source ใ‚’ไฝฟ็”จใ—ใฆใ‚คใƒณใƒฉใ‚คใƒณใ‚นใ‚ฏใƒชใƒ—ใƒˆใจใ‚นใ‚ฟใ‚คใƒซ่จญๅฎšใ‚’่จฑๅฏใ™ใ‚‹ใซใฏใ€๏ผˆๆš—ๅท็š„ใซๅฎ‰ๅ…จใชใƒฉใƒณใƒ€ใƒ ใƒˆใƒผใ‚ฏใƒณ็”Ÿๆˆๅ™จใ‚’ไฝฟ็”จใ—ใฆ๏ผ‰ใƒฉใƒณใƒ€ใƒ ใชใƒŽใƒณใ‚นๅ€คใ‚’็”Ÿๆˆใ—ใ€ใƒใƒชใ‚ทใƒผใซ่จ˜่ผ‰ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ ใ“ใ‚ŒใซใฏใƒกใƒขใŒๅฟ…่ฆใงใ™ใŒใ€ใ“ใฎใƒŽใƒณใ‚นๅ€คใฏ HTTP ใƒชใ‚ฏใ‚จใ‚นใƒˆใ”ใจใซไธ€ๆ„ใงใ‚ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใŸใ‚ใ€ๅ‹•็š„ใซ็”Ÿๆˆใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

http
Content-Security-Policy: script-src 'nonce-2726c7f26c'

ๅŒใ˜ใƒŽใƒณใ‚นใ‚’ <script> ่ฆ็ด ใซๆŒ‡ๅฎšใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

html
<script nonce="2726c7f26c">
  const inline = 1;
  // โ€ฆ
</script>

ไป–ใซใ‚‚ใ€ใ‚คใƒณใƒฉใ‚คใƒณใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‹ใ‚‰ใƒใƒƒใ‚ทใƒฅใ‚’็”Ÿๆˆใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ CSP ใงใฏ sha256, sha384, sha512 ใซๅฏพๅฟœใ—ใฆใ„ใพใ™ใ€‚

http
Content-Security-Policy: script-src 'sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8='

ใƒใƒƒใ‚ทใƒฅใ‚’็”Ÿๆˆใ™ใ‚‹ใจใใ€ <script> ใ‚ฟใ‚ฐใ‚’ๅซใ‚ใชใ„ใ‚ˆใ†ใซใ—ใ€ๅคงๆ–‡ๅญ—ๅฐๆ–‡ๅญ—ใจใ€ใƒ›ใƒฏใ‚คใƒˆใ‚นใƒšใƒผใ‚นใ€็‰นใซๅ‰ๅพŒใฎใƒ›ใƒฏใ‚คใƒˆใ‚นใƒšใƒผใ‚นใซๆณจๆ„ใ—ใฆใใ ใ•ใ„ใ€‚

html
<script>
  const inline = 1;
</script>

ๅฎ‰ๅ…จใงใฏใชใ„ใƒใƒƒใ‚ทใƒฅ

script-src 'sha256-{HASHED_INLINE_SCRIPT}' ใฎใ‚ˆใ†ใชใƒใƒƒใ‚ทใƒฅใ‚’ๆŒใคใ‚คใƒณใƒฉใ‚คใƒณใƒชใ‚ฝใƒผใ‚นใซๅฏพใ™ใ‚‹ใƒใƒชใ‚ทใƒผใฏใ€ใใฎใƒใƒƒใ‚ทใƒฅใซใ‚ˆใฃใฆใ‚นใ‚ฏใƒชใƒ—ใƒˆใจใ‚นใ‚ฟใ‚คใƒซใ‚’่จฑๅฏใ—ใพใ™ใŒใ€ใ‚คใƒ™ใƒณใƒˆใƒใƒณใƒ‰ใƒฉใƒผใฏ่จฑๅฏใ—ใพใ›ใ‚“ใ€‚

html
<!-- Allowed by CSP: script-src 'sha256-{HASHED_INLINE_SCRIPT}' -->
<script>
  const inline = 1;
</script>

<!-- CSP: script-src 'sha256-{HASHED_EVENT_HANDLER}'
      will not allow this event handler -->
<button onclick="myScript()">Submit</button>

'unsafe-inline' ใ‚’่จฑๅฏใ™ใ‚‹ไปฃใ‚ใ‚Šใซใ€ใ‚ณใƒผใƒ‰ใŒๅŒ็ญ‰ใฎ addEventListener ๅ‘ผใณๅ‡บใ—ใซๆ›ดๆ–ฐใงใใชใ„ๅ ดๅˆใฏ 'unsafe-hashes' ใ‚ฝใƒผใ‚น่กจ็พใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ไปฅไธ‹ใฎใ‚คใƒณใƒฉใ‚คใƒณใ‚คใƒ™ใƒณใƒˆใƒใƒณใƒ‰ใƒฉใƒผใ‚’่จ˜่ผ‰ใ—ใŸ HTML ใƒšใƒผใ‚ธใŒๆŒ‡ๅฎšใ•ใ‚ŒใŸใจใ—ใพใ™ใ€‚

html
<!-- I want to use addEventListener, but I can't :( -->
<button onclick="myScript()">Submit</button>

ไปฅไธ‹ใฎ CSP ใƒ˜ใƒƒใƒ€ใƒผใŒใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎๅฎŸ่กŒใ‚’่จฑๅฏใ—ใพใ™ใ€‚

http
Content-Security-Policy:  script-src 'unsafe-hashes' 'sha256-{HASHED_EVENT_HANDLER}'

ๅฎ‰ๅ…จใงใฏใชใ„ eval ๅผ

'unsafe-eval' ใ‚ฝใƒผใ‚นๅผใฏใ€ๆ–‡ๅญ—ๅˆ—ใ‹ใ‚‰ใ‚ณใƒผใƒ‰ใ‚’็”Ÿๆˆใ™ใ‚‹ใ„ใใคใ‹ใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆๅฎŸ่กŒใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅˆถๅพกใ—ใพใ™ใ€‚ ใ‚‚ใ—ใƒšใƒผใ‚ธใซ CSP ใƒ˜ใƒƒใƒ€ใƒผใŒใ‚ใ‚Šใ€ 'unsafe-eval' ใŒ script-src ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใงๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใชใ‹ใฃใŸๅ ดๅˆใ€ไปฅไธ‹ใฎใƒกใ‚ฝใƒƒใƒ‰ใฏใƒ–ใƒญใƒƒใ‚ฏใ•ใ‚Œใฆไฝ•ใฎๅŠนๆžœใ‚‚็พใ‚Œใพใ›ใ‚“ใ€‚

  • eval()
  • Function()
  • ใƒกใ‚ฝใƒƒใƒ‰ใฎๆ–‡ๅญ—ๅˆ—ใƒชใƒ†ใƒฉใƒซใ‚’ setTimeout("alert(\"Hello World!\");", 500); ใฎใ‚ˆใ†ใซๆธกใ—ใŸๅ ดๅˆ

  • window.execScript() ้žๆจ™ๆบ– (IE < 11 ใฎใฟ)

ๅฎ‰ๅ…จใงใฏใชใ„ WebAssembly ใฎๅฎŸ่กŒ

'wasm-unsafe-eval' ใ‚ฝใƒผใ‚นๅผใฏ WebAssembly ใฎๅฎŸ่กŒใ‚’ๅˆถๅพกใ—ใพใ™ใ€‚ ใƒšใƒผใ‚ธใŒ CSP ใƒ˜ใƒƒใƒ€ใƒผใ‚’ไฟๆœ‰ใ—ใ€script-src ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใง 'wasm-unsafe-eval' ใŒๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใชใ„ๅ ดๅˆใ€WebAssembly ใฏใใฎใƒšใƒผใ‚ธใงใฎ่ชญใฟ่พผใฟใจๅฎŸ่กŒใ‚’ใƒ–ใƒญใƒƒใ‚ฏใ•ใ‚Œใพใ™ใ€‚

'wasm-unsafe-eval' ใ‚ฝใƒผใ‚น่กจ็พใฏ 'unsafe-eval' ใ‚ˆใ‚Šใ‚‚่ฉณ็ดฐใงใ€WebAssembly ใฎใ‚ณใƒณใƒ‘ใ‚คใƒฉใƒผ๏ผˆใจใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นๅŒ–๏ผ‰ใจใ€ไพ‹ใˆใฐ JavaScript ใง eval ๅ‡ฆ็†ใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใฎไธกๆ–นใ‚’่จฑๅฏใ—ใฆใ„ใพใ™ใ€‚ 'unsafe-eval' ใ‚ฝใƒผใ‚นใ‚ญใƒผใƒฏใƒผใƒ‰ใŒไฝฟ็”จใ•ใ‚ŒใŸๅ ดๅˆใ€CSP ใƒใƒชใ‚ทใƒผใฎ 'wasm-unsafe-eval' ใŒไฝฟ็”จใ•ใ‚Œใ‚‹ใจใ€ใ“ใฎใ‚ญใƒผใƒฏใƒผใƒ‰ใŒไธŠๆ›ธใใ•ใ‚Œใพใ™ใ€‚

http
Content-Security-Policy: script-src 'wasm-unsafe-eval'

strict-dynamic

'strict-dynamic' ใ‚ฝใƒผใ‚นๅผใฏใ€ใƒžใƒผใ‚ฏใ‚ขใƒƒใƒ—ไธญใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใซๆ˜Ž็คบ็š„ใซไธŽใˆใ‚‰ใ‚ŒใŸไฟก้ ผใŒใ€ใƒŽใƒณใ‚นใ‚„ใƒใƒƒใ‚ทใƒฅใ‚’ไผดใฃใฆใ€ใใฎใƒซใƒผใƒˆใ‚นใ‚ฏใƒชใƒ—ใƒˆใซใ‚ˆใฃใฆ่ชญใฟ่พผใพใ‚Œใ‚‹ใ™ในใฆใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใซไผๆฌใ•ใ‚Œใ‚‹ใ“ใจใ‚’ๆŒ‡ๅฎšใ—ใพใ™ใ€‚ๅŒๆ™‚ใซใ€ 'self' ใ‚„ 'unsafe-inline' ใฎใ‚ˆใ†ใชใƒ›ใƒฏใ‚คใƒˆใƒชใ‚นใƒˆใ‚„ใ‚ฝใƒผใ‚น่กจ็พใฏ็„ก่ฆ–ใ•ใ‚Œใพใ™ใ€‚

ไพ‹ใˆใฐใ€ script-src 'strict-dynamic' 'nonce-R4nd0m' https://allowlisted.com/ ใฎใ‚ˆใ†ใชใƒใƒชใ‚ทใƒผใงใฏใ€ <script nonce="R4nd0m" src="https://example.com/loader.js"> ใ‚’ๆŒ‡ๅฎšใ—ใŸใƒซใƒผใƒˆใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎ่ชญใฟ่พผใฟใ‚’่จฑๅฏใ—ใ€ loader.js ใง่ชญใฟ่พผใพใ‚ŒใŸใ™ในใฆใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใซใใฎไฟก้ ผๆ€งใ‚’ไผๆ’ญใ•ใ›ใพใ™ใŒใ€ https://allowlisted.com/ ใ‹ใ‚‰ใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎ่ชญใฟ่พผใฟใฏใ€ใƒŽใƒณใ‚นใ‚’ไผดใฃใฆใ„ใ‚‹ใ‹ใ€ไฟก้ ผใ•ใ‚ŒใŸใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‹ใ‚‰่ชญใฟ่พผใพใ‚ŒใŸใ‚‚ใฎใงใชใ„้™ใ‚Šใ€่จฑๅฏใ—ใพใ›ใ‚“ใ€‚

http
Content-Security-Policy: script-src 'strict-dynamic' 'nonce-someNonce'

ใพใŸใฏ

http
Content-Security-Policy: script-src 'strict-dynamic' 'sha256-base64EncodedHash'

ใƒฆใƒผใ‚ถใƒผใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใฎใ‚นใƒ‹ใƒƒใƒ•ใ‚ฃใƒณใ‚ฐใ‚’ๅฟ…่ฆใจใ›ใšใ€ๅพŒๆ–นไบ’ๆ›ๆ€งใฎใ‚ใ‚‹ๆ–นๆณ•ใจใ—ใฆใ€ strict-dynamic ใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ไปฅไธ‹ใฎใƒใƒชใ‚ทใƒผใ€

http
Content-Security-Policy: script-src 'unsafe-inline' https: 'nonce-abcdefg' 'strict-dynamic'

ใฏใ€ CSP1 ใซๅฏพๅฟœใ—ใŸใƒ–ใƒฉใ‚ฆใ‚ถใƒผใงใฏ 'unsafe-inline' https: ใฎใ‚ˆใ†ใซๅ‹•ไฝœใ—ใ€ CSP2 ใซๅฏพๅฟœใ—ใŸใƒ–ใƒฉใ‚ฆใ‚ถใƒผใงใฏ https: 'nonce-abcdefg' ใฎใ‚ˆใ†ใซใ€CSP3 ใซๅฏพๅฟœใ—ใŸใƒ–ใƒฉใ‚ฆใ‚ถใƒผใงใฏ 'nonce-abcdefg' 'strict-dynamic' ใฎใ‚ˆใ†ใซๅ‹•ไฝœใ—ใพใ™ใ€‚

ๆŠ•ๆฉŸใƒซใƒผใƒซใ‚’่จฑๅฏ

script ่ฆ็ด ใซๆŠ•ๆฉŸใƒซใƒผใƒซใ‚’ๅ…ฅใ‚Œใ‚‹ๅ ดๅˆใฏ๏ผˆ<script type="speculationrules"> ใ‚‚ๅ‚็…ง๏ผ‰ใ€ script-src ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใ‚’ 'inline-speculation-rules' ใ‚ฝใƒผใ‚นใ€ใƒใƒƒใ‚ทใƒฅใ‚ฝใƒผใ‚นใ€ใƒŽใƒณใ‚นใ‚ฝใƒผใ‚นใฎใ„ใšใ‚Œใ‹ใจๅ…ฑใซไฝฟ็”จใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ไพ‹ใ‚’็คบใ—ใพใ™ใ€‚

http
Content-Security-Policy: script-src 'inline-speculation-rules'

ไป•ๆง˜ๆ›ธ

Specification
Content Security Policy Level 3
# directive-script-src

ใƒ–ใƒฉใ‚ฆใ‚ถใƒผใฎไบ’ๆ›ๆ€ง

้–ข้€ฃๆƒ…ๅ ฑ