Laravel学习笔记基础系列--(八)Laravel CSRF数据保护

作者: 温新

分类: 【Laravel】

阅读: 1684

时间: 2021-07-06 11:14:00

作者:温新

时间:2021-06-25

Laravel中CSRF保护

CSRF即跨站请求伪造。简单地说,CSRF就是伪装授权用户来发起恶意攻击。

CSRF带来的危害:伪装授权用户发送邮件、发送消息、盗取账号等。

Laravel表单中防止CSRF

Laravel中所有请求方式为PUTPOSTDELETE的路由所对应的表单都需要使用CSRF保护。Laravel视图中通过@csrf指令生成包含CSRF令牌的隐藏输入字段。

@csrf生成隐藏字段后,web中间件组VerifyCsrfToekn中间件会验证请求输入的toekn值和session中存储的token是否一致若不一致,则抛出异常。

下面在demo/index.blade.php中添加一form表单,并提交。

路由文件:route.php

// 表单界面
Route::get('demo', 'DemoController@index');
// 添加数据
Route::post('store','DemoController@store')->name('store');

控制器文件:DemoController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;

class DemoController extends Controller
{
    public function index()
    {
        return view('demo.index');
    }

    public function store(Request $request)
    {
        dd($request->all());
    }
}

视图文件:demo/index.blade.php

<form action="{{ route('store') }}" method="post">
    用户名:<input type="text" name="username">
    <input type="submit" value="提交">
</form>

现在访问demo路由,会发现报了419错误,419错误就是因为没有添加csrf验证保护。现在来为表单添加csrf保护,然后在提交,就会打印出来提交的数据。

<form action="{{ route('store') }}" method="post">
    @csrf
    用户名:<input type="text" name="username">
    <input type="submit" value="提交">
</form>

指定路由不做CSRF验证

put、post、delete的每一个表单请求都需要使用csrf验证。如有些并不需要使用验证的路由该怎么办?此时可以在middleware/VerifyCsrfToken.php中间件中的except属性中添加不需要验证的路由。

<form action="{{ route('store') }}" method="post">
    用户名:<input type="text" name="username">
    <input type="submit" value="提交">
</form>

排序指定路由的csrf验证,这样又可以提交数据到store方法了。

// middleware/VerifyCsrfToken.php

protected $except = [
    'store'
]

我是温新

每天进步一点点,就一点点

请登录后再评论