これはセキュアなソフトウェア開発に関するラボ演習です。 ラボの詳細については、概要をご覧ください。
正規表現を使って、特定の形のテキスト入力の検証を練習しましょう。
この演習では、Expressフレームワーク(バージョン4)とexpress-validatorライブラリを使用して、JavaScriptで書かれたサーバー側のプログラムに簡単な入力検証を追加します。
しかし、今回は正規表現を使って、特定のデータ値に対する入力検証を行います。 多くのプログラムには、特殊なデータの値があり、正規表現によって簡単にテストできるものがあります。
以下のコードは、/partsというパスに対するgetリクエストに対するハンドラをセットアップするものです。 このコードは、例えばhttp://localhost:3000/parts?id=AX-794-7に対するリクエストによって実行されます(localhostで実行し、3000番ポートで待ち受けている場合)。 もし検証でエラーがなければ、コードはパーツのIDを表示します。 検証でエラーがあった場合には、HTTPのエラーコード422(処理できないコンテンツ/"Unprocessable Content")をエラーメッセージとともに返します。 このステータスコードは、リクエストが何らかの理由で無効であることを意味します。
この場合では、適切な入力検証を実装する必要があるでしょう。 そこで、入力が一定の長さを超えていないこと、ある特定のパターンにマッチしていることを確認する必要があります。 input1のラボで書いたように、このプログラムは、クロスサイト・スクリプティング(XSS)と呼ばれる、まだ説明してない脆弱性があります。 この脆弱性については、より良い入力検証を行うことで完全に防ぐことができるでしょう。
このアプリケーションでは、パーツIDのフォーマットは常に、2文字の大文字アルファベット(AからZまで)、ハイフン(-)、1桁以上の数字、ハイフン(-)、1桁以上の数字、となっています。
タスクを完了するには、以下を実行します。
また、入力が正規表現を使ったパターンにマッチしていることも検証する必要があります。 この場合は、以下のように行います。
必要に応じて、「ヒント」ボタンと「諦める」ボタンを使用してください。
下記のコードを、クエリパラメータidが80文字以下であり、パーツIDのフォーマット要件に合致している場合にのみ受け入れられるように変更してください。 フォーマットは、2文字の大文字アルファベット(AからZまで)、ハイフン(-)、1桁以上の数字、ハイフン(-)、1桁以上の数字、です。