我正在尝试使用 Microsoft 的客户端验证以及内容安全策略
在我的 ASP Net Core (v3.1) razor 视图中,我有以下内容:
<div asp-validation-summary="All" class="text-danger"></div>
首次呈现页面时,我得到一个没有文本的列表项,只有红点。
HTML 已被客户端验证 javascript (jquery-validation) 更改:
<div class="text-danger validation-summary-valid" data-valmsg-summary="true">
<ul>
<li style="display:none"></li>
</ul>
</div>
我的内容安全策略(CSP)阻止内联样式,因此内联样式显示:无不起作用,因此出现红点。
我发现了不安全哈希并将我的 CSP 更改为:
style-src 'self' 'unsafe-hashes' 'sha256-aqNNdDLnnrDOnTNdkJpYlAxKVJtLt9CtFLklmInuUAE=';
不幸的是,虽然这在 Chrome、Firefox 和 Edge 中有效,但在我的 iPhone (iOS 14.5) 或 Mac Mini (v11.2.3) 上的 Safari 中却不起作用
任何人都可以建议修复 Safari,或者如何更改 Microsoft 客户端验证以不使用内联样式吗?
任何人都可以建议修复 Safari
Safari 不支持“不安全哈希”,也不支持
style-src
,也不支持script-src
。目前只有一种使用“不安全哈希”的方法:
style-src '不安全内联'; style-src-attr '不安全哈希' 'sha256-aqNNdDLnnrDOnTNdkJpYlAxKVJtLt9CtFLklmInuUAE=';
Chrome 将遵循 style-src-attr 指令,其他浏览器(Safari/Firefox/Edge)不支持它,并将使用“style-src”中的“unsafe-inline”。
如何更改 Microsoft 客户端验证以不使用内联样式?
style="display:none"
是由jQuery验证器通过.attr()
方法添加的,该方法在内部调用setAttribute("style", ...)
。 CSP 将 setAttribute(style)
调用视为内联样式,而 element.style.property = 'prop_value'
不被视为 内联样式。setAttribute("style")
调用更改为一组等效的 element.style.property
调用。
jQuery 有一个特殊的 plugin,可以通过将
.attr()
方法替换为安全的 el.style.property
调用来修复内联样式。这是一个已知问题。 aspnetcore/问题/43714
标记帮助程序 asp-validation-summary="All" 呈现此:
<div class="text-danger validation-summary-valid" data-valmsg-summary="true">
<ul>
<li style="display:none"> @*CSP problem*@
</li>
</ul>
</div>
解决方法:仅当有内容要显示时才使用标签助手。
@if (ViewData.ModelState.ErrorCount > 0)
{
<div asp-validation-summary="All" class="text-danger"></div>
}
我需要更新一个已有 10 年历史的网站以提高安全性。我没有参与该网站的创建,它广泛使用了 mvc 验证,所以我需要一个轻量级的解决方案......即使它有点 hacky。
为了安抚 CSP,我简单地从返回的 html 中删除了样式文本:
public static MvcHtmlString ValidationSummaryCSP( this HtmlHelper htmlHelper, bool excludePropertyErrors = false)
{
var helper = htmlHelper.ValidationSummary(excludePropertyErrors);
var retVal = new Regex("style=\"[^\"]*\"").Replace(helper.ToHtmlString(), "");
return MvcHtmlString.Create(retVal);
}