文字列パターンの許容範囲が広すぎる(OpenAPI 3.0)

文字列パターンが意図した形式を十分に制限していない状態

説明

文字列の形式を制限するための pattern でも、許容範囲が広すぎると想定外の値が検証を通る可能性があります。例えば、.* では文字列の形式を制限できません。

想定される影響

サーバーも同じ緩い条件で入力を検証すると、形式の異なる値が保存されたり、後続の処理でエラーが発生したりする可能性があります。

対処方法

許可する文字や長さなど、実際の要件をパターンに反映してください。文字列全体を一致させる必要がある場合は ^ と $ を使い、サーバーでも同じ条件で検証してください。部分一致を意図している場合は、全体一致を強制する必要はありません。

例

次のOpenAPI 3.0の抜粋では、code の .* を、ASCIIの英小文字と数字からなる15文字だけを許可するパターンに変更しています。message も自由記述の文章ではなく、同じ形式のコードであると仮定しています。

変更前

json
{
  "openapi": "3.0.0",
  "components": {
    "schemas": {
      "GeneralError": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "maxLength": 15,
            "pattern": ".*"
          },
          "message": {
            "type": "string",
            "maxLength": 15,
            "pattern": "^[0-9a-z]{15}$"
          }
        }
      }
    }
  }
}

変更後

json
{
  "openapi": "3.0.0",
  "components": {
    "schemas": {
      "GeneralError": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "maxLength": 15,
            "pattern": "^[0-9a-z]{15}$"
          },
          "message": {
            "type": "string",
            "maxLength": 15,
            "pattern": "^[0-9a-z]{15}$"
          }
        }
      }
    }
  }
}

参考資料