将nonce属性添加到自动生成的WebForms脚本

时间:2017-06-09 15:38:50

标签: asp.net webforms content-security-policy

在我的网站上实现CSP标题时,我遇到了webforms添加到页面的自动生成的回发JavaScript的问题:

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

为了支持其他一些内联脚本标记,我已经成功添加了nonce属性,但是我找不到修改这段生成代码来做同样事情的方法。我已经探讨了ClientScript.GetPostBackEventReference,但这似乎控制了JavaScript,而不是<script>标记本身的呈现。

解决方案不一定需要添加nonce属性,任何符合的属性都可以。例如,如果有一个ASP.NET设置可以配置为将此脚本作为文件(我可以列入白名单)加载,那就没问题了。

2 个答案:

答案 0 :(得分:0)

使用Webforms Scheme在ASP.NET上实现一个好的CSP好运 - WebForms控件将添加一大堆内联脚本,就像在这个登录按钮上一样:

<a id="btnLogin" class="btn btn-info pull-right" href="javascript:__doPostBack(&#39;btnLogin&#39;,&#39;&#39;)">Login</a>

如果您没有使用多个<asp:...控件,那么您可能没问题。

要允许您运行上述脚本,可以在script-src后将其添加到CSP中:

sha256-uVkxb0ccirYwSBxwdr2/4qtJEH1eBw7MslAgyLdAVVY="

它让您的浏览器知道它应该执行任何具有该sha256哈希的脚本。

如果您使用不同的换行符(我认为是Windows风格),我给您的哈希可能无效。

如果您没有将默认表单ID更改为&#34; form1&#34;以外的其他页面,您也应该小心。

答案 1 :(得分:0)

我们遇到了类似的问题,我们的解决方案是为那些 ASP.NET 脚本预先计算 SHA-256 哈希值并将这些哈希值添加到 CSP 标头

/*
         //<![CDATA[
         var theForm = document.forms['aspnetForm'];
         if (!theForm) {
         theForm = document.aspnetForm;
         }
         function __doPostBack(eventTarget, eventArgument) {
         if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
         theForm.__EVENTTARGET.value = eventTarget;
         theForm.__EVENTARGUMENT.value = eventArgument;
         theForm.submit();
         }
         }
         //]]>
         */
        "sha256-ATReICQsd+smV/PvrA4eH+DuxsenS4SxbGcSjySJlBA=",
         /*
         * //<![CDATA[
         * if (typeof(Sys) === 'undefined') throw new Error('ASP.NET Ajax client-side framework failed to load.');
         * //]]>
         */
        "sha256-2vr5KMButMK7a+bOf/ned/cPnF2yNooMulXA8E65wGw=",

将这些哈希添加到 CSP 标头

    string rule = $"script-src sha256-ATReICQsd+smV/PvrA4eH+DuxsenS4SxbGcSjySJlBA= sha256-2vr5KMButMK7a+bOf/ned/cPnF2yNooMulXA8E65wGw=";

        Response.AddHeader("Content-Security-Policy", rule);