日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Content Security Policy的学习理解

發布時間:2025/4/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Content Security Policy的学习理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容轉載自?http://www.cnblogs.com/alisecurity/p/5924023.html

跨域腳本攻擊 XSS 是最常見、危害最大的網頁安全漏洞。

為了防止它們,要采取很多編程措施,非常麻煩。很多人提出,能不能根本上解決問題,瀏覽器自動禁止外部注入惡意腳本?這就是"網頁安全政策"(Content Security Policy,縮寫 CSP)的來歷。本文詳細介紹如何使用 CSP 防止 XSS 攻擊。

一、簡介

CSP 的實質就是白名單制度,開發者明確告訴客戶端,哪些外部資源可以加載和執行,等同于提供白名單。它的實現和執行全部由瀏覽器完成,開發者只需提供配置。CSP 大大增強了網頁的安全性。攻擊者即使發現了漏洞,也沒法注入腳本,除非還控制了一臺列入了白名單的可信主機。

兩種方法可以啟用 CSP。一種是通過 HTTP 頭信息的Content-Security-Policy的字段。

Content-Security-Policy: script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:

另一種是通過網頁的<meta>標簽。

<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

上面代碼中,CSP 做了如下配置。

腳本:只信任當前域名

標簽:不信任任何URL,即不加載任何資源

?

樣式表:只信任cdn.example.org和third-party.org

框架(frame):必須使用HTTPS協議加載

其他資源:沒有限制

啟用后,不符合 CSP 的外部資源就會被阻止加載。

Chrome 的報錯信息。

Firefox 的報錯信息。

二、限制選項

CSP 提供了很多限制選項,涉及安全的各個方面。

2.1 資源加載限制

以下選項限制各類資源的加載。

script-src:外部腳本

style-src:樣式表

img-src:圖像

media-src:媒體文件(音頻和視頻)

font-src:字體文件

object-src:插件(比如 Flash)

child-src:框架

frame-ancestors:嵌入的外部資源(比如<frame>、<iframe>、<embed>和<applet>)

connect-src:HTTP 連接(通過 XHR、WebSockets、EventSource等)

worker-src:worker腳本

manifest-src:manifest 文件

2.2 default-src

default-src用來設置上面各個選項的默認值。

Content-Security-Policy: default-src 'self'

上面代碼限制所有的外部資源,都只能從當前域名加載。如果同時設置某個單項限制(比如font-src)和default-src,前者會覆蓋后者,即字體文件會采用font-src的值,其他資源依然采用default-src的值。

2.3 URL 限制

有時,網頁會跟其他 URL 發生聯系,這時也可以加以限制。

frame-ancestors:限制嵌入框架的網頁

base-uri:限制 <base#href>

form-action:限制 <form#action>

2.4 其他限制

其他一些安全相關的功能,也放在了 CSP 里面。

block-all-mixed-content:HTTPS 網頁不得加載 HTTP 資源(瀏覽器已經默認開啟)

upgrade-insecure-requests:自動將網頁上所有加載外部資源的 HTTP 鏈接換成 HTTPS 協議

plugin-types:限制可以使用的插件格式

sandbox:瀏覽器行為的限制,比如不能有彈出窗口等。

2.5 report-uri

有時,我們不僅希望防止 XSS,還希望記錄此類行為。report-uri就用來告訴瀏覽器,應該把注入行為報告給哪個網址。

Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;

上面代碼指定,將注入行為報告給/my_amazing_csp_report_parser這個 URL。
瀏覽器會使用POST方法,發送一個JSON對象,下面是一個例子。

{"csp-report": {"document-uri": "http://example.org/page.html","referrer": "http://evil.example.com/","blocked-uri": "http://evil.example.com/evil.js","violated-directive": "script-src 'self' https://apis.google.com","original-policy": "script-src 'self' https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser"} }

三、Content-Security-Policy-Report-Only

除了Content-Security-Policy,還有一個Content-Security-Policy-Report-Only字段,表示不執行限制選項,只是記錄違反限制的行為。它必須與report-uri選項配合使用。

Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;

