これはセキュアなソフトウェア開発に関するラボ演習です。 ラボの詳細については、概要をご覧ください。
入力検証のためのシンプルな正規表現の書き方を学びます。
正規表現(regular expressions: regexes)はテキストのパターンを表現するために広く利用されている表記方法です。 正規表現は入力の検証に使うことができます。正しく使用することで、多くの攻撃への対策となります。
正規表現の表記方法は言語により若干異なりますが、大枠では共通しています。以下が正規表現を表記するための基本的なルールです。
正規表現を使って入力の検証を行いたいとします。 それはつまり、入力は正規表現のパターンに完全に一致するということです。 正規表現では、シンボルを前置したり後置したりして、(マルチラインモードではなく)デフォルトモードでそれを行うことができます。 残念ながら、異なるプラットフォームでは入力に完全一致させるために異なる正規表現のシンボルを使用します。 以下の表は様々なプラットフォーム(で使用されるデフォルトの正規表現システム)において、どんな前置や後置が必要かを簡単に示したものです。
プラットフォーム | 前置 | 後置 |
---|---|---|
POSIX BRE, POSIX ERE, and ECMAScript (JavaScript) | “^” | “$” |
Java, .NET, PHP, Perl, and PCRE | “^” or “\A” | “\z” |
Golang, Rust crate regex, and RE2 | “^” or “\A” | “$” or “\z” |
Python | “^” or “\A” | “\Z” (not “\z”) |
Ruby | “\A” | “\z” |
例えば ECMAScript (JavaScript) で入力を "ab" または "de" としたい場合に使用する正規表現は "^(ab|de)$" になります。 同じことを Python で行う場合は "^(ab|de)\Z" または "\A(ab|de)\Z" となります。(正規表現のパターンが少し違うことに注意してください)
より詳しい情報は OpenSSF ガイド Correctly Using Regular Expressions for Secure Input Validation にあります。
必要に応じて「ヒント」や「諦める」のボタンを押してください。
ECMAScript (JavaScript) で使うことを想定して、文字 "Y" または "N" のみにマッチする正規表現を作成してください。
ECMAScript (JavaScript) で使うことを想定して、1文字以上の大文字のアルファベット(A から Z)にのみにマッチする正規表現を作成してください。
ECMAScript (JavaScript) で使うことを想定して、単語 "true" または "false" のみにマッチする正規表現を作成してください。
1文字以上の大文字のアルファベット(A から Z)にのみにマッチする正規表現を作成してください。 ただし今回は、(JavaScript ではなく)Python で使うことを想定してください。
1文字の大文字のアルファベット(A から Z)に続けてダッシュ ("-")、さらに続けて1文字以上の数字にのみにマッチする正規表現を作成してください。 今回は、(JavaScript ではなく)Ruby で使うことを想定してください。
このラボは、Linux FoundationのDavid A. Wheelerによって開発されました。