在我的网站上实现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设置可以配置为将此脚本作为文件(我可以列入白名单)加载,那就没问题了。
答案 0 :(得分:0)
使用Webforms Scheme在ASP.NET上实现一个好的CSP好运 - WebForms控件将添加一大堆内联脚本,就像在这个登录按钮上一样:
<a id="btnLogin" class="btn btn-info pull-right" href="javascript:__doPostBack('btnLogin','')">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);