php - 创建 PHP API : Checking from which server the API Request comes from

标签 php api curl dns request

我正在为一个网站创建一个 PHP API,我想限制 API 对在我们服务器上注册的域的访问(以防止滥用 API 使用)。所以,这是我现在的方法,嗯,它在纸面上看起来应该很不错。

  1. API 在 api.example.com 上设置。
  2. 想要使用 API 的用户向我们注册,添加他的域并获得 API key 。
  3. API 的用户将使用他的 API key 加密他的请求数据(通过 mcrypt)并通过 cURL 将其发送到 api.example。 com.
  4. 我的服务器检查此 API 请求来自哪个域,并将该域与数据库中的 API key 匹配。如果有 API key ,API 会使用该 key 通过 mcrypt 解密请求,然后使用相同的方法加密并发送结果。

我卡在了第 4 步。最初,我计划使用 HTTP_REFERER 来检查它,但是由于默认情况下 cURL 不发送一个,并且它很容易在用户端代码中被伪造(CURLOPT_REFERER 据我所知记住),我被困在这里。

有没有办法知道这个 API 请求来自哪个域?我看到它可以通过一些流行的 API 来完成,比如 reCAPTCHA。检查 _SERVER["REMOTE_HOST"] 并不是一个真正的选项,因为共享主机(它们具有相同的 IP),因此这将无法防止滥用(无论如何,这主要来自共享服务器)。

有没有这样的检查方法?谢谢!

最佳答案

@Shafee 有一个好主意,只是需要进行一些调整。我们专注于 API 调用的可见部分,即 API key 。这在 URL 中可见,并告诉 API 正在请求数据。与其试图阻止其他人窃取此 key 并使用他们拦截它的域运行他们自己的 cURL 调用,我们可以“只是添加”另一个 key 到组合中,这个 key 对那些拦截器不可见.我并不是说停止检查请求的来源,它仍然是在脚本早期踢出无效请求的好方法,但是使用第二个 key ,您可以保证只有请求数据的人真正知道如何获取数据(您相信他们不会将其泄露给任何人)。

因此,当用户注册一个 key 时,您实际上是在为用户分配两个不同的 key 。
API_KEY - 将您连接到您的域的公钥。系统查找提供的域和 key 以找到下一个 key 。
MCRYPT_KEY - 这是将用于通过 Mcrypt 实际加密数据的 key 。由于它是加密数据,只有请求者和服务器知道它是什么。您使用 key 加密数据并将加密的输入与您的 API key 一起发送到服务器,服务器通过提供的 API key 和域(和 IP)找到解密该输入所需的 key 。如果他们没有使用正确的 key 加密数据,那么使用正确的 key 解密将返回乱码,并且 json_decode() 调用将返回 NULL,从而允许脚本简单地返回“invalid_input”响应。

最终使用这种方法,我们是否还需要检查请求来自何处(域/IP)?使用这种方法实际上归结为 API 用户不会将他们的 API/MCRYPT key 对泄露给其他用户,类似于不泄露您的用户名/密码。即便如此,任何网站都可以轻松地注册以获得自己的 key 对并使用 API。还要注意,除非用户使用正确的用户名和密码登录,否则 API 甚至不会向其服务器返回任何有用的信息,因此他们的终端已经拥有该信息。我们的服务器真正返回的唯一新内容是在成功验证用户后他们的电子邮件地址。话虽如此,我们还需要使用 cURL 吗?我们不能简单地使用 file_get_contents('http://api.example.com/{$API_KEY}/{$MCRYPT_DATA}') 吗?我意识到我在回答中提出了更多问题...

关于php - 创建 PHP API : Checking from which server the API Request comes from,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7007594/

相关文章:

php - 在 UNION 中包含 6 个 SELECT 的 SQL 语句只返回 2 行

php - 密码中允许空格

php - 如何使 HHVM 的 MySQL 驱动程序将 ID 返回为整数?

json - 使用 REST API 的 POST 方法进行读取操作

android - 带有改造 Android 的可选文件

php - 从 CodeIgniter 更新 MySQL 语句

java - 海怪 API : Problems with authentication (Invalid key)

javascript - cURL 到 jquery ajax

curl - 如何编写具有命名多部分主体的 curl

c - 将 CURL 结果放入字符串而不是 STDOUT?