举例:
想像你的产品有个/user/email route允许post request去修改已经认证过的使用者的email
而这时若没有CSRF保护, 恶意网站可以创造一个html表单指向你的产品/user/email 且送出恶意的email address
<form action="https://your-application.com/user/email" method="POST">
<input type="email" value="[email protected]">
</form>
<script>
document.forms[0].submit();
</script>
为了保护这个问题,我们需要检查所有post、put、patch和delete 请求的secret session值让恶意的应用无法进入
Laravel 自动生成一个CSRF token给每个session, 这个token用来确认已经认证过的使用者确实就是送请求来的人。因为这个token被存在使用者的session且每次session生成时就会在生成,让恶意程序无法近来。
至於token 我们可以透过request的session曲的token,或直接call csrf_token()
use Illuminate\Http\Request;
Route::get('/token', function (Request $request) {
$token = $request->session()->token();
$token = csrf_token();
// ...
});
而在我们定义"POST", "PUT", "PATCH", or "DELETE" 在html表单时, 需加上_token这个栏位,为了方便,我们可以用@csrf 替代
<form method="POST" action="/profile">
@csrf
<!-- Equivalent to... -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
而App\Http\Middleware\VerifyCsrfToken
这只middleware会帮我们检查传进来的token是否跟session里的token相同
除了在POST当参数,App\Http\Middleware\VerifyCsrfToken也可以用X-CSRF-TOKEN在request header里
<meta name="csrf-token" content="{{ csrf_token() }}">
接着你可以在jquery里自动加入X-CSRF-TOKEN到request header里面
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
好,这样我了解CSRF保护的重要性了,明天我要来试试看能不能把登入画面填的值送到程序里面让程序能接到这些值。
<<: 从0到1 from zero to one 心得 发现1 看待未来的四种方法 #内文
>>: 那些被忽略但很好用的 Web API / CreateDocumentFragment
在传统SQL有交易(Transaction)功能, 这次实作NoSQL类似的功能. 由於在Parti...
flame JoystickComponent 昨日我们使用 SpriteComponent 建构出...
有看月球转运站的夥伴应该有发现, 随着开发的进展,程序码已经变得有点不好看了。 今天就来对这段程序码...
在学习前端的过程,有做过真实需求的网站,会是珍贵的经验。而并不是时时刻刻都会有充足的案子,带每一个...
接续介绍昨天建立的EMR丛集: 建立的丛集可以在左方工具栏的丛集分页找到 步骤的状态可以到「步骤」分...