å 容å®å ¨çç¥ï¼CSPï¼
å 容å®å ¨çç¥ï¼CSPï¼æ¯ä¸ä¸ªé¢å¤çå®å ¨å±ï¼ç¨äºæ£æµå¹¶åå¼±æäºç¹å®ç±»åçæ»å»ï¼å æ¬è·¨ç«èæ¬ï¼XSSï¼åæ°æ®æ³¨å ¥æ»å»çãæ è®ºæ¯æ°æ®çåãç½ç«å 容污æè¿æ¯æ¶æè½¯ä»¶ååï¼è¿äºæ»å»é½æ¯ä¸»è¦çææ®µã
CSP 被设计æå®å ¨ååå ¼å®¹ï¼é¤ CSP2 å¨ååå ¼å®¹ææç¡®æåçä¸ä¸è´; æ´å¤ç»èæ¥çè¿é ç« è 1.1ï¼ã䏿¯æ CSP çæµè§å¨ä¹è½ä¸å®ç°äº CSP çæå¡å¨æ£å¸¸å·¥ä½ï¼åä¹äº¦ç¶ï¼ä¸æ¯æ CSP çæµè§å¨åªä¼å¿½ç¥å®ï¼å¦å¸¸è¿è¡ï¼é»è®¤ä¸ºç½é¡µå å®¹ä½¿ç¨æ åçåæºçç¥ã妿ç½ç«ä¸æä¾ CSP æ å¤´ï¼æµè§å¨ä¹ä½¿ç¨æ åçåæºçç¥ã
为使 CSP å¯ç¨ï¼ä½ éè¦é
ç½®ä½ çç½ç»æå¡å¨è¿å Content-Security-Policy HTTP æ å¤´ï¼ææ¶ä½ ä¼çå° X-Content-Security-Policy æ 头ï¼ä½é£æ¯æ§çæ¬ï¼å¹¶ä¸ä½ æ é¡»å妿¤æå®å®ï¼ã
餿¤ä¹å¤ï¼<meta> å
ç´ ä¹å¯ä»¥è¢«ç¨æ¥é
置该çç¥ï¼ä¾å¦
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src https://*; child-src 'none';" />
夿³¨ï¼æäºåè½ï¼ä¾å¦åé CSP è¿è§æ¥åï¼ä» å¨ä½¿ç¨ HTTP æ 头æ¶å¯ç¨ã
å¨è
>ç¼è§£è·¨ç«èæ¬æ»å»
CSP ç主è¦ç®æ æ¯åå°åæ¥å XSS æ»å»ãXSS æ»å»å©ç¨äºæµè§å¨å¯¹äºä»æå¡å¨æè·åçå 容çä¿¡ä»»ãæ¶æèæ¬å¨å害è çæµè§å¨ä¸å¾ä»¥è¿è¡ï¼å 为æµè§å¨ä¿¡ä»»å ¶å å®¹æ¥æºï¼å³ä½¿æçæ¶åè¿äºèæ¬å¹¶éæ¥èªäºå®æ¬è¯¥æ¥çå°æ¹ã
CSP éè¿æå®ææåââ峿µè§å¨è®¤å¯ç坿§è¡èæ¬çæææ¥æºââ使æå¡å¨ç®¡çè æè½ååå°ææ¶é¤ XSS æ»å»æä¾èµçè½½ä½ãä¸ä¸ª CSP å ¼å®¹çæµè§å¨å°ä¼ä» æ§è¡ä»ç½åååè·åå°çèæ¬æä»¶ï¼å¿½ç¥ææçå ¶ä»èæ¬ï¼å æ¬å èèæ¬å HTML çäºä»¶å¤ç屿§ï¼ã
ä½ä¸ºä¸ç§ç»æé²æ¤å½¢å¼ï¼å§ç»ä¸å 许æ§è¡èæ¬çç«ç¹å¯ä»¥éæ©å ¨é¢ç¦æ¢èæ¬æ§è¡ã
ç¼è§£æ°æ®å å æ¢æ»å»
é¤éå¶å¯ä»¥å è½½å
容çåï¼æå¡å¨è¿å¯ææåªç§åè®®å
许使ç¨ï¼æ¯å¦ï¼ä»çæ³åçå®å
¨è§åº¦æ¥è¯´ï¼ï¼æå¡å¨å¯æå®ææå
容å¿
é¡»éè¿ HTTPS å è½½ãä¸ä¸ªå®æ´çæ°æ®å®å
¨ä¼ è¾çç¥ä¸ä»
强å¶ä½¿ç¨ HTTPS è¿è¡æ°æ®ä¼ è¾ï¼ä¹ä¸ºææç cookie æ è®° secure æ è¯ï¼å¹¶ä¸æä¾èªå¨çéå®åä½¿å¾ HTTP 页é¢å¯¼å HTTPS çæ¬ãç½ç«ä¹å¯ä»¥ä½¿ç¨ Strict-Transport-Security HTTP æ 头确ä¿è¿æ¥å®çæµè§å¨åªä½¿ç¨å å¯ééã
ä½¿ç¨ CSP
é
ç½®å
容å®å
¨çç¥æ¶åå°æ·»å Content-Security-Policy HTTP æ 头å°ä¸ä¸ªé¡µé¢ï¼å¹¶é
ç½®ç¸åºçå¼ï¼ä»¥æ§å¶ç¨æ·ä»£çï¼æµè§å¨çï¼å¯ä»¥ä¸ºè¯¥é¡µé¢è·ååªäºèµæºãæ¯å¦ä¸ä¸ªå¯ä»¥ä¸ä¼ æä»¶åæ¾ç¤ºå¾ç页é¢ï¼åºè¯¥å
许å¾çæ¥èªä»»ä½å°æ¹ï¼ä½éå¶è¡¨åç action 屿§åªå¯ä»¥èµå¼ä¸ºæå®ç端ç¹ãä¸ä¸ªç»è¿æ°å½è®¾è®¡çå
容å®å
¨çç¥åºè¯¥å¯ä»¥ææçä¿æ¤é¡µé¢å
åè·¨ç«èæ¬æ»å»ãæ¬æéè¿°å¦ä½æ°å½çæé è¿æ ·çæ 头ï¼å¹¶æä¾äºä¸äºä¾åã
å¶å®çç¥
ä½ å¯ä»¥ä½¿ç¨ Content-Security-Policy HTTP æ å¤´æ¥æå®ä½ ççç¥ï¼åè¿æ ·ï¼
Content-Security-Policy: policy
çç¥ï¼policyï¼åæ°æ¯ä¸ä¸ªå å«äºåç§æè¿°ä½ ç CSP çç¥æä»¤çå符串ã
ç¼åçç¥
çç¥ç±ä¸ç³»åçç¥æä»¤æç»æï¼æ¯ä¸ªçç¥æä»¤é½æè¿°äºé对æä¸ªç¹å®èµæºçç±»å以åçç¥çæçèå´ãä½ ççç¥åºå½å
å«ä¸ä¸ª default-src çç¥æä»¤ï¼å¨å
¶ä»èµæºç±»å没æç¬¦åèªå·±ççç¥æ¶åºç¨è¯¥çç¥ï¼æå
³å®æ´å表ï¼è¯·æ¥ç default-src æä»¤çæè¿°ï¼ãä¸ä¸ªçç¥å¯ä»¥å
å« default-src æè
script-src æä»¤æ¥é²æ¢å
èèæ¬è¿è¡ï¼å¹¶æç» eval() ç使ç¨ãä¸ä¸ªçç¥ä¹å¯å
å«ä¸ä¸ª default-src æ style-src æä»¤å»éå¶æ¥èªä¸ä¸ª <style> å
ç´ æè
style 屿§çå
§èæ ·å¼ã对äºä¸åç±»åç项ç®é½æç¹å®çæä»¤ï¼å æ¤æ¯ç§ç±»åé½å¯ä»¥æèªå·±çæä»¤ï¼å
æ¬åä½ãframeãå¾åãé³é¢åè§é¢åªä½ãscript å workerã
示ä¾ï¼å¸¸è§ç¨ä¾
è¿ä¸é¨åæä¾äºä¸äºå¸¸ç¨çå®å ¨çç¥æ¹æ¡ç¤ºä¾ã
ç¤ºä¾ 1
ä¸ä¸ªç½ç«ç®¡çè æ³è¦ææå 容忥èªç«ç¹çåä¸ä¸ªæºï¼ä¸å æ¬å ¶åååï¼ã
Content-Security-Policy: default-src 'self'
ç¤ºä¾ 2
ä¸ä¸ªç½ç«ç®¡çè å 许å 容æ¥èªä¿¡ä»»çåååå ¶åååï¼ååä¸å¿ é¡»ä¸ CSP 设置æå¨çååç¸åï¼ã
Content-Security-Policy: default-src 'self' *.trusted.com
ç¤ºä¾ 3
ä¸ä¸ªç½ç«ç®¡çè å 许ç½é¡µåºç¨çç¨æ·å¨ä»ä»¬èªå·±çå 容ä¸å 嫿¥èªä»»ä½æºçå¾çï¼ä½æ¯éå¶é³é¢æè§é¢éä»ä¿¡ä»»çèµæºæä¾è ï¼ææèæ¬å¿ é¡»ä»ç¹å®ä¸»æºæå¡å¨è·åå¯ä¿¡ç代ç ã
Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
å¨è¿éï¼åç§å 容é»è®¤ä» å è®¸ä»ææ¡£æå¨çæºè·åï¼ä½åå¨å¦ä¸ä¾å¤ï¼
- å¾çå¯ä»¥ä»ä»»ä½å°æ¹å è½½ (注æâ*âéé 符)ã
- å¤åªä½æä»¶ä» å è®¸ä» media1.com å media2.com å è½½ï¼ä¸å 许ä»è¿äºç«ç¹çåååï¼ã
- å¯è¿è¡èæ¬ä» å 许æ¥èªäº userscripts.example.comã
ç¤ºä¾ 4
ä¸ä¸ªçº¿ä¸é¶è¡ç½ç«ç管çè æ³è¦ç¡®ä¿ç½ç«çææå 容é½è¦éè¿ SSL æ¹å¼è·åï¼ä»¥é¿å æ»å»è çªå¬ç¨æ·ååºç请æ±ã
Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
该æå¡å¨ä» å 许éè¿ HTTPS æ¹å¼å¹¶ä» ä» onlinebanking.jumbobank.com ååæ¥è®¿é®ææ¡£ã
ç¤ºä¾ 5
ä¸ä¸ªå¨çº¿é®ç®±ç管çè æ³è¦å 许å¨é®ä»¶éå å« HTMLï¼åæ ·å¾çå 许ä»ä»»ä½å°æ¹å è½½ï¼ä½ä¸å 许 JavaScript æè å ¶ä»æ½å¨çå±é©å 容ï¼ä»ä»»æä½ç½®å è½½ï¼ã
Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *
注æè¿ä¸ªç¤ºä¾å¹¶æªæå® script-srcï¼å¨æ¤ CSP 示ä¾ä¸ï¼ç«ç¹éè¿ default-src æä»¤ç对å
¶è¿è¡é
ç½®ï¼è¿ä¹åæ ·æå³çèæ¬æä»¶ä»
å
许ä»åå§æå¡å¨è·åã
对çç¥è¿è¡æµè¯
为éä½é¨ç½²ææ¬ï¼CSP å¯ä»¥é¨ç½²ä¸ºä» æ¥åï¼report-onlyï¼æ¨¡å¼ã卿¤æ¨¡å¼ä¸ï¼CSP çç¥ä¸æ¯å¼ºå¶æ§çï¼ä½æ¯ä»»ä½è¿è§è¡ä¸ºå°ä¼æ¥åç»ä¸ä¸ªæå®ç URI å°åãæ¤å¤ï¼ä» æ¥åæ 头å¯ä»¥ç¨æ¥æµè¯å¯¹çç¥æªæ¥ç修订ï¼èä¸ç¨å®é é¨ç½²å®ã
ä½ å¯ä»¥ç¨ Content-Security-Policy-Report-Only HTTP æ å¤´æ¥æå®ä½ ççç¥ï¼åè¿æ ·ï¼
Content-Security-Policy-Report-Only: policy
妿 Content-Security-Policy-Report-Only æ 头å Content-Security-Policy åæ¶åºç°å¨ä¸ä¸ªååºä¸ï¼ä¸¤ä¸ªçç¥åææãå¨ Content-Security-Policy æ 头䏿å®ççç¥æå¼ºå¶æ§ï¼è Content-Security-Policy-Report-Only ä¸ççç¥ä»
äº§çæ¥åèä¸å
·æå¼ºå¶æ§ã
æ¯æ CSP çæµè§å¨å°å§ç»å¯¹äºæ¯ä¸ªä¼å¾è¿åä½ æå»ºç«ççç¥é½åéè¿è§æ¥åï¼å¦æçç¥éå
å«ä¸ä¸ªææçreport-uri æä»¤ã
å¯ç¨æ¥å
é»è®¤æ
åµä¸ï¼è¿è§æ¥åå¹¶ä¸ä¼åéã为å¯ç¨åéè¿è§æ¥åï¼ä½ éè¦æå® report-to çç¥æä»¤ï¼å¹¶æä¾è³å°ä¸ä¸ª URI å°åå»é交æ¥åï¼
Content-Security-Policy: default-src 'self'; report-uri http://reportcollector.example.com/collector.cgi
ç¶åä½ éè¦è®¾ç½®ä½ çæå¡å¨è½å¤æ¥æ¶æ¥åï¼ä½¿å ¶è½å¤ä»¥ä½ 认为æ°å½çæ¹å¼åå¨å¹¶å¤çè¿äºæ¥åã
è¿è§æ¥åçè¯æ³
ä½ä¸ºæ¥åç JSON 对象å application/csp-report Content-Type ä¸èµ·åéï¼å¹¶å
å«äºä»¥ä¸æ°æ®ï¼
blocked-uri-
被 CSP 黿¢çèµæº URIãå¦æè¢«é»æ¢ç URI æ¥èªä¸åçæºèé
document-uriï¼é£ä¹è¢«é»æ¢çèµæº URI ä¼è¢«å åï¼ä» ä¿çåè®®ã主æºå端å£å·ã disposition-
æ ¹æ®
Content-Security-Policy-Report-OnlyåContent-Security-Policyæ å¤´ä½¿ç¨æ åµçä¸åï¼å¼ä¸º"enforce"æ"report"ã document-uri-
åçè¿è§çææ¡£ç URIã
effective-directive-
导è´è¿è§è¡ä¸ºåççæä»¤ãä¸äºæµè§å¨å¯è½æä¾ä¸åçå¼ï¼ä¾å¦ Chrome æä¾
style-src-elemæstyle-src-attrï¼å³ä½¿å®é æ§è¡çæä»¤æ¯style-srcã original-policy-
ç±
Content-Security-PolicyHTTP æ 头æå®çåå§çç¥å¼ã referrer-
è¿è§åçå¤çææ¡£å¼ç¨ï¼å°åï¼ã
script-sample-
导è´è¯¥è¿è§çå è代ç ãäºä»¶å¤çå¨ææ ·å¼çå 40 个å符ãåªéç¨äº
script-src*æstyle-src*å å«'report-sample'çæ åµã status-code-
å ¨å±å¯¹è±¡è¢«å®ä¾åçèµæºç HTTP ç¶æä»£ç ã
violated-directive-
导è´è¿åçç¥çæä»¤ã
violated-directiveæ¯effective-directiveåæ®µçåå²åç§°ï¼å¹¶å å«ç¸åçå¼ã
è¿è§æ¥åçæ ·æ¬
æä»¬å设页é¢ä½äº http://example.com/signup.htmlãå®ä½¿ç¨å¦ä¸çç¥ï¼è¯¥çç¥ç¦æ¢ä»»ä½èµæºçå è½½ï¼é¤äºæ¥èª cdn.example.com çæ ·å¼è¡¨ã
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
signup.html ç HTML åè¿æ ·ï¼
<!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<title>Sign Up</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
Here be content.
</body>
</html>
ä½ è½çåºå
¶ä¸é误åï¼è¿éä»
å
许å è½½èª cdn.example.com çæ ·å¼è¡¨ï¼ç¶è该页é¢ä¼å¾ä»èªå·±çæºï¼http://example.comï¼å è½½ãå½è¯¥ææ¡£è¢«è®¿é®æ¶ï¼ä¸ä¸ªå
¼å®¹ CSP çæµè§å¨å°ä»¥ POST 请æ±çå½¢å¼åéè¿è§æ¥åå° http://example.com/_/csp-reportsï¼å
容å¦ä¸ï¼
{
"csp-report": {
"blocked-uri": "http://example.com/css/style.css",
"disposition": "report",
"document-uri": "http://example.com/signup.html",
"effective-directive": "style-src-elem",
"original-policy": "default-src 'none'; style-src cdn.example.com; report-to /_/csp-reports",
"referrer": "",
"status-code": 200,
"violated-directive": "style-src-elem"
}
}
å¦ä½ æè§ï¼è¯¥æ¥åå¨ blocked-uri åæ®µä¸å
å«äºè¿è§èµæºç宿´è·¯å¾ï¼ä½æ
åµå¹¶éæ»æ¯å¦æ¤ãæ¯å¦ï¼å½ signup.html è¯å¾ä» http://anothercdn.example.com/stylesheet.css å è½½ CSS æ¶ï¼æµè§å¨å°ä¸ä¼å
å«å®æ´è·¯å¾ï¼èåªä¼ä¿çæºè·¯å¾ï¼http://anothercdn.example.comï¼ãCSP ææ¯è§èå°ç»å¯¹æ¤å¤æªè¡ä¸ºç»åºäºè§£éã大ä½ä¸è¯´ï¼è¿æ ·æ¯ä¸ºäºé²æ¢æ³é²è·¨æºèµæºçææä¿¡æ¯ã
æµè§å¨å ¼å®¹æ§
>å ¼å®¹æ§å¤æ³¨
卿äºçæ¬ç Safari ç½ç»æµè§å¨ä¸åå¨ä¸ç§ç¹æ®çä¸å ¼å®¹æ§ï¼å³å¦æè®¾ç½®äºå 容å®å ¨çç¥æ 头ï¼ä½æ²¡æè®¾ç½®ç¸åæ¥æºï¼Same Originï¼æ å¤´ãæµè§å¨å°é»æ¢èªææç®¡çå 容åç½ç«å¤çå 容ï¼å¹¶éè¯¯å°æ¥åè¯´è¿æ¯ç±äºå 容å®å ¨æ¿çä¸å 许该å 容ã
åè§
Content-Security-PolicyHTTP æ 头Content-Security-Policy-Report-OnlyHTTP æ 头- WebExtensions ä¸çå®å ¨çç¥
- Web Worker ä¸ç CSP
- éç§ãæéåä¿¡æ¯å®å ¨
- CSP è¯ä¼°å¨ââè¯ä¼°ä½ çå 容å®å ¨çç¥