Laravel学习笔记基础系列--(八)Laravel CSRF数据保护
作者:温新
时间:2021-06-25
Laravel中CSRF保护
CSRF即跨站请求伪造。简单地说,CSRF就是伪装授权用户来发起恶意攻击。
CSRF带来的危害:伪装授权用户发送邮件、发送消息、盗取账号等。
Laravel表单中防止CSRF
Laravel中所有请求方式为PUT
、POST
、DELETE
的路由所对应的表单都需要使用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'
]
我是温新
每天进步一点点,就一点点
请登录后再评论