asp.net リクエストの検証に問題があります。検索フィールドとボタンを備えた基本的なページがあります。ユーザーが検索フィールドに不正な文字を入力してボタンをクリックした場合、もちろん JS で入力を検証でき、すべて問題ありません。ただし、ポストバックを行う検索機能に関連付けられていない多くの LinkButtons もあり、それが発生すると YSOD が発生します。ページ ディレクティブまたは web.config に ValidateRequest="false" を追加することでこの機能をオフにできることはわかっていますが、単にリクエストの検証を完全に無効にするよりも優れた、より洗練されたソリューションがあるかどうかを知りたいです。ありがとう。
3 に答える
クロススクリプティング攻撃を回避するためにアンチ XSS ライブラリを使用できます。このリンクAntiXSS asp.netを確認してください。
死のイエロースクリーンを消すことができます。CustomError モードを Remoteonly に変更します。リモート ユーザーに YSOD が表示されないようにします。ローカル サーバーのみが YSOD を認識します。
web.config に次のような行を追加します。
<configuration>
<system.web>
<customErrors defaultRedirect="yourErrorPage.html"
mode="RemoteOnly">
</customErrors>
</system.web>
</configuration>
奇妙なことに、これに答えようとした翌日、同僚が同じ問題を手伝ってくれるように頼んだので、これが私がこれまでに行ったことです...
(私は何年もの間 .Net で開発を行ってきましたが、ページのライフ サイクル、ViewState、またはより優れた開発者を維持するための恐ろしく複雑な部分を深く掘り下げる必要はありませんでした。夜)
最初は、JavaScript で PostBack イベントをオーバーライドすると、フォームの投稿を編集して問題のある文字を削除できると思ったので、簡単なアラートで試してみましたが、危険な可能性のある Request.Formがまだ表示されていたので、原因が何であれ、 PostBack イベントが発生する前に発生します。
そのため、ページのライフサイクルを調査し、可能なすべてのメソッドをオーバーライドし、多くのデバッグを行った後、DeterminePostBackMode メソッドでエラーがスローされていることがわかりました。
さて、私の理解では、このメソッドはフォーム投稿を見てそれを NameValueCollection に変換するので、「<」文字を取り除いて独自の NameValueCollection を作成しました (最初はその文字でのみテストしました)。
Protected Overrides Function DeterminePostBackMode() As System.Collections.Specialized.NameValueCollection
Dim stream As New System.IO.StreamReader(Request.InputStream)
Dim nvCollection As New System.Collections.Specialized.NameValueCollection()
Dim _split() As String = stream.ReadToEnd().Split("&")
If _split.Length > 1 Then
For i As Integer = 0 To _split.Length - 1
Dim kv() As String = _split(i).Split("=")
Dim _key As String = HttpUtility.UrlDecode(kv(0))
Dim _value As String = HttpUtility.UrlDecode(kv(1))
If _value.Contains("<") Then _value = ""
nvCollection.Add(_key, _value)
Next
End If
'For Each s As String In nvCollection
' Response.Write(String.Format("<p>{0}={1}</p>", s, nvCollection(s)))
'Next
Return nvCollection
End Function
そして、それは見事に機能し、問題のある値が取り除かれ、エラーを引き起こすことなく NameValueCollection が返されました...
私がまだエラーメッセージを見ていたことを除いて。
現時点では、PreInit ページ イベントまで追跡しており、それを回避する方法を見つけようとしています。進行状況に応じてこれを更新します。
アップデート:
ViewState に格納されている値に問題がないことは確かです。ViewState に関するこの優れた記事を読んだ後、TextBox の値を"<script"
宣言的に設定してみました。これは、ViewState に格納されるべきではないことを意味します。これは、ViewState で実行される処理によってエラーが発生しないことを意味します。
おもう。
フォーム要素に対して検証グループを配置する必要があるように思えます (質問を誤解している可能性があります)。
(いくつかのコードを投稿していれば、これはより簡単になります)
<asp:Panel runat="server" DefaultButton="btnSearch">
<asp:TextBox runat="server" ID="txtSearch" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtSearch" ValidationGroup="vgSearch" ErrorMessage="Search is required!" />
<asp:Button runat="server" ID="btnSearch" ValidationGroup="vgSearch" Text="Search" />
</asp:Panel>
<asp:LinkButton runat="server" ID="btnLogin" Text="Login" ValidationGroup="vgLogin" />
<asp:LinkButton runat="server" ID="btnCakes" Text="Cakes!" ValidationGroup="vgCakes" />
とにかく、アイデアは、検索フォームと関連するバリデーターに 1 つの検証グループがあり、他のボタンに他の検証グループがある場合、別のボタンをクリックしてもバリデーターが起動しないということです。
個々のリンク ボタンに対して検証グループが必要かどうかは実際にはわかりませんが、そうではないと思いますが、私の主張を示すためにそれらをそこに入れています。
ボートに完全に乗り遅れた場合は、お知らせください:)
編集:
上記のコードを一緒に投げただけで、すべてが正しくフォーマットされていることを保証することはできません。