1

我有一个 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="<div style="background-image:..." 标记,IIS 正确地将其解释为潜在的脚本注入漏洞。据我所知,FF 通过ctl00_uxBtn="ctl00$uxBtn" 这是完全可以接受的。有没有办法强制 IE 进入更多类似 FF 的行为?我不想禁用请求验证。

4

2 回答 2

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>

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

于 2010-07-17T19:50:22.293 回答
1

IE 坚持将 <button> 和 </button> 之间的内容作为按钮的值发送,似乎没有办法阻止它。因此,我们使用 onsubmit 事件处理程序在客户端拦截请求,如下所示:

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

然后我们的 javascript 函数检查浏览器是否为 IE,以及按钮的 innerHTML 属性是否以“<”开头。如果是这样,它是标记,将导致 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();
}
于 2010-07-19T21:10:15.587 回答