CakePHP2,3系では、alphaNumericが、日本語を通してしまう問題がありました。
CakePHP4では、asciiAlphaNumericが用意されたため、半角英数字のみを受け入れるバリデーションが出来ます。
##ここまでの過程
【参考】
- CakePHP2のalphaNumeric
- CakePHP3のalphaNumeric
- CakePHP4現行のalphaNumeric
英数字のみを受け入れるフォームを作りたいときに、CakePHPのalphaNumericバリデーションを使って実装すれば簡単だと思っていました。
しかし・・
日本語がバリデーションをスルスル通過する(泣)
調査していくと、CakePHP2,3系も同様の問題を抱えていて、例えば、2,3系では、カスタムバリデーションを自分で書いて日本語などの全角文字を防いでいたりと、他のアプローチで対応する必要がありました。
alphaNumericは、CakePHP2,3では以下のようになっています。
public static function alphaNumeric($check)
{
if (empty($check) && $check !== '0') {
return false;
}
return self::_check($check, '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du');
}
以下が4系のalphaNumericです。
4系でもalphaNumericバリデーションは、日本語を通す挙動になっていました。
public static function alphaNumeric($check): bool
{
if ((empty($check) && $check !== '0') || !is_scalar($check)) {
return false;
}
return self::_check($check, '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du');
}
4系のalphaNumericには、!is_scalar($check)が追加されています。
!is_scalar($check)は、値がスカラー値かどうかをチェックするメソッドです。スカラーに関しては、下記の記事が分かりやすいです。
スカラー値の判定をすることで、配列などもチェックされるようになりました。
##alphaNumericとasciiAlphaNumericの違いは?
こちらがasciiAlphaNumericバリデーションです。
public static function asciiAlphaNumeric($check): bool
{
if ((empty($check) && $check !== '0') || !is_scalar($check)) {
return false;
}
return self::_check($check, '/^[[:alnum:]]+$/');
}
なぜalphaNumericは、日本語が通過してしまうのだろうと思い調査してみました。
alphaNumericは内部で、/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du
という正規表現を通しています。
この正規表現は、日本語を通過してしまいます。
それに対して、asciiAlphaNumericは内部で /^[[:alnum:]]+$/
という正規表現を通しています。
これにより、日本語が通過しなくなりました。
最後まで読んでくださり、ありがとうございました。