带有 AngularJS 的 ServiceStack:JSON 漏洞保护和 XSRF

ServiceStack with AngularJS: JSON Vulnerability Protection and XSRF

AngularJS 文档提供了一些建议来保护 Web 端免受 JSON 漏洞和 XSRF 攻击(https://docs.angularjs.org/api/ng/service/$http 部分 "Security Considerations")。

如何配置 JSON 序列化来为我的 JSON 添加前缀? 为 "X-XSRF-TOKEN" 令牌值获取可验证值的最佳方法是什么,以及如何为每个请求验证该值?

您可以添加一个 GlobalResponseFilter 作为您的 JSON 的前缀:

this.GlobalResponseFilters.Add((req, res, dto) =>
{
    if (req.ResponseContentType.MatchesContentType(MimeTypes.Json) 
        && !(dto is IHttpResult))
    {
        res.Write(")]}',\n");
    }
});

这将在序列化 JSON 响应之前写入推荐的前缀。

这将防止 JS Array 漏洞,另一种方法是将数组响应包装在 DTO 中,例如:

return new Response { Results = Db.Select<Poco>() };

序列化为 JSON 对象可以避免 JS Array 漏洞。

我更喜欢 returning 对象响应,因为它不会限制您的 JSON 服务只能与适当配置的 JS 应用程序一起使用,并且对象响应更多 forward-compatible/future-proofed 稍后您可以将服务修改为 return 多种 return 类型而不破坏与现有客户端的兼容性。

任何随机字符串都应该成为一个好的标记,例如十六进制编码的随机字节或只是一个新的 Guid。