自定义 Web 表单脚本生成

Not*_*tre 6 webforms content-security-policy

好吧,是的,现在是 2020 年了,但别笑。我正在尝试更新一些 ASP.NET Web 表单。我的目标是锁定它们,通过应用更严格的内容安全策略 (CSP) 使它们更加安全。为此,我使用随机数,而不是允许unsafe-inline编写脚本。

对于“简单”的网络表单,它工作得很好。然而,只要有 ASP 控件导致回发,我就会遇到问题。当我查看页面源代码时,我看到如下内容:

<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();
    }
}
Run Code Online (Sandbox Code Playgroud)

<script type="text/javascript">
    function previewFile() {
        var preview = document.querySelector('#Body_Main_LogoImage');
        var file = document.querySelector('#Body_Main_logoUpload').files[0];
        var reader = new FileReader();

        reader.onloadend = function () {
            preview.src = reader.result;
        }

        if (file) {
            reader.readAsDataURL(file);
        } else {
            preview.src = "";
        }
    }
</script>
Run Code Online (Sandbox Code Playgroud)

我相信这个代码是由一些 MS Web 表单代码生成的。问题是这些脚本元素都没有我想提供的随机数,因此它违反了我的 CSP(不包括unsafe-inline)。我可以重写什么来自定义此行为吗?

Not*_*tre 5

一些有问题的代码是在类RenderPostBackScript内部的私有方法(例如)中定义的Page,而该方法又由内部方法调用。因此,除非我替换大量代码,否则以正常方式覆盖它不是一个选择。作为替代方案,我CreateHtmlTextWriter在我的页面中重写了:

protected override System.Web.UI.HtmlTextWriter CreateHtmlTextWriter(TextWriter tw)
{
    return new HtmlTextWriter(tw, this);
}
Run Code Online (Sandbox Code Playgroud)

然后在我的HtmlWriter课堂上,我这样做:

public override void Write(string s)
{
    if (s != null && s.IndexOf("<script") > -1 && s.IndexOf("nonce") == -1 && s.IndexOf("src") == -1)
    {
        s = s.Replace("<script", "<script nonce=\"" + this._page.GetNonce() + "\"");
    }
    base.Write(s);
}
Run Code Online (Sandbox Code Playgroud)

我在HtmlTextWriterfor中使用了类似的方法AddAttribute来避免 inline javascript:inside href,这将需要unsafe-inlinefor script-src(并排除使用随机数)。

public override void AddAttribute(HtmlTextWriterAttribute key, string value)
{
    if (key == HtmlTextWriterAttribute.Href && value != null && value.IndexOf("javascript:") > -1)
    {
        base.AddAttribute(key, "#");
        var newScript = value.Replace("javascript:", "");
        newScript += "; return false;";
        base.AddAttribute(HtmlTextWriterAttribute.Onclick, newScript);
    }
    else
    {
        base.AddAttribute(key, value);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您如何/在何处将随机数添加回 Web 表单页面中的请求标头?您是否也遇到过需要不安全评估的“WebResource.axd”文件问题? (4认同)