laravel 中关于伪造请求和防止csrf
laravel支持的http请求方式路由
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
1. 伪造 http 请求
<form action="/task/1" method="POST"> <input type="hidden" name="_method" value="DELETE"> </form>
2. csrf保护, form表单提交的csrf访问
Route::get('task/{id}/delete', function ($id) { return '<form method="post" action="' . route('task.delete', [$id]) . '"> <input type="hidden" name="_method" value="DELETE"> <button type="submit">删除任务</button> </form>'; }); Route::delete('task/{id}', function ($id) { return 'Delete Task ' . $id; })->name('task.delete');
Route::get('task/{id}/delete', function ($id) { return '<form method="post" action="' . route('task.delete', [$id]) . '"> <input type="hidden" name="_method" value="DELETE"> <input type="hidden" name="_token" value="' . csrf_token() . '"> <button type="submit">删除任务</button> </form>'; });
3. JavaScript 脚本中执行 HTTP 请求
在 JavaScript 脚本中将这个 Token 值放到一个全局请求头设置中,以便每个 HTTP 请求都会带上这个头信息,避免每次发起请求都要添加这个字段
首先需要在 HTML
<head>标签内新增一个<meta>元素来存储 Token 值:<meta name="csrf-token" content="<?php echo csrf_token(); ?>" id="csrf-token">$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });Vue.http.interceptors.push((request, next) => { request.headers['X-CSRF-TOKEN'] = document.querySelector('#csrf-token').getAttribute('content'); next(); });
4. blade 模板中指定csrf
<form method="POST" action="/profile">
@csrf
...
</form>
如果是html中指定 csrf
//<head>标签中添加如下
<meta name=" csrf-token " content=" {{ csrf_token()}} ">代码
5. laravel 集成 vue
CSRF 令牌 & JavaScript
构建 JavaScript 驱动的应用时,为方便起见,可以让 JavaScript HTTP 库自动在每个请求中添加 CSRF 令牌。
默认情况下,
resources/js/bootstrap.js文件会将
csrf-tokenmeta 标签值注册到 Axios HTTP 库。如果你没有使用这个库,则需要手动在应用中配置该实现。
6. X-XSRF-Token
Laravel 还会将 CSRF 令牌保存到名为
XSRF-TOKEN的 Cookie 中,你可以使用该 Cookie 值来设置X-XSRF-TOKEN请求头。一些 JavaScript 框架,比如 Angular 和 Axios,会为你自动进行上述设置,基本上你不太需要手动设置这个值。
最后,
VerifyCsrfToken中间件框架底层实现源码位于vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php,感兴趣的同学可以去一窥究竟。
# 排除指定 URL 不做 CSRF 安全校验
你使用了第三方支付系统(如支付宝或微信支付)来处理支付并用到他们提供的回调功能,这时候就需要从 Laravel 的 CSRF 保护中间件中排除回调处理器路由,因为第三方支付系统并不知道要传什么 token 值给我们定义的路由。
通常我们需要将这种类型的路由放到文件 routes/web.php 之外,比如 routes/api.php。不过,如果必须要加到 routes/web.php 中的话,你也可以在 VerifyCsrfToken 中间件中将要排除的 URL 添加到 $except 属性数组:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* 从 CSRF 验证中排除的 URL
*
* @var array
*/
protected $except = [
'alipay/*',
'http://example.com/foo/bar',
'http://example.com/foo/*',
];
}


浙公网安备 33010602011771号