【问题标题】:Usage restriction of public (PHP) web services公共 (PHP) Web 服务的使用限制
【发布时间】:2016-07-27 13:15:06
【问题描述】:

我有一个公共 php 站点。它具有 JSON 网络服务,我将其用于 jQuery 自动完成。该网站是公开的,网络服务也是如此。

但是,我想限制网络服务,以便它们只能从相应的网站(即从该网站加载的 HTML 页面)调用。

对此有什么好的解决方案?

在这种情况下的限制意味着: 我的网络服务(例如fooservice.php)是公开的。由于用户未通过身份验证,我想知道如何检查它是否是从我的网站页面调用的(例如 mypagewithautocomplete.php


https://stackoverflow.com/a/38614140/356726 是一个有用的答案 (+1),但只能避免其他浏览器使用 AJAX。它不会阻止仅在浏览器中读取 JSON 结果。

【问题讨论】:

标签: php jquery json web-services


【解决方案1】:

将此添加到您的网络服务:

header('Access-Control-Allow-Origin: yourdomain.com');

More info

这将避免任何将您的 WS 与 Ajax 调用一起使用的意图。

这会阻止我 CURL'ing OP 的网络服务吗?

不,CURL 可以伪造任何标题。但是有了那个标题,没有人可以直接使用你的 WS。如果有人有足够的时间使用 CURL 制作网关以在他们的网站中使用您的 WS,您可以轻松检测到他们大量使用您的 WS。

【讨论】:

  • 这会阻止我 CURL'ing OP 的网络服务吗?
  • 不,CURL 可以伪造任何标题。但是有了这个标头,没有人可以直接使用您的 WS。如果有人有足够的时间使用 CURL 制作网关以在他们的网站中使用您的 WS,您可以轻松检测到他们大量使用您的 WS。
  • 我认为您的评论值得在您的回答中提及,这样人们就不会认为 CORS 标头是一个密封的解决方案。
【解决方案2】:

这就是我所做的。如Pass request headers in a jQuery AJAX GET call 中所述,可以将请求标头传递给我的 Ajax 请求。

我检查此标头值并在它不存在时拒绝访问。它是一种最小且远非完美的方法,但它可以发挥作用。我已将它与推荐的标题 ('Access-Control-Allow-Origin: yourdomain.com'); 结合起来。结合起来,目前看来就足够了。

  1. 没有跨域AJAX访问
  2. 仅输入 URL 即可浏览 JSON 数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 2017-01-30
    • 2015-04-21
    • 2016-10-14
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多