13

SOを検索して同様の質問を見つけましたが、3つすべてを比較したものはありませんでした。それは私を驚かせたので、誰かがそれを知っているなら、それを私に指摘してください。

リクエストのクエリ文字列を解析するには、さまざまな方法があります。「正しい」方法(IMO)は、null /欠落値を処理するだけでなく、必要に応じてパラメータ値をデコードする必要があります。次のうちどれが両方を行うための最良の方法でしょうか?


方法1

string suffix = Request.QueryString.Get("suffix") ?? "DefaultSuffix";


方法2

string suffix = Request.QueryString["suffix"] ?? "DefaultSuffix";


方法3

NameValueCollection params = HttpUtility.ParseQueryString(Request.RawUrl);    
string suffix = params.Get("suffix") ?? "DefaultSuffix";


方法4

NameValueCollection params = HttpUtility.ParseQueryString(Request.RawUrl);    
string suffix = params["suffix"] ?? "DefaultSuffix";


質問:

  1. Request.QueryString["suffix"]サフィックスが指定されていない場合、nullを返しますか?(恥ずかしいほど基本的な質問です、私は知っています)

  2. 直接HttpUtility.ParseQueryString()アクセスするよりも追加の機能を提供しますか?Request.QueryString

  3. MSDNのドキュメントには、この警告が記載されています。しかし、それを処理するためにその手段を使用する必要があるのか​​、それともセキュリティ上の欠陥にさらされている

    The ParseQueryString method uses query strings that might contain user input, which is a potential security threat. By default, ASP.NET Web pages validate that user input does not include script or HTML elements. For more information, see Script Exploits Overview.

    のかはわかりません...どちらですか?ParseQueryString()

  4. ParseQueryString()デフォルトでUTF8エンコーディングを使用しています...すべてのブラウザはデフォルトでUTF8でクエリ文字列をエンコードしますか?

  5. ParseQueryString()複数の値が指定されている場合は、値をコンマ区切りします...それもRequest.QueryString()行いますか、そうでない場合はどうなりますか?

  6. これらのメソッドのどれが「%2b」を「+」に正しくデコードしますか?


私のWindows開発のルーツを再び示しています...そして私がこれらのことについてそれほど不思議に思っていなければ、私ははるかに速い開発者になるでしょう...:P

4

2 に答える 2

2

例 1:

string itsMeString = string.IsNullOrEmpty(Request.QueryString["itsMe"]) ? string.Empty :  HttpUtillity.UrlDecode(Request.QueryString["itsMe"]);

あなたの質問にストレート:

  1. キーが存在しない場合(QueryStringにない場合)に何が起こるかを尋ねている場合、サフィックスの意味がよくわかりません-はい、nullを返します。
  2. ここでの私の推測は、構築時に Request.QueryString が内部的に HttpUtillity.ParseQueryString() メソッドを呼び出し、その後のアクセスのために NameValueCollection をキャッシュすることです。最初のものは残っているだけなので、リクエストに存在しない文字列に対して使用できると思います。たとえば、Web ページを破棄していて、そのコードで見つけた文字列からいくつかの引数を取得する必要がある場合などです。ページ。この方法では、Uri オブジェクトを構築する必要はありませんが、これだけが必要であることが確実な場合は、クエリ文字列だけを NameValueCollection として取得できます。これは勝手な推測です ;))
  3. これはページ レベルで実装されるため、たとえば Page_Load イベント ハンドラーで QueryString にアクセスしている場合、有効で安全な文字列が得られます (それ以外の場合、ASP.NET は例外をスローし、コード フローが Page_Load に入ることを許可しないため、データベースに XSS を保存することから保護されている場合、例外は次のようになります: "潜在的に危険な Request.QueryString 値がクライアントから検出されました。ポスト変数に XSS の痕跡が含まれている場合と同じですが、代わりに Request.Form 例外は Request.QueryString と表示されます.")。これは、「validateRequest 」を許可した場合です" スイッチをオンにします (デフォルトではオンになっています)。ASP.NET パイプラインは以前に例外をスローするため、XSS をストア (データベース) に保存する機会がありません。スイッチをオフにすると、何を知っているかを意味します'その場合は、自分でセキュリティを実装する必要があります (何が入ってくるかを確認することによって)。
  4. おそらく、イエスと言って間違いないでしょう。とにかく、ほとんどの場合、自分で QueryString を生成するため (JavaScript またはサーバー側コードを介して - バックエンド コードには HttpUtillity.UrlEncode を使用し、JavaScript にはエスケープを使用してください)。このようにして、ブラウザは強制的に「It's me!」になります。「It%27s%20me%21」に。JavaScript での URL エンコーディングの詳細については、次の記事を参照してください: http://www.javascripter.net/faq/escape.htm .
  5. 詳しく説明してください。「複数の値が指定されている場合、値をカンマで区切る」という意味がよくわかりませんでした。
  6. 私が覚えている限り、それらのどれもそうしません。上記の例の「It's me!」では、おそらく HttpUtillity.UrlDecode / HttpUtillity.HtmlDecode を呼び出して (入力内容に基づいて) 文字列を正しく取得する必要があります。あなたは次のようなことをします(番号付きリストの後に置くと、コードのフォーマットに問題があるため、例1を参照してください)。
于 2012-01-23T07:53:58.383 に答える