四、選項值

每個限制選項可以設置以下幾種值,這些值就構成了白名單。

主機名:example.org,https://example.com:443

路徑名:example.org/resources/js/

通配符:*.example.org,*://*.example.com:*(表示任意協議、任意子域名、任意端口)

協議名:https:、data:

關鍵字'self':當前域名,需要加引號

關鍵字'none':禁止加載任何外部資源,需要加引號

多個值也可以并列,用空格分隔。

Content-Security-Policy: script-src 'self' https://apis.google.com

如果同一個限制選項使用多次,只有第一次會生效。

# 錯誤的寫法 script-src https://host1.com; script-src https://host2.com # 正確的寫法 script-src https://host1.com https://host2.com

如果不設置某個限制選項,就是默認允許任何值。

五、script-src 的特殊值

除了常規值,script-src還可以設置一些特殊值。注意,下面這些值都必須放在單引號里面。

'unsafe-inline':允許執行頁面內嵌的<script>標簽和事件監聽函數

unsafe-eval:允許將字符串當作代碼執行,比如使用eval、setTimeout、setInterval和Function等函數。

nonce值:每次HTTP回應給出一個授權token,頁面內嵌腳本必須有這個token,才會執行

hash值:列出允許執行的腳本代碼的Hash值,頁面內嵌腳本的哈希值只有吻合的情況下,才能執行。

nonce值的例子如下,服務器發送網頁的時候,告訴瀏覽器一個隨機生成的token。

Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

頁面內嵌腳本,必須有這個token才能執行。

<script nonce=EDNnf03nceIOfn39fn3e9h3sdfa> // some code </script>

hash值的例子如下,服務器給出一個允許執行的代碼的hash值。

Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='

下面的代碼就會允許執行,因為hash值相符。

<script>alert('Hello, world.');</script>

注意,計算hash值的時候,<script>標簽不算在內。

除了script-src選項,nonce值和hash值還可以用在style-src選項,控制頁面內嵌的樣式表。

六、注意點

(1)script-src和object-src是必設的,除非設置了default-src。

因為攻擊者只要能注入腳本,其他限制都可以規避。而object-src必設是因為 Flash 里面可以執行外部腳本。

(2)script-src不能使用unsafe-inline關鍵字(除非伴隨一個nonce值),也不能允許設置data:URL。

下面是兩個惡意攻擊的例子。

<img src="x" onerror="evil()"> <script src="data:text/javascript,evil()"></script>

(3)必須特別注意 JSONP 的回調函數。

<script src="/path/jsonp?callback=alert(document.domain)//"></script>

上面的代碼中,雖然加載的腳本來自當前域名,但是通過改寫回調函數,攻擊者依然可以執行惡意代碼。

七、參考鏈接

CSP Is Dead, Long Live CSP!?, by Lukas Weichselbaum

An Introduction to Content Security Policy?, by Mike West

?

? 參考鏈接 ASP.NET MVC中實施CSP http://rehansaeed.com/content-security-policy-for-asp-net-mvc/

上面代碼中,CSP 做了如下配置。

腳本:只信任當前域名

標簽:不信任任何URL,即不加載任何資源

?

樣式表:只信任cdn.example.org和third-party.org

框架(frame):必須使用HTTPS協議加載

其他資源:沒有限制

啟用后,不符合 CSP 的外部資源就會被阻止加載。

Chrome 的報錯信息。

Firefox 的報錯信息。

二、限制選項

CSP 提供了很多限制選項,涉及安全的各個方面。

2.1 資源加載限制

以下選項限制各類資源的加載。

script-src:外部腳本

style-src:樣式表

img-src:圖像

media-src:媒體文件(音頻和視頻)

font-src:字體文件

object-src:插件(比如 Flash)

child-src:框架

frame-ancestors:嵌入的外部資源(比如<frame>、<iframe>、<embed>和<applet>)

connect-src:HTTP 連接(通過 XHR、WebSockets、EventSource等)

