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-token meta 标签值注册到 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/*',
    ];
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-06-14 11:01  aocn  阅读(829)  评论(0)    收藏  举报