我从Laravel 5开始,我想做正确的事。我正在和Json一起做“Post”,我想实现CSRF保护,但我不知道如何在我的JSON上做到这一点。我用AJAX看了很多例子,但是用JSON我没找到。
我需要手动设置人员或laravel的每个令牌自动执行吗?
如何在该JSON上传递令牌作为参数?
那是我的JSON:
{
"foo":"bar"
}
那是我的控制器代码:
public function Register()
{
$teste = Request::json()->all();
return $teste;
}
我在中间件上使用Laravel的所有保护默认值。
无论是使用ajax还是正常发布,您总是需要传递CSRF令牌。这基本上是一个安全功能。
Laravel自动生成它。
您需要在页面上创建“_token”变量,您也可以在主模板中创建一次变量,然后您可以在整个项目中访问它:
<script type="text/javascript">
var secure_token = '{{ csrf_token() }}';
</script>
现在,您可以使用以下ajax调用中的数据发送令牌:
$.ajax({
data: { _token: secure_token }
});
如果您通过表单提交发布任何数据,您可以发布如下:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
您应该始终在项目中的每个ajax请求或表单提交中张贴CSRF令牌。
我们也在Laravel应用程序中解决了这个问题。这就像做以下两件事一样简单。
首先,在页面上创建_token变量,甚至可以将其放在基本布局视图模板中:
<script type="text/javascript">
var _token = '{{ csrf_token() }}';
</script>
然后,使它成为每个ajax请求在js应用程序代码的开头(或者在开始使用jquery使用ajax调用之前的任何地方)使用以下内容发布_token
变量:
$.ajaxSetup({
data: { _token: _token }
});
只要您的请求都没有使用_token
索引,您现在应该将csrf令牌添加到您在应用程序中创建的每个ajax请求中。
从Laravel 5开始,默认的csrf中间件将检查名为_token
的formdata字段或名为X-CSRF-Token
的请求标头。
如果您不发布表单数据(例如json或xml),则标题是最简单的选项。
如果您正在使用jquery,则可以通过将以下脚本标记添加到始终加载的模板(例如layout.blade.php
)来为所有ajax请求设置它:
<script>
$(function(){
$.ajaxSetup({
headers:{'X-CSRF-Token': '{{ csrf_token() }}'}
});
});
</script>