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 に答える