ラボ演習 input1

これはセキュアなソフトウェア開発に関するラボ演習です。 ラボの詳細については、概要をご覧ください。

ゴール

単純なデータ型の入力の検証を練習します。

背景

この演習では、Expressフレームワーク(バージョン4)とexpress-validatorライブラリを使用して、JavaScriptで書かれたサーバー側のプログラムに簡単な入力検証を追加します。 ポイントは、これらの特定の技術について学ぶことではなく、一般的に安全なソフトウェアを書く方法を学ぶことです。

Expressでは、システムが特定のリクエストを受け取ったときに、関数のリスト"handlers(ハンドラ)"を実行するように指定できます。 express-validatorライブラリは、バリデーションチェックを簡単に追加できるようにするための関数のセットを提供しています。

以下のコードでは、/invoices パスの get リクエストに対してハンドラを設定しています。バリデーションエラーがない場合は、コードは請求書IDを表示します。 バリデーションエラーがある場合は、HTTPエラーコード422"Unprocessable Content(処理できないコンテンツ)"で応答します。 これは、何らかの理由でリクエストが無効であったことを示すステータスコードであり、エラーメッセージも表示されます。

残念ながら、このプログラムは適切な入力検証を行っていません。 このアプリケーションでは、idは1から9999までの整数でなければなりませんが、そのチェックを実行していません。 そのため、このプログラムにはクロスサイト スクリプティング(XSS)と呼ばれる、まだ説明していない脆弱性があります。 このXSS脆弱性により、攻撃者はidの中に悪意のあるスクリプトを挿入することができてしまうので、ビューアーがそれを自動的に実行する可能性があります! この脆弱性は、入力検証をすることで完全に防ぐことができます。

タスク

タスクを完了するには、以下を実行します。

  1. app.getの最初のパラメータ'/invoices'の後に、コンマで区切られた新しいパラメータを追加します。
  2. この新しいパラメータをquery('id')で開始して、検証用のidパラメータを選択します (開始しやすいようにこの部分は入力してあります)。
  3. query('id')の後(終了のカンマの前) に、ピリオド(.)と検証要件 isInt()を追加します (isInt()は、名前付きパラメータが整数であることを検証します)。
  4. isIntメソッドは、括弧内のオプションパラメーターとして、最小値と最大値を提供するオブジェクトを受け取ります (例: isInt({min: YOUR_MINIMUM, max: YOUR_MAXIMUM})) 。許容範囲を指定するには、minとmaxを設定します。

注意: JavaScript の名前は大文字と小文字が区別されるため、isintでは機能しません。 このパラメータの末尾をコンマで示すことを忘れないでください (開始時に入力されているテキストではこれを行っています)。

必要に応じてヒントボタンを使用してください。

Interactive Lab ()

以下のコードは、クエリパラメータidを入力として受け入れます。idが1から9999までの整数 (1と9999も含む) である場合にのみ、受け入れられるように変更してください。

// Set up Express framework and express-validator library
const express = require("express");
const app = express();
const { query, matchedData, validationResult } =
    require('express-validator');

// Implement requests, e.g., http://localhost:3000/invoices?id=1
app.get('/invoices',

  (req, res) => { // Execute this code if /invoices seen
    const result = validationResult(req); // Retrieve errors
    if (result.isEmpty()) { // No errors
      const data = matchedData(req); // Retrieve matching data
      return res.send(`You requested invoice id ${data.id}!`);
    }
    res.status(422).send(`Invalid input`);
  })


このラボは、Linux FoundationのDavid A. Wheelerによって開発されました。