前言:Laravel文档梳理,仅作为记录后看,无关其他。
1、Laravel是如何规避跨站伪造请求的?
生成CSRF token,验证用户是否为实际的发出者用户。
2、如何生成CSRF token
<?php echo csrf_field(); ?>
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
也可以在blade模板中使用:
{{ csrf_field() }}
3、通常我们不需要验证这个token,那么,它是怎么实现的?
VerifyCsrfToken中间件,会自动验证请求与session中的token是否一致。
4、如果有些路由你不想被CSRF保护,怎么设置?
在VerifyCsrfToken中间件中,添加$expect属性,排除URI
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* URIs 应被 CSRF 验证执行。
*
* @var array
*/
protected $except = [
'stripe/*',
];
}
5、VerfifyCsrfToken只会检查post提交的参数方式么?还有哪种也会检查?
标头中的X-CSRF-TOKEN。比如如下:
<meta name="csrf-token" content="{{ csrf_token() }}">
这种情况,通常ajax处理会用到:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
6、Laravel还会在哪里保存CSRF TOKEN?
XSRF-TOKEN cookie中
Ps:你也可以使用cookie值来设置X-XSRF-TOKEN请求标头
7、为什么要进行请求方法伪造?
因为html表单中没有支持put patch 或 delete的动作,如果你非要使用这几种请求方法,那就必须伪造。
8、举例说明请求方法伪造实例
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
也可以使用辅助函数:
<?php echo method_field('PUT'); ?>
在blade模板引擎中:
{{ method_field('PUT') }}
9、抛出404错误的方法
方法一:辅助函数 abort(404)
方法二:手动抛出 Symfony\Component\HttpFoundation\Exception\HttpException
Ps: 辅助函数只是简单地抛出一个带有指定状态码的
Symfony\Component\HttpKernel\Exception\NotFoundHttpException