我正在编写一个angularjs应用程序,它正在消耗使用Laravel 4.1构建的api。我希望防止json注射。
angularjs中内置的一个方法是使用以下字符串")]}',\n"
为所有服务器json响应添加前缀。
angularjs $ http服务将自动从所有json响应中删除此字符串。
我不想手动将此字符串附加到我的api所服务的每个json响应中。
每当我的控制器返回一个json Response对象时,有没有办法为这个字符串添加前缀?
return Response::json($prefix.$json, 200);
答案 0 :(得分:3)
如果要在响应中添加/附加数据,可以使用过滤器。
Route::filter('json.protect',function($route,$request,$response = null)
{
if($response instanceof \Illuminate\Http\JsonResponse) {
$json = ")]}',\n" . $response->getContent();
return $response->setContent($json);
}
});
然后,您可以使用after
属性将过滤器附加到路径。
Route::get('/test', array('after' =>'json.protect', function()
{
$test = array(
"foo" => "bar",
"bar" => "foo",
);
return Response::json($test);
}));
或者,如果您不想为每个输出json的路由附加过滤器,那么也可以使用App::after
挂钩。
App::after(function($request, $response)
{
if($response instanceof \Illuminate\Http\JsonResponse) {
$json = ")]}',\n" . $response->getContent();
return $response->setContent($json);
}
});
答案 1 :(得分:0)
我知道很久以前就问了这个问题,但是为了帮助谁需要使用Laravel 5和AngularJS这种方法,这可以通过创建Response Macro来完成,所以在你的ResponseMacroServiceProvider
课程中你&# 39; d定义boot
方法,如:
public function boot()
{
Response::macro('angular', function($value, $status = 200)
{
$response = Response::make($value, $status);
$json = ")]}',\n" . $response->getContent();
return $response->setContent($json);
});
}
然后只需调用控制器中的response()
辅助函数:
return response()->angular(['item' => 'value']);
答案 2 :(得分:-2)
这应该有效:
//in app/filters.php
App::after(function($request, $response)
{
if($request->ajax()) $response = ")]}',\n".$response;
});