【问题标题】:How to prevent API calls outside a web site如何防止网站外的 API 调用
【发布时间】:2014-12-05 17:04:36
【问题描述】:

我有一个具有以下功能的网站:用户来到www.mysite.com/page.php。该页面上的 Javascript 对 www.mysite.com/api.php 进行 ajax API 调用,并在同一页面上显示结果 www.mysite.com/page.php

我害怕有人开始在自己的软件上使用我的 api.php,因为使用www.mysite.com/api.php 会花费我一些钱。因此,我希望只有访问过页面 www.mysite.com/page.php 的用户才能从 www.mysite.com/api.php 获得有效结果。用户将无法登录我的网站。

这样做的正确方法是什么?我想我可以在用户访问 page.php 时开始一个会话,然后以某种方式首先检查 api.php 是否存在具有有效会话 ID 的会话?

【问题讨论】:

  • 最大的问题是如何区分机器人和人类。编写一个首先“访问”您的网站然后使用检索到的会话 id/token/其他任何内容来访问您的 API 的机器人并不难。
  • 感谢大家的快速回复!即使没有 100% 的保护,PHP 会话可能是这种情况下最好的“软”保护。

标签: javascript php ajax api


【解决方案1】:

如果你只是想让用户在使用 api.php 之前访问 page.php,那么 session 是要走的路。

【讨论】:

  • 是的,这就是我想要的。这可能是个愚蠢的问题,但是我如何在 api.php 上检查服务器上是否存在会话?
  • 通过使用session_start()初始化会话并读取声明会话的会话变量$_SESSIONSee the manual: Sessions
  • 只需在每个 php 脚本(本场景中的 page.php 和 api.php)中启动 seesion。然后在page.php中设置一个变量,在api.php中读取。类似于:@session_start(); $_SESSION['允许'] = 1;在 page.php 中 if (!empty($_SESSION['allow'])) ...
【解决方案2】:

通常,如果您想要“软”保护,您可以使用 POST 动词从您的站点获取结果。然后,如果用户在浏览器中访问 URL 并仅键入 api.php 调用,他们将不会得到结果。这并不能保护您的网站,但可以使搜索引擎远离该网址并避免意外浏览该网址。

不然的话,php的认证插件太多了。

例如http://www.homeandlearn.co.uk/php/php14p1.html

【讨论】:

  • 如果您有一个适当的 REST API,使用 post 处理 everything 不是一个好主意。
  • POST 可能会使 api 的使用变得更加困难,但人们开始使用它仍然很容易。用户无需登录我的网站,因此身份验证插件可能不是解决方案。
  • REST 并不是万能的。
【解决方案3】:

您可以通过多种方式检查请求,例如令牌验证、会话验证,甚至通过服务器“HTTP_REFERER”变量

【讨论】:

    【解决方案4】:

    使用 $_SERVER['HTTP_REFERER'] 检查引荐来源网址是否在域外阻止它。

    请注意,人们可以更改他们的 REFERER,因此它不安全。

    另一个更好的解决方案可能是来自谷歌https://www.google.com/recaptcha/intro/index.html的验证码

    【讨论】:

    • 我不认为这是最好的方法,因为从外部修改 HTTP_REFERER 很容易。
    • 没有认证就没有安全的方法
    • @JelleKeizer 检查会话很麻烦,因为您无法在不实际“访问”网站的情况下伪造会话 ID。基于验证码的解决方案已经非常好。 “推荐人”太微不足道了,不能伪造。
    • 如果您想让您的访问者成为 Google OCR 软件的免费志愿者,您可以使用 reCaptcha...
    【解决方案5】:

    您在隐藏输入字段中发送的 Cookie、HTTP-Referer、附加 POST 数据或某些表单数据不够安全,无法确定用户来自您的网站。

    用户可以通过修改 http-headerdata(或者如果您使用 cookie,通过更改客户端计算机上的 cookie 文件)轻松更改其中的所有内容。

    我更喜欢 PHP-Session 与对机器人的良好保护(例如蜜罐)相结合,因为如果您正确使用它们,就不会那么容易被劫持。

    请注意:如果有专门为您的网站设计的漫游器,无论如何您都输了。所以没有 100% 的保护。

    【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2023-01-11
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多