本文主要是介绍常见PHP框架CSRF防范方案分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
什么是CSRF
CSRF
(跨站请求伪造)是一种恶意的攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。网上有很多相关介绍了,具体攻击方式就不细说了,下面来说说Laravel
和Yii2
是如何来做CSRF
攻击防范的。
Laravel CSRF防范
本次对Laravel
CSRF
防范源码的分析是基于5.4.36
版本的,其他版本代码可能有所不同,但原理是相似的。
Laravel
通过中间件app/Http/Middleware/VerifyCsrfToken.php
来做CSRF
防范,来看下源码。
<?phpnamespace App\Http\Middleware;use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;class VerifyCsrfToken extends BaseVerifier
{/*** The URIs that should be excluded from CSRF verification.** @var array*/protected $except = [//];
}
可以发现它是直接继承了Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
,只是提供了配置不进行CSRF
验证的路由的功能(这里是因为某些场景下是不需要进行验证的,例如微信支付的回调)。
再来看下Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
主要源码。
/*** Handle an incoming request.** @param \Illuminate\Http\Request $request* @param \Closure $next* @return mixed** @throws \Illuminate\Session\TokenMismatchException*/public function handle($request, Closure $next){if ($this->isReading($request) ||$this->runningUnitTests() ||$this->inExceptArray($request) ||$this->tokensMatch($request)) {return $this->addCookieToResponse($request, $next($request));}throw new TokenMismatchException;}
这里handle
是所有路由经过都会执行的方法。可以看到中间件先判断是否是读请求,例如'HEAD', 'GET', 'OPTIONS'
,又或者是处于单元测试,又或者是不需要进行验证的路由,又或者token
验证通过,那就会把这个token
设置到cookie
里去(可以使用 cookie
值来设置 X-XSRF-TOKEN
请求头,而一些 JavaScript
框架和库(如 Angular
和 Axios
)会自动将这个值添加到 X-XSRF-TOKEN
头中)。
我们再来看下是怎么验证token
的。
/*** Determine if the session and input CSRF tokens match.** @param \Illuminate\Http\Request $request* @return bool*/protected function tokensMatch($request){$token = $this->getTokenFromRequest($request);return is_string($request->session()->token()) &&is_string($token) &&hash_equals($request->session()->token(
这篇关于常见PHP框架CSRF防范方案分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!