如何使用Laravel生成安全的查询字符串链接?

时间:2015-05-29 18:35:49

标签: php laravel query-string

html代码是:

<a href="room/info/{{$value->id}}">Click to show details</a>

此代码正在生成此类链接:

localhost:8000/room/info/2

路由器是:

Router::get('room/info/{id}', 'roomcontroller@details');

数字'2'是房间的id。

但我觉得它没有安全感。因为用户可以从浏览器地址栏更改ID。现在我想知道Laravel框架中有任何安全的方法来使用查询字符串吗?或者还有其他方法可以使用Laravel安全地进行操作吗?

1 个答案:

答案 0 :(得分:2)

您可以使用Middleware阻止用户进入不允许的房间。在到达控制器之前,每个请求都会传递给此路由的所有已注册中间件。因此,您可以轻松检查用户是否有权查看此房间。

在Laravel 5中,您可以非常轻松地创建中间件:

php artisan make:middleware RoomMiddleware

将在app/Http/Middleware中生成新文件。你可以在那里写下你的逻辑:

<?php namespace App\Http\Middleware;

use Closure;

class RoomMiddleware
{
    /**
     * Run the request filter.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // You can make your checks here, like if
        // the user is logged in and he can view
        // this room
        $roomId = $request->input('id');
        if (\Auth::guest() || !\Auth::user()->isAuthorized($roomId)) {
            return redirect('home');
        }

        return $next($request);
    }

}

请注意,这只是一个例子。函数isAuthorized不存在,你必须在那里实现你的逻辑。

然后,您需要在app/Http/Kernel.php

中为中间件设置别名
protected $routeMiddleware = [
    'room' => 'App\Http\Middleware\RoomMiddleware',
    'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
    'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
];

然后,您可以将此中间件设置为您的路线,如下所示:

Route::get('room/info/{id}', ['middleware' => 'room', 'uses' => 'roomcontroller@details']);

在Laravel 4.2中你有类似的东西,但它被称为Route Filters