我有一个 Angular 应用程序 + NET 8 API 一起托管在 IIS 站点中。
我正在尝试使用“nonce”(仅使用一次的数字)来实施内容安全策略。这意味着对于发送到客户端的每个响应,我必须在传递之前在 index.html 中设置一个新的“随机数”。
IIS 是否能够为收到的每个 HTTP 请求生成一个新的随机数,并在将其发送到 HTTP 响应中的客户端之前替换我的 index.html 中的变量?
我尝试使用 IIS URL 重写出站规则来做到这一点。但到目前为止我还没能做到。我没有找到在 index.html 中进行替换的方法,也没有找到为每个传入请求自动生成随机数的方法。
这并不是真正的答案(并且不完整且未经测试,并且不确定随机数是否是正确的方法),但您可以尝试在program.cs中添加类似的内容:
app.Use((context, next) =>
{
var requestPath = context.Request.Path.Value;
if (string.Equals(requestPath, "/",
StringComparison.OrdinalIgnoreCase)
|| string.Equals(requestPath, "/index.html",
StringComparison.OrdinalIgnoreCase))
{
using (var rng = RandomNumberGenerator.Create()) {
var nonceBytes = new byte[32];
rng.GetBytes(nonceBytes);
nonce = Convert.ToBase64String(nonceBytes);
context.Response.Cookies.Append("CSP-NONCE",nonce,
new CookieOptions { HttpOnly = false });
}
return next(context);
}
});
然后在 Angular 中你需要读取该 cookie。 文档说使用:
bootstrapApplication(AppComponent, {
providers: [{
provide: CSP_NONCE,
useValue: globalThis.myRandomNonceValue
}]
});
但是没有提到如何设置globalThis.myRandomNonceValue。 (但你可以读取 cookie 来设置它......)问题是,由于这是一种 XSS 保护,潜在的攻击者是否也能够读取该随机数? 由于这里涉及的所有复杂性,我认为最好将样式的 CSP 设置为“不安全内联”并跳过随机数部分。