CSP: report-uri
鿍奍;: ãã®æ©è½ã¯éæ¨å¥¨ã«ãªãã¾ãããã¾ã 対å¿ãã¦ãããã©ã¦ã¶ã¼ãããããããã¾ãããããã§ã«é¢é£ããã¦ã§ãæ¨æºããåé¤ããã¦ããããåé¤ã®æç¶ãä¸ã§ããããäºææ§ã®ããã ãã«æ®ããã¦ããå¯è½æ§ãããã¾ãã使ç¨ãé¿ããã§ããã°æ¢åã®ã³ã¼ãã¯æ´æ°ãã¦ãã ããããã®ãã¼ã¸ã®ä¸é¨ã«ããäºææ§ä¸è¦§è¡¨ãè¦ã¦å¤æãã¦ãã ããããã®æ©è½ã¯çªç¶åä½ããªããªãå¯è½æ§ããããã¨ã«æ³¨æãã¦ãã ããã
è¦å:
report-to ãã£ã¬ã¯ãã£ãã¯ã report-uri ãã£ã¬ã¯ãã£ããç½®ãæããããã®ãã®ã§ããã report-to ã«å¯¾å¿ãããã©ã¦ã¶ã¼ã§ã¯ã report-uri ãã£ã¬ã¯ãã£ãã¯ç¡è¦ããã¾ãã
ãããã report-to ã®å¯¾å¿ãé²ãã¾ã§ã¯ã次ã®ããã«ä¸¡æ¹ã®ãããã¼æå®ãããã¨ãã§ãã¾ãã
Content-Security-Policy: â¦; report-uri https://endpoint.example.com; report-to endpoint_name
HTTP ã® Content-Security-Policy (CSP) ã«ããã report-uri ãã£ã¬ã¯ãã£ãã¯éæ¨å¥¨ã§ããã£ã¬ã¯ãã£ãã¯ãã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ã¼ã«éåãã試ã¿ãå ±åããããã ã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ãã«æç¤ºãã¾ãã
ãããã®éåã¬ãã¼ãã¯ãæå®ããã URI ã¸ã® HTTP POST ãªã¯ã¨ã¹ãã§éããã JSON ææ¸ã§æ§æããã¾ãã
ãã®ãã£ã¬ã¯ãã£ãã¯ãããèªä½ã«ã¯ä½ã®å¹æããªããä»ã®ãã£ã¬ã¯ãã£ãã¨çµã¿åããã¦åãã¦æå³ãæã¤ãã®ã§ãã
| CSP ãã¼ã¸ã§ã³ | 1 |
|---|---|
| ãã£ã¬ã¯ãã£ãç¨®å¥ | å ±åãã£ã¬ã¯ãã£ã |
ãã®ãã£ã¬ã¯ãã£ã㯠<meta> è¦ç´ ã«ã¯å¯¾å¿ãã¦ãã¾ããã
|
|
æ§æ
Content-Security-Policy: report-uri <uri>;
Content-Security-Policy: report-uri <uri> <uri>;
- <uri>
-
å ±åã® POST å ã¨ãªãURIã
éåã¬ãã¼ãã®æ§æ
ã¬ãã¼ãã® JSON ãªãã¸ã§ã¯ãã¯ã HTTP ã® POST æä½ã§ã Content-Type ã application/csp-report ã¨ãã¦éä¿¡ããã¾ãã
ã¡ã¢:éåã¬ãã¼ãã¯æ»æè ã«ãã£ã¦å¶å¾¡ããããã¼ã¿ã§ããã¨ã¿ãªãã¹ãã§ãã ã³ã³ãã³ãã¯ãæ ¼ç´ã¾ãã¯ã¬ã³ããªã³ã°ããåã«æ£è¦åããå¿ è¦ãããã¾ãã ããã¯ã script-sample ããããã£ãæå®ããã¦ããå ´åãç¹ã«å½ã¦ã¯ã¾ãã¾ãã
ã¬ãã¼ãã® JSON ãªãã¸ã§ã¯ãã«ã¯ãåä¸ã®æä¸ä½ãããã㣠"csp-report" ãããã以ä¸ã®ããããã£ãæã¤ãªãã¸ã§ã¯ããå«ã¾ãã¦ãã¾ãã
blocked-uri-
ã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ã¼ã«ãã£ã¦èªã¿è¾¼ã¿ããããã¯ããããªã½ã¼ã¹ã® URI ã§ãã ãããã¯ããã URI ã
document-uriã¨ã¯ç°ãªããªãªã¸ã³ã®ãã®ã§ããå ´åããããã¯ããã URI ã¯ã¹ãã¼ã ããã¹ãããã¼ãã®ã¿ãå«ãããã«åãè©°ãããã¾ãã disposition-
Content-Security-Policy-Report-Onlyãããã¼ã¨Content-Security-Policyã®ã©ã¡ãã使ç¨ããã¦ãããã«ãã£ã¦ã"enforce"ã¾ãã¯"report"ã®ã©ã¡ããã«ãªãã¾ãã document-uri-
éåãçºçããææ¸ã® URI ã§ãã
effective-directive-
ãã®æ½è¡ãéåã®çºçåå ã¨ãªã£ããã£ã¬ã¯ãã£ãã§ãã ä¸é¨ã®ãã©ã¦ã¶ã¼ãä¾ãã° Chrome ã§ã¯ãå¼·å¶ãã£ã¬ã¯ãã£ãã
style-srcã§ãã£ãå ´åã§ããstyle-src-elem/style-src-attrã¨ããå¤ãæä¾ãããå ´åãããã¾ãã original-policy-
HTTP ã®
Content-Security-Policyãããã¼ã§æå®ãããå ã®ããªã·ã¼ã§ãã referrer-
éåãçºçããææ¸ã®ãªãã¡ã©ã¼ã§ãã
script-sample-
éåãçºçããã¤ã³ã©ã¤ã³ã¹ã¯ãªãããã¤ãã³ããã³ãã©ã¼ãã¹ã¿ã¤ã«è¨å®ã®æåã® 40 æåã å¤é¨ãã¡ã¤ã«ã«èµ·å ããéåã¯ã¬ãã¼ãã«å«ã¾ãã¾ããã
ããã¯ã
script-src*ããã³style-src*ã®éåã§ã対å¿ããContent-Security-Policyãã£ã¬ã¯ãã£ãã'report-sample'ã®ãã¼ã¯ã¼ããå«ãå ´åã«ã®ã¿é©ç¨ããã¾ãã status-code-
ãã®ã°ãã¼ãã«ãªãã¸ã§ã¯ããã¤ã³ã¹ã¿ã³ã¹åããããªã½ã¼ã¹ã® HTTP ã¹ãã¼ã¿ã¹ã³ã¼ãã
violated-directive-
ãã®ãã£ã¬ã¯ãã£ãã®é©ç¨ãéåãçºçããã¾ããã
violated-directiveã¯ãeffective-directiveãã£ã¼ã«ãã®ä»¥åã®ååã§ãããåãå¤ãå«ã¾ãã¦ãã¾ãã
ä¾
>Content-Security-Policy ã® CSP éåã¬ãã¼ã
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-uri /_/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仿§æ¸ã«ã¯ããã®åä½ã«ã¤ãã¦èª¬æãè¨è¼ããã¦ãã¾ãã
Content-Security-Policy-Report-Only ã® CSP éåã¬ãã¼ã
report-uri ãã£ã¬ã¯ãã£ãã¯ã Content-Security-Policy-Report-Only ã¬ã¹ãã³ã¹ãããã¼ã§ã使ç¨ãããã¨ãã§ãã¾ãã
ãã®ãããã¼ã«ãããæ¤æ»æã«ãã©ã¦ã¶ã¼ãéåãå ±åãããã¨ã¯ã§ãã¾ããããããã¯ã¯ãã¾ããã
HTTP ãããã¼ãã»ã¼åãã§ãã
Content-Security-Policy-Report-Only: default-src 'none'; style-src cdn.example.com; report-to /_/csp-reports
ãã®ã¬ãã¼ãã¯ã disposition ã "report" ã§ãããã¨ã¨ããã¡ãã "original-policy" ãé¤ãã¦åä¸ã§ãã
{
"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-uri /_/csp-reports",
"referrer": "",
"status-code": 200,
"violated-directive": "style-src-elem"
}
}
CSP éåã®ãã°è¨é²
ãµã¼ãã¼ã次㮠Content-Security-Policy ãããã¼ã§ãã¬ã¹ãã³ã¹ãéä¿¡ããã¨æå®ãããå ´åã
Content-Security-Policy: default-src https:; report-uri /csp-violation-report-endpoint/
/csp-violation-report-endpoint/ ã¯ãä¾ãã°ä»¥ä¸ã®ãã㪠PHP ãå®è¡ããéåã®è©³ç´°ã JSON ã§ãã°åºåããéåããã°ãã¡ã¤ã«ã«è¿½å ãããæåã®ãã®ã§ããã°ã管çè
ã«ã¡ã¼ã«ãéä¿¡ãããã¨ãå¯è½ã§ãã
<?php
// Start configure
$log_file = dirname(__FILE__) . '/csp-violations.log';
$log_file_size_limit = 1000000; // bytes - once exceeded no further entries are added
$email_address = 'admin@example.com';
$email_subject = 'Content-Security-Policy violation';
// End configuration
$current_domain = preg_replace('/www\./i', '', $_SERVER['SERVER_NAME']);
$email_subject = $email_subject . ' on ' . $current_domain;
http_response_code(204); // HTTP 204 No Content
$json_data = file_get_contents('php://input');
// We pretty print the JSON before adding it to the log file
if ($json_data = json_decode($json_data)) {
$json_data = json_encode($json_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
if (!file_exists($log_file)) {
// Send an email
$message = "The following Content-Security-Policy violation occurred on " .
$current_domain . ":\n\n" .
$json_data .
"\n\nFurther CPS violations will be logged to the following log file, but no further email notifications will be sent until this log file is deleted:\n\n" .
$log_file;
mail($email_address, $email_subject, $message,
'Content-Type: text/plain;charset=utf-8');
} else if (filesize($log_file) > $log_file_size_limit) {
exit(0);
}
file_put_contents($log_file, $json_data, FILE_APPEND | LOCK_EX);
}
仿§æ¸
| 仿§æ¸ |
|---|
| Content Security Policy Level 3 > # directive-report-uri > |