1、什么是CSRF攻击
可以理解为两个域名之间不能跨过域名来发送请求或者请求数据,否则就是不安全的,这种不安全也就是CSRF(Cross-site request forgery),中文名称:跨站请求伪造。
laravel 框架中为避免CSRF攻击,为每个 用户session生成一个CSRF token,该token用于验证登录用户和发起请求用户是否为同一个人。
laravel提供了一个全局函数csrf_token来获取该token值,因此只需在视图提交表单中添加如下代码即可在请求中带上token
<input type="hidden" name="token" value="<?php echo csrf_token()?>">
laravel中csrf验证机制默认是开启的。
csrf_token()的简化方法:{{csrf_field()}} 等价于上面一行代码。csrf_token()输出一个token值,而csrf_field输出了一整个input隐藏域。开发时这两个方法可以根据自己选择,但是在异步提交表单时必须使用csrf_token().
2、关闭csrf验证的方法:
并不是所有路由都需要避免csrf攻击,比如去第三方API获取数据的请求。
可以通过在verifyCsrfToken(app/Http/Middleware/VerifyCsrfToken.php)中将要排除的请求URL添加到$except属性数组中,例
protected $except=[
//该出添加需要排除csrf验证的路由
'home/test/test2',
'home/test/test3'
];
排除所有路由的验证
protected $except=[
'*'
];
3、验证码captcha的引入
1:命令行的方式下载安装:
composer require mews/captcha
同时需要开启以下扩展
运行结果:
2:配置
app.php配置
'providers' => [
// ...
Mews\Captcha\CaptchaServiceProvider::class,
]
'aliases' => [
// ...
'Captcha' => Mews\Captcha\Facades\Captcha::class,
]
validation.php文件中:
3、使用
home/login.blade.php文件
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
@if(count($errors)>0)
<div>
<ul>
@foreach($errors->all() as $error)
<li>{{$error}}</li>
@endforeach
</ul>
</div>
@endif
<form action="" method="post">
<p>账号:<input type="text" name="name"></p>
<p>密码:<input type="password" name="password"></p>
<p>验证码:<input type="text" name="captcha"><img src="{{captcha_src()}}"></p>
{{csrf_field()}}
<input type="submit" value="提交">
</form>
</body>
</html>
web.php
Route::any('/','LoginController@login');
控制器中:
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
class LoginController extends Controller{
public function login(Request $request){
if (Input::method()=="POST") {
//自动验证
$this->validate($request,[
//具体验证规则
'name'=>'required|min:2|max:20',
'password'=>'required|min:2|max:20',
'captcha'=>'required|captcha'
]);
}else{
return view('home.login');
}
}
}
结果:
4、如果大小不合适,去修改配置文件就行了