将 Microsoft 客户端验证与内容安全策略结合使用

问题描述 投票:0回答:3

我正在尝试使用 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 客户端验证以不使用内联样式吗?

asp.net-core safari content-security-policy
3个回答
1
投票

任何人都可以建议修复 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
调用来修复内联样式。
或者,您可以使用粗略的 hack 以相同的方式修复任何 JS 库。


1
投票

这是一个已知问题。 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>
}  

0
投票

我需要更新一个已有 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);
     }
© www.soinside.com 2019 - 2024. All rights reserved.