worker-src:worker腳本

manifest-src:manifest 文件

2.2 default-src

default-src用來設置上面各個選項的默認值。

Content-Security-Policy: default-src 'self'

上面代碼限制所有的外部資源,都只能從當前域名加載。如果同時設置某個單項限制(比如font-src)和default-src,前者會覆蓋后者,即字體文件會采用font-src的值,其他資源依然采用default-src的值。

2.3 URL 限制

有時,網頁會跟其他 URL 發生聯系,這時也可以加以限制。

frame-ancestors:限制嵌入框架的網頁

base-uri:限制 <base#href>

form-action:限制 <form#action>

2.4 其他限制

其他一些安全相關的功能,也放在了 CSP 里面。

block-all-mixed-content:HTTPS 網頁不得加載 HTTP 資源(瀏覽器已經默認開啟)

upgrade-insecure-requests:自動將網頁上所有加載外部資源的 HTTP 鏈接換成 HTTPS 協議

plugin-types:限制可以使用的插件格式

sandbox:瀏覽器行為的限制,比如不能有彈出窗口等。

2.5 report-uri

有時,我們不僅希望防止 XSS,還希望記錄此類行為。report-uri就用來告訴瀏覽器,應該把注入行為報告給哪個網址。

Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;

上面代碼指定,將注入行為報告給/my_amazing_csp_report_parser這個 URL。
瀏覽器會使用POST方法,發送一個JSON對象,下面是一個例子。

{"csp-report": {"document-uri": "http://example.org/page.html","referrer": "http://evil.example.com/","blocked-uri": "http://evil.example.com/evil.js","violated-directive": "script-src 'self' https://apis.google.com","original-policy": "script-src 'self' https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser"} }

三、Content-Security-Policy-Report-Only

除了Content-Security-Policy,還有一個Content-Security-Policy-Report-Only字段,表示不執行限制選項,只是記錄違反限制的行為。它必須與report-uri選項配合使用。

Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;

四、選項值

每個限制選項可以設置以下幾種值,這些值就構成了白名單。

主機名:example.org,https://example.com:443

路徑名:example.org/resources/js/

通配符:*.example.org,*://*.example.com:*(表示任意協議、任意子域名、任意端口)

協議名:https:、data:

關鍵字'self':當前域名,需要加引號

關鍵字'none':禁止加載任何外部資源,需要加引號

多個值也可以并列,用空格分隔。

Content-Security-Policy: script-src 'self' https://apis.google.com

如果同一個限制選項使用多次,只有第一次會生效。

# 錯誤的寫法 script-src https://host1.com; script-src https://host2.com # 正確的寫法 script-src https://host1.com https://host2.com

如果不設置某個限制選項,就是默認允許任何值。

五、script-src 的特殊值

除了常規值,script-src還可以設置一些特殊值。注意,下面這些值都必須放在單引號里面。

'unsafe-inline':允許執行頁面內嵌的<script>標簽和事件監聽函數

unsafe-eval:允許將字符串當作代碼執行,比如使用eval、setTimeout、setInterval和Function等函數。

nonce值:每次HTTP回應給出一個授權token,頁面內嵌腳本必須有這個token,才會執行

hash值:列出允許執行的腳本代碼的Hash值,頁面內嵌腳本的哈希值只有吻合的情況下,才能執行。

nonce值的例子如下,服務器發送網頁的時候,告訴瀏覽器一個隨機生成的token。

Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

頁面內嵌腳本,必須有這個token才能執行。

<script nonce=EDNnf03nceIOfn39fn3e9h3sdfa> // some code </script>

hash值的例子如下,服務器給出一個允許執行的代碼的hash值。

Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='

下面的代碼就會允許執行,因為hash值相符。

<script>alert('Hello, world.');</script>

注意,計算hash值的時候,<script>標簽不算在內。

除了script-src選項,nonce值和hash值還可以用在style-src選項,控制頁面內嵌的樣式表。

六、注意點

(1)script-src和object-src是必設的,除非設置了default-src。

因為攻擊者只要能注入腳本,其他限制都可以規避。而object-src必設是因為 Flash 里面可以執行外部腳本。

(2)script-src不能使用unsafe-inline關鍵字(除非伴隨一個nonce值),也不能允許設置data:URL。

下面是兩個惡意攻擊的例子。

<img src="x" onerror="evil()"> <script src="data:text/javascript,evil()"></script>

(3)必須特別注意 JSONP 的回調函數。

<script src="/path/jsonp?callback=alert(document.domain)//"></script>

上面的代碼中,雖然加載的腳本來自當前域名,但是通過改寫回調函數,攻擊者依然可以執行惡意代碼。

七、參考鏈接

CSP Is Dead, Long Live CSP!?, by Lukas Weichselbaum

An Introduction to Content Security Policy?, by Mike West

?



轉載于:https://www.cnblogs.com/wphl-27/p/6148988.html

總結

以上是生活随笔為你收集整理的Content Security Policy的学习理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女操出白浆 | 日韩欧美网 | 久久伊人免费视频 | 亚洲第三十七页 | caoporn免费在线 | www.555国产精品免费 | 亚洲爱情岛论坛永久 | 又黄又高潮的视频 | 日韩精品影院 | 国产精品午夜久久 | 亚洲av成人一区二区国产精品 | 色噜噜网站 | 五月天婷婷爱 | 亚洲色图日韩精品 | 91免费黄视频 | 免费一级a毛片夜夜看 | 97在线精品视频 | 成人影 | 上原亚衣av一区二区三区 | 天天做天天躁天天躁 | 国产偷拍一区二区 | 亚洲一区 中文字幕 | 波多野结衣亚洲天堂 | 国产乡下妇女做爰毛片 | 中文字幕在线免费播放 | 黄色小视频在线观看 | 在线va视频 | 欧美骚少妇 | 日韩av免费在线播放 | 免费一区二区三区 | 色偷偷人人澡人人爽人人模 | 国产无套精品 | 台湾佬美性中文网 | 在线午夜av | 日本黄色动态图 | 成人激情在线视频 | 亚洲精选国产 | 91福利视频免费观看 | 国产精品久久久久一区二区 | 一区二区在线免费观看视频 | 五月天综合在线 | 偷拍老头老太高潮抽搐 | 婷婷久久综合 | 精品久久久视频 | 99久久久无码国产精品性波多 | 中文字幕免费在线视频 | 国产女人与zoxxxx另类 | 97免费观看视频 | 校园春色在线观看 | av国语| 内射无码专区久久亚洲 | 天天综合网久久综合网 | 亚洲xxxx18| 亚洲青春草 | 亚洲无卡 | 日韩在线视频观看 | 一本久道视频一本久道 | 蜜桃成熟时李丽珍国语 | 日本xxxx18高清hd | 国产白嫩美女无套久久 | 久久综合五月 | 色欧美日韩 | 老妇裸体性激交老太视频 | 黄色a站 | 成人免费无遮挡无码黄漫视频 | 色视频网址 | 国产中文字幕第一页 | 日本日韩欧美 | 伊人青青草原 | 狼人香蕉| 少妇脱了内裤让我添 | 91日韩一区二区 | 日日操网站 | 日日日日干 | 国产精品免费精品一区 | 久久久国 | 精品久久久久一区二区 | 99热一区二区 | 欧美激情在线看 | 久久精选 | 亚洲熟女综合一区二区三区 | 男女黄色录像 | 久操伊人网| 九九热精品视频 | 色涩视频在线观看 | www插插 | 日韩精品一区二区三区色欲av | 韩国中文字幕在线观看 | 91老司机在线 | 天天澡天天狠天天天做 | 国产成人自拍一区 | 日本国产视频 | 中文字幕在线不卡 | 成人免费在线电影 | 在线免费看av的网站 | 国产美女久久久久久 | 神马久久午夜 | 成人免费在线观看网站 | 久久综合成人 |