csrf实例

将生成的唯一token传入后台隐藏表单,并保存在session中,接受的时候判断与之前的是否相同

session_start();
if ($_POST['submit'] == "go"){
//check token
if ($_POST['token'] == $_SESSION['token']){
$name = strip_tags($_POST['name']);
$name = substr($name,0,40);
$name = cleanHex($name);
}else{
//stop all processing! remote form posting attempt!
}
}

$token = md5(uniqid(rand(), true));
$_SESSION['token']= $token;

function cleanHex($input){
$clean = preg_replace("

!", "",$input);
return $clean;
}

?>





[PHP] - Laravel - CSRF token禁用方法
方法一

打开文件:app\Http\Kernel.php

把这行注释掉:'App\Http\Middleware\VerifyCsrfToken'

方法二

打开文件:app\Http\Middleware\VerifyCsrfToken.php

修改为:

use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier {

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    // 使用CSRF
    //return parent::handle($request, $next);
    // 禁用CSRF
    return $next($request);
}

}

CSRF的使用有两种,一种是在HTML的代码中加入:

另一种是使用cookie方式。

使用cookie方式,需要把app\Http\Middleware\VerifyCsrfToken.php修改为:

use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier {

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    return parent::addCookieToResponse($request, $next($request));
}

}

使用cookie方式的CSRF,可以不用在每个页面都加入这个input的hidden标签。

当然,也可以对指定的表单提交方式使用CSRF,如:

use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier {

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    // Add this:
    if($request->method() == 'POST')
    {
        return $next($request);
    }
    
    if ($request->method() == 'GET' || $this->tokensMatch($request))
    {
        return $next($request);
    }
    throw new TokenMismatchException;
}

}
只对GET的方式提交使用CSRF,对POST方式提交表单禁用CSRF

扩展:::
{{ csrf_token() }}

该段代码等同于全局帮助函数csrf_field的输出:


在Blade模板引擎中还可以使用如下方式调用:
{!! csrf_field() !!}

3、X-CSRF-Token及其使用
如果使用Ajax提交POST表单,又该如何处理呢?我们可以将Token设置在meta中:

然后在全局Ajax中使用这种方式设置X-CSRF-Token请求头并提交:

$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Laravel的VerifyCsrfToken中间件会检查X-CSRF-TOKEN请求头,如果该值和Session中CSRF值相等则验证通过,否则不通过。

4.获取相关token值

$("input[name='_token']").val();


$("#_token").val();


$("meta[name='_token']").attr('content');

你可能感兴趣的:(csrf实例)