1

我有一个网站大量使用从 jQuery 到托管在同一 Web 域中的 Web 服务的 JSON 调用。许多呼叫是从不需要访问者登录的公共页面进行的。

看来我可以使用 Fiddler 重放这些 JSON 调用,这是一个大问题,因为现在恶意用户只需打开我的网站就可以捕获 Fiddler 跟踪,然后,所有的赌注都没有了,谁知道他/她能做什么。

有没有办法保护 Web 服务,所以服务器上只允许从网站页面进行的那些 JSON 调用?我在后端使用 ASP.NET MVC。

谢谢你。


感谢大家为这个话题做出贡献。我有一个后续问题:

SSL 呢?如果我将所有服务都放在一个使用 SSL 保护的文件夹中,那会是一个包罗万象的解决方案(以牺牲性能为代价)吗?谢谢。

4

4 回答 4

1

答案是否定的。用户总是可以模拟浏览器发出的 HTTP 请求。因此,必须以能够处理所有异常和恶意尝试的方式对后端进行编码。

  1. 对所有请求使用 nonce。这可能很难实现,但这是我想到的最重要的事情之一。

  2. 跟踪用户代理并否定来自非标准浏览器的所有请求。

  3. 检查推荐人并确保它来自预期页面或至少来自同一域

  4. 包括跟踪会话/cookie 变量以保持跟踪

但是,所有这些事情都可以避免,因此最好的办法是让您的后端系统更安全地处理任何用户输入。

于 2013-03-13T12:37:12.830 回答
0

我建议对每个 JSON 服务请求进行身份验证。Ex- 传递 access_token

每个服务请求都必须针对访问的用户进行验证。他是否有权访问此服务/数据?

对来宾用户也应该做同样的事情。只有有限的服务/数据应该暴露给来宾用户。

从 facebook API 中获取灵感。

于 2013-03-13T12:40:08.153 回答
0

有多种方法可以检查 JSON 调用的有效性,每种方法都为您提供多级安全性:

  • 检查RefererHTTP 标头是否包含您网站的 URL。这为您提供了基本的安全性,因此普通用户将无法通过 Fiddle 访问您的呼叫,例如
  • 如果 JSON 的内容是在服务器端生成的,那么您可以对 json 内容进行签名,以便只接受您之前在服务器端生成的那些调用。例如,查看 JSON Web Token (JWT)。
  • 如果 JSON 内容不是在服务器端生成的,您仍然可以发出一次“票证”,该票证必须在每个 JSON 调用中出现。您必须在服务器端检查票证的有效性,并且票证仅使用一次。
于 2013-03-13T12:43:22.407 回答
0

关于后续问题:

SSL 仅保护浏览器和您的服务器之间的连接,即没有人可以检查两者之间的通信。(例如,中间人可能会在途中更改调用的内容。)这并不能阻止攻击者进行自己的 JSON 调用。不同之处在于他的呼叫是加密的,除了您的服务器之外,其他任何人都无法检查。

于 2013-03-13T13:50:49.993 回答