潜在危险的Request.Form值仅来自IE8

时间:2010-07-17 19:46:33

标签: asp.net internet-explorer iis .net-4.0 request-validation

我有一个Facebook风格的现代按钮控件,其客户端标记如下:

<button id="ctl00_uxBtn" value="ctl00$uxBtn" name="ctl00$uxBtn type="submit">
  <div style="background-image: url("Icons/page_edit.png"); background-position: left center; background-repeat: no-repeat; line-height: 16px; padding: 3px 0pt 3px 22px;">Save Draft</div>
</button>

使用Visual Studio 2010 Web服务器,此按钮适用于IE和FF,但当我将应用程序部署到服务器(Windows Server 2008 / IIS 7.0)时,我收到“检测到潜在危险的Request.Form值”错误,但仅限于IE。 IE似乎正在传递Request.Form集合中的ctl00_uxBtn =“&lt; div style =”background-image:...“标记,IIS正确地将其解释为潜在的脚本注入漏洞。我可以告诉你,FF传递ctl00_uxBtn =“ctl00 $ uxBtn”这是完全可以接受的。有没有办法强制IE进入更像FF的行为?我不想禁用请求验证。

2 个答案:

答案 0 :(得分:3)

您需要使用正确的引号:

<button id="ctl00_uxBtn" value="ctl00$uxBtn" name="ctl00$uxBtn" type="submit">
  <div style="background-image: url('Icons/page_edit.png'); background-position: left center; background-repeat: no-repeat; line-height: 16px; padding: 3px 0pt 3px 22px;">Save Draft</div>
</button>

我建议你不要混合使用CSS和标记,并将此规则外部化为单独的CSS:

.edit {
    background-image: url('Icons/page_edit.png'); 
    background-position: left center; 
    background-repeat: no-repeat; 
    line-height: 16px; 
    padding: 3px 0pt 3px 22px;
}

然后将其应用于div:

<button id="ctl00_uxBtn" value="ctl00$uxBtn" name="ctl00$uxBtn" type="submit">
  <div class="edit">Save Draft</div>
</button>

这将使您的标记更清晰,保留带宽并避免您使用正确引号所做的错误。

答案 1 :(得分:1)

IE坚持在&lt; button&gt;之间发送内容和&lt; / button&gt;作为按钮的值,似乎没有办法防止它。因此,我们使用onsubmit事件处理程序拦截客户端上的请求:

<form id="form1" runat="server" onsubmit="fixModernButton()">

我们的javascript函数然后检查浏览器是否是IE以及按钮的innerHTML属性是否以“&lt;”开头。如果是这样,它是标记并将导致ASP.Net引发“可能危险的Request.Form值”错误,因此我们将innerHTML属性的值设置为innerText属性的值,然后提交表单。 javascript函数的来源是:

function fixModernButton() {
    if (navigator.appName === 'Microsoft Internet Explorer') {
        if (document.activeElement.innerHTML && document.activeElement.innerHTML.charAt(0) === '<') {
            document.activeElement.innerHTML = document.activeElement.innerText;
        }
    }
    document.forms['form1'].submit();
}