Laravel 5 で入力パラメータ値の文字エンコーディングをチェックするMiddlewareを追加する

Laravel

セキュリティのリスクを少しでも減らすために、想定している文字エンコーディング以外の文字がパラメータとして送信されても受け付けないようにします。

1.以下のミドルウェアを作成する

app/Http/Middleware/EncodingValidateParams.php として、パラメータ値の文字エンコーディングをチェックするミドルウェアを新規に作成します。

<?php namespace App\Http\Middleware;

use Closure;

class EncodingValidateParams
{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        foreach ($request->all() as $val) {
            if (! $this->isValidEncoding($val)) {
                abort(400, 'Bad Request');
            }
        }

        return $next($request);
    }

    /**
     * @param string $val
     * @return bool
     */
    private function isValidEncoding($val)
    {
        if (mb_check_encoding($val, mb_internal_encoding())) {
            return true;
        }

        return false;
    }
}

※ ホントは、mb_internal_encoding() は書かなくてもいいはずです。分かりやすくするために書いてあります。

2. グローバルなミドルウェアとして登録する

Global Middleware として利用するために、app/Http/Kernel.php の $middleware 配列に、'App\Http\Middleware\EncodingValidateParams', を追加します。

<?php namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{

    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        // :
        'App\Http\Middleware\EncodingValidateParams',
    ];

    // 省略
}

以上です。

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

参考

最終更新日: 2015-5-13

Pocket

コメントを残す

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

*