【ITニュース解説】ASP .NET Core hide query string parameters
2025年09月29日に「Dev.to」が公開したITニュース「ASP .NET Core hide query string parameters」について初心者にもわかりやすく解説しています。
ITニュース概要
ASP.NET Coreで、URLからクエリパラメータを非表示にする方法を紹介する。ビジネス要件で特定の情報をURLに見せたくない場合に、セッション機能を利用してページ間でデータを安全に受け渡す手法を解説。セッションの設定方法から、異なるページや同一ページ内で値を保存・取得する具体的な実装例を示す。
ITニュース解説
ウェブアプリケーションを開発する際、URLに表示される「クエリ文字列パラメータ」を非表示にしたいという要件が出てくることがある。クエリ文字列パラメータとは、URLの末尾に「?」から始まる「キー=値」の形式で付加されるデータのことである。例えば、「example.com/page?id=123&name=test」のように、id=123やname=testがこれにあたる。これらを非表示にすることで、ユーザーがURLを直接編集して不正なデータにアクセスするのを防いだり、単にURLの見た目をすっきりとさせたりする目的がある。ASP.NET Coreアプリケーションでは、主にセッションを利用する方法や、単一ページ内でのフォーム送信によって、この課題を解決できる。
まず、アプリケーションが利用する設定データについて説明する。ASP.NET Coreでは、設定情報をappsettings.jsonファイルで管理することが一般的である。このファイルは、JSON形式で様々な設定値を保持し、アプリケーションの起動時に読み込まれる。記事の例では、Programsというセクションにヨガのプログラム名が辞書形式(キーと値のペア)で定義されている。この設定は、Program.csというファイル内でbuilder.Services.Configure<Dictionary<string, string>>(builder.Configuration.GetSection("Programs"));というコードによって、アプリケーション全体で利用可能なサービスとして登録される。これにより、開発者はデータベースを別途用意する手間を省き、手軽に設定データを扱えるようになる。
クエリ文字列パラメータを隠す主要な方法の一つに「セッション」の利用がある。セッションとは、ユーザーがウェブサイトを訪れてから離れるまでの一連の操作の間、サーバー側で特定のデータを一時的に保存しておく仕組みである。ASP.NET Coreでは、HttpContext.Sessionを通じてセッションにアクセスする。これはISessionインターフェースの実装であり、キーと値のペアでデータを保存・取得できる。しかし、セッションに保存するデータには注意が必要である。ユーザーがブラウザを閉じずにセッションが継続したり、セッションクッキーが複数のブラウザウィンドウで共有されたりする可能性があるため、セッションが単一ユーザーに限定されない場合があるからである。そのため、個人情報などの機密性の高いデータはセッションに保存すべきではない。
セッションを利用するには、Program.csファイルでいくつか設定が必要である。具体的には、builder.Services.AddSessionを呼び出してセッションサービスをアプリケーションに登録し、その中でセッションクッキーの振る舞いを設定する。例えば、HttpOnlyをtrueにしてJavaScriptからのアクセスを防いだり、IdleTimeoutでセッションの有効期限を設定したりする。さらに、app.UseSession()を呼び出して、HTTPリクエストパイプラインにセッションミドルウェアを追加する必要がある。これにより、各リクエストでセッションデータが利用可能になる。
具体的な例として、セッションを使って複数ページ間でデータをやり取りするケースを考える。これは、あるページでユーザーが選択したプログラム名と数値を、別のページに遷移する際にURLに表示せずに渡すシナリオである。
まず、呼び出し元のページ(Caller page)のフロントエンドには、ドロップダウンリストと数値入力フィールドを持つフォームが用意されている。このフォームがPOSTメソッドで送信されると、バックエンドのコード(PageModelクラスのOnPostButton1メソッド)が実行される。このメソッドでは、まずModelState.IsValidで入力値が適切かどうかを検証する。検証が成功すると、選択されたプログラムのキーと入力された数値が取得される。ここで、HttpContext.Session.SetString("Program", selectedValue!)とHttpContext.Session.SetInt32("Count", Count)というコードを使って、プログラム名と数値をセッションに保存する。これらのメソッドは、指定したキーでセッションに文字列や整数値を格納する役割を果たす。データがセッションに保存された後、return RedirectToPage("Index2");というコードによって、ターゲットページであるIndex2ページにリダイレクトされる。この際、URLにはプログラム名や数値といったパラメータは一切表示されない。
次に、ターゲットページ(Target page)では、呼び出し元ページから渡されたプログラム名と数値を表示する必要がある。ターゲットページのバックエンドコード(PageModelクラスのOnGetメソッド)では、HttpContext.Session.GetString("Program")とHttpContext.Session.GetInt32("Count")を呼び出すことで、セッションに保存された値をそれぞれ取得する。取得した値は、プロパティに格納され、最終的にフロントエンドのHTMLに表示される。このようにして、クエリ文字列を使わずに安全かつスマートにページ間でデータをやり取りすることが可能になる。
もう一つの方法は、ページ遷移を伴わずに、単一のページ内でフォームのデータを処理し、結果を同じページに表示する方法である。この場合もクエリ文字列パラメータは使用しない。この例では、ユーザーが数値(セッション数)を入力し、複数のボタンの中から目的のプログラムを選択する。フロントエンドでは、数値入力フィールドと、appsettings.jsonから読み込んだプログラムリストに基づいて動的に生成された複数の送信ボタンが配置されている。各ボタンにはname="action"とvalue="@program.Key"という属性が設定されているため、ユーザーがボタンをクリックすると、そのボタンのvalueと入力された数値がフォームデータとしてサーバーに送信される。
バックエンドのコード(PageModelクラスのOnPostメソッド)では、まずModelState.IsValidで数値入力の検証を行う。次に、Request.Form.TryGetValue("action", out var actionValue)というコードを使って、どのプログラムボタンがクリックされたか(actionという名前で送られてきた値)を取得する。このactionValueが、選択されたプログラムのキーとなる。取得したプログラムのキーと数値入力フィールドの値を使って、設定データからプログラムの表示名を取得し、ページ内で結果表示用のプロパティに格納する。
これらのプロパティに値がセットされた後、return Page();が実行され、現在のページが再描画される。フロントエンドのRazorコードでは、特定の条件に基づいて、処理結果のメッセージ(例えば「MainCountセッションのProgramがリクエストされました」)が表示される。この方法では、セッションを明示的に使わなくても、フォームの送信とページのリロードだけでユーザーの入力に対応でき、かつURLを汚さずに情報を処理できるというメリットがある。
これら二つの方法は、ASP.NET Coreアプリケーションでクエリ文字列パラメータを隠す一般的なテクニックである。セッションを利用する方法は、複数のページ間でデータを安全に引き渡す場合に特に有効である。一方、単一ページ内でのフォーム送信と結果表示は、ページ遷移を最小限に抑えたい場合に適している。これらの手法を適切に使い分けることで、ユーザーにとって安全で使いやすいウェブアプリケーションを構築できるだろう。