以前の記事でPHPの全体一致を示す正規表現として”^(キャレット)”と”$(ダラー)”を使っていましたが、「徳丸本 第2版」を読んでいると使わない方が良い書かれていることに気がつきました。全体一致の正規表現は”\A”と”\z”を使ってくださいとのことです。
目次
「徳丸浩の日記」からの引用
同様の主旨のことは徳丸先生のブログサイトでも書かれています。該当する記事から引用をさせていただきます。
正規表現によるバリデーション等で、完全一致を示す目的で ^ と $ を用いる方法が一般的ですが、正しくは \A と \z を用いる必要があります。Rubyの場合 ^ と $ を使って完全一致のバリデーションを行うと脆弱性が入りやすいワナとなります。PerlやPHPの場合は、Ruby程ではありませんが不具合が生じるので \A と \z を使うようにしましょう。
修正した箇所
具体的にはSiteGuard Liteのカスタムシグネチャで使っていた、2箇所の”^”と”$”を使った全体一致の正規表現を修正しました。
^(log|pwd)$ → \A(log|pwd)\z
修正前の検査文字列
修正後の検査文字列
(log|pwd)と言う文字列とメタ文字について、”^(log|pwd)$”から”\A(log|pwd)\z”に変更しました。
^POST$ → \APOST\z
修正前の検査文字列
修正後の検査文字列
POSTと言う文字列について、”^POST$”から”\APOST\z”に変更しました。
変更の確認
SiteGurad Liteにおける「モジュール設定」の「カスタムシグネチャ」はこんな感じになりますので、[OK]ボタンを押します。
最後に変更前と変更後の検査文字列を確認して、[OK]ボタンを押して全体一致に関する正規表現の変更作業を完了させます。なおPHPでは全体一致の正規表現はとして”\A”と”\z”を使いますが、JavaScriptでは”^”と”$”を使います。