Laravel - 如何前缀所有json响应以防止json注入

时间:2014-01-29 16:27:01

标签: api angularjs http laravel code-injection

我正在编写一个angularjs应用程序,它正在消耗使用Laravel 4.1构建的api。我希望防止json注射。

angularjs中内置的一个方法是使用以下字符串")]}',\n"为所有服务器json响应添加前缀。

angularjs $ http服务将自动从所有json响应中删除此字符串。

我不想手动将此字符串附加到我的api所服务的每个json响应中。

每当我的控制器返回一个json Response对象时,有没有办法为这个字符串添加前缀?

return Response::json($prefix.$json, 200);

3 个答案:

答案 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;
});