关于这个 Haacked 博客,我对实施建议的反 JSON GET 劫持解决方案犹豫不决,因为
减轻 JSON 劫持的推荐解决方案涉及到 GET 数据的非 REST-full JSON POST
替代解决方案(对象包装)会导致我无法访问源代码的第 3 方控件出现问题。
我找不到一个经过社区审查的实现,它实现了关于如何编写安全令牌或在网页中安全地交付它的替代解决方案(如下所列)。我也不会声称有足够的专家来推出我自己的实现。
不能依赖引用标题
背景
这篇博客描述了一个关于 JSON 劫持的 CSRF 问题,并建议使用 JSON POST 来获取数据。由于使用 HTTP POST 来获取数据不是 REST 完整的,因此我正在寻找一种更 REST 完整的解决方案,该解决方案可以在每个会话或每个页面上启用 REST 操作。
另一种缓解技术是将 JSON 数据包装在一个对象中,如此处所述。恐怕这可能只会延迟问题,直到找到另一种技术。
替代实施
对我来说,为我的 JSON 扩展使用ASP.NET MVC 的 AntiForgeryToken和 jQuery HTTP GET似乎很自然。
例如,如果我 GET 一些敏感数据,根据上面的 Haacked 链接,以下代码很容易受到攻击:
$.getJSON('[url]', { [parameters] }, function(json) {
// callback function code
});
我同意使用推荐的 POST 解决方法获取数据不是 RESTfull。我的想法是在 URL 中发送一个验证令牌。这样 CSRF 风格的攻击者就不会知道完整的 URL。缓存或未缓存,他们将无法获取数据。
下面是如何完成 JSON GET 查询的两个示例。我不确定哪种实现最有效,但可能会猜测第一个更安全,因为错误的代理缓存了这些数据,从而使其容易受到攻击者的攻击。
http://localhost:54607/Home/AdminBalances/ENCODEDTOKEN-TOKEN-HERE
或者
http://localhost:54607/Home/AdminBalances?ENCODEDTOKEN-TOKEN-HERE
...这也可能是 MVC3 的 AntiForgeryToken 或其变体(参见 swt)。此标记将设置为上面选择的任何 URL 格式的内联值。
阻止我推出自己的解决方案的示例问题
您将使用什么 URL 格式(上图)来验证 JSON GET(斜杠、问号等) 代理是否会使用http ://localhost:54607/Home/AdminBalances 响应http://localhost:54607/Home/AdminBalances? ENCODEDTOKEN-TOKEN-HERE数据?
您将如何将该编码令牌传递到网页?内联,还是作为页面变量?
您将如何编写令牌?内置 AntiforgeryToken,还是通过其他方式?
AntiForgeryToken 使用 cookie。在这种情况下是否会使用/需要支持 cookie?仅 HTTP?SSL 与仅 HTTP 结合使用如何?
您将如何设置缓存标头?Google Web Accelerator 的任何特殊功能(例如)
仅使 JSON 请求 SSL 有什么含义?
为了安全起见,返回的 JSON 数组是否仍应包装在一个对象中?
此解决方案将如何与 Microsoft 提出的模板和数据绑定功能互操作
上面的问题是我自己不进取并这样做的原因。更不用说可能还有更多我没有想到的问题,但这些问题仍然存在风险。