Laravel 5 で制御文字を禁止するバリデーションルールを追加する

Laravel

ウェブアプリケーションにもいろいろありますが、制御文字を受け入れる必要のないパラメータは割と多いんじゃないかと思います。そのようなパラメータでは、最初から制御文字を受け入れないようになっていれば、セキュリティ面のリスクも減ります。そこで今回は、Laravel 5 を使ったウェブアプリケーションで、制御文字を禁止するバリデーションルールを追加し、「特定のパラメータでは制御文字を受け付けない」ことができるようにします。

元ネタは、体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 の「4-2 入力処理とセキュリティ」です。詳しくはこちらを読んで下さい。

また、制御文字がどういう文字なのかについては、ASCII – Wikipedia を参照して下さい。

手順

1. バリデーション用のクラスを作成する

app/Validation/ParameterValidator.php というクラスファイルを作成し、値に制御文字が含まれていないことをチェックするメソッドを実装します。

<?php namespace App\Validation;

class ParameterValidator
{
    /**
     * @param $attribute
     * @param $value
     * @param $parameters
     * @return bool
     */
    public function validateNoControlCharacters($attribute, $value, $parameters)
    {
        if (mb_ereg('\A[[:^cntrl:]]*\z', $value)) {
            return true;
        }

        return false;
    }
}

2. app/Providers/AppServiceProvider.php の bootメソッド内に以下を追記する

1で作成したバリデーション処理を有効にするため、 app/Providers/AppServiceProvider.php の bootメソッド内に以下を追記します。ここでは、今回のルールに対して no_ctrl_chars という名前をつけています。

Validator::extend('no_ctrl_chars', 'App\Validation\ParameterValidator@validateNoControlCharacters');

3. 専用のエラーメッセージを追加する

今回追加したバリデーションルールのエラーメッセージを登録します。

(1) 英語用

resources/lang/en/validation.php

return array(
  // :
  "no_ctrl_chars" => ":attribute is invalid.",
  // :
);
(2) 日本語用

resources/lang/jp/validation.php

return array(
  // :
  "no_ctrl_chars" => ":attributeは不正な値を含んでいます。",
  // :
);

4. 対象パラメータのバリデーションルールに「no_ctrl_chars」を追加する

以下のように使用します。

$validator = Validator::make(
    ['name' => 'Dayle'],
    ['name' => 'required|no_ctrl_chars|min:5|max:68']
);

メモ

  • 制御文字を受け入れなくてもよいパラメータが多い場合は、Laravelに元々用意されている string というルール(文字列であることをバリデートする)を制御文字禁止にしてしまい、それとは別に制御文字も許可する文字列のルールを別途追加する方がよいかもしれません。Laravelでこれを行うには、Illuminate\Validation\Validatorクラスを継承したクラスを作り、validateStringメソッドをオーバーライドする必要があります。(参考:Validation – Laravel – The PHP Framework For Web Artisans)

以上です。

こちらにもまとめておきました。→ Laravel 5 でのセキュリティ対策 (PHP) – Secure Code Tips

参考

最終更新日: 2015-5-16

Pocket

2 thoughts on “Laravel 5 で制御文字を禁止するバリデーションルールを追加する

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*