【PHP】 cakePHP 검증의 alphaNumeric이 효과가 없다는 것

  CakePHP의 검증 alphaNumeric 믿을 수 있습니까?



본래 Cake Book을 참고해, 문제 없을 것인데, 결국 영숫자 체크가 효과가 없어, 원인 조사에 시간이 걸려 버렸다.

Cake Book 데이터 검증

밸리데이션의 alphaNumeric에서 일본어 체크



cakePHP3에서 유효성 검사의 alphaNumeric 검사가 효과가 없기 때문에 조사 :

cakePHP

# Cake Bookデータバリデーションのサンプール

/*
* テストデータ1:「78424あ4264910」 テストデータ2:「78424あ426491」
* 現象:
*  テストデータ1:{"length"=[6~12文字です。]}
*  テストデータ2:通ってしまう  
*/ 
$validator = new Validator();
$validator
 ->allowEmpty('user_id')
 ->add('user_id', [
  'alphaNumeric' => ['rule' => 'alphaNumeric', 'message' => '英数字のみです'],
  'length' => ['rule' => ['lengthBetween', 6,12],  'message' => '6~12文字です。']
  ]);


CakePHP 데이터 밸리데이션의 내용을 보자!



cakePHP

# Validationの中身を見てみよう~

/**
 * Checks that a string contains only integer or letters
 *
 * Returns true if string contains only integer or letters
 *
 * $check can be passed as an array:
 * ['check' => 'valueToCheck'];
 *
 * @param string|array $check Value to check
 * @return bool Success
 */
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');
}

/**
 * Runs a regular expression match.
 *
 * @param string $check Value to check against the $regex expression
 * @param string $regex Regular expression
 * @return bool Success of match
 */
protected static function _check($check, $regex)
{
    return is_string($regex) && is_scalar($check) && preg_match($regex, $check);
}


원인은?



자, 이 "/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du"라는 뜻입니까?
정규 표현인 것 같고, 조사하면, 표준 Unicode 속성이라고 합니다.



즉, 일본어라면, 이러한 정규 표현이 효과가 없어, 지나 버립니다.
정규식 체커에서도 같은 현상이 됩니다.

정규식 검사기

정규식:/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du
문자열:78424A 4264910

cakePHP의 검증을 사용하고 싶다면



구글에서 기존 vendor중의 alphaNumeric()을 읽어들이기 전에 새로운 메소드 alphaNumeric()을 만들고 나서 rule에 세트 해 밸리데이션 처리를 실시하는 방법이 있습니다만, 또 다른 방법은, rule를 익명 함수로 신규 작성해 그 자리에서 밸리데이션 처리를 하는 방법이 있습니다. 아무래도 cakePHP의 유효성 검사를 사용하고 싶다면 익명 함수로 자체 규칙을 만듭니다.

cakePHP

# データバリデーションの改修例

/*
* テストデータ1:「78424あ4264910」 テストデータ2:「78424あ426491」
* 現象:
*  テストデータ1:{"alphaNumeric"=[英数字のみです。], "length"=[6~12文字です。]}
*  テストデータ2:{"length"=[6~12文字です。]}
*/ 
$validator = new Validator();
$validator
 ->allowEmpty('user_id')
 ->add('user_id', [
  'alphaNumeric' => [
    'rule' => function ($value, $context) {
       return preg_match('/^[a-zA-Z0-9]+$/', $value) ? true : false;
       },
    'message' => '英数字のみです'
  ],
  'length' => ['rule' => ['lengthBetween', 6,12],  'message' => '6~12文字です。']
 ]);


결론



구글 선생님에게 물으면 CakePHP2에서는 비슷한 현상이 나오는 것은 적지 않을 것입니다.
CakePHP3에서는 아직 치료되지 않은 것 같습니다.
alphaNumeric의 영숫자 체크를 조심하십시오!

참고:
정규식 데스크톱 참조

---I Love PHP (。・ω・。)노♡

좋은 웹페이지 즐겨찾기