Php 如何识别ajax请求?

Php 如何识别ajax请求?,php,ajax,security,Php,Ajax,Security,我的网站提供付费(非免费)API。所以我需要识别所有传入的ajax调用并拒绝未知请求。换句话说,我只想将JSON结果返回给: 请求来自我自己的网站 请求来自支付API费用的人员 这是我的密码: $paid_ips = ['138.14.4.3', '32.16.6.1']; $ip = $_SERVER['REMOTE_ADDR']; if ( $ip == '::1' || in_array( $ip, $paid_ips) ) { // allowed } else {

我的网站提供付费(非免费)API。所以我需要识别所有传入的ajax调用并拒绝未知请求。换句话说,我只想将JSON结果返回给:

  • 请求来自我自己的网站
  • 请求来自支付API费用的人员
这是我的密码:

$paid_ips = ['138.14.4.3', '32.16.6.1'];
$ip = $_SERVER['REMOTE_ADDR'];

if ( $ip == '::1' || in_array( $ip, $paid_ips) ) {
    // allowed
} else {
    // not allowed
}

如您所知,
$ip=='::1'
决定我的网站的请求。现在我想知道我在做什么是安全的?还是有更好的方法来处理

您所做的是安全的:如果web服务器配置正确,则未经授权的用户无法使用“假”ip访问服务

有没有更好的方法来处理这个问题

为每个授权API使用者提供一个唯一的、大的授权密钥

然后,API使用者将被请求在请求头中的每个请求中发送密钥。比如:

授权:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

API使用者在发出请求时必须再设置一个标头值,但这并不重要

另一方面,通过IP授权API消费者有许多缺点。主要的一点是每个用户必须有一个静态IP地址


编辑:据我从评论中了解,您的web服务直接由JavaScript客户端(浏览器)代码使用

在这种情况下,JavaScript代码应该将ajax调用发送到API消费者服务器

API使用者的服务器将请求发送到web服务(发送令牌)。获取数据。最后,将检索到的数据作为对ajax调用的响应发送到客户端

这样,auth令牌就不会在JavaScript代码中公开。不是你的代币,也不是你客户的代币

叹气。
我没有想到任何安全的方法来在JS脚本中存储令牌。这是公开的,太可怕了

我保护you API的唯一方法是混合使用用户名/密码身份验证和身份验证密钥(令牌)。
让我解释一下步骤

  • 您的客户端必须在您的网页中输入用户名和密码。提交表单将触发一个JS脚本,该脚本将向服务器发送用户名和密码

  • 服务器上的脚本会将用户名和密码与存储在数据库中的用户名和密码进行比较。如果这些密钥与存储的密钥匹配,脚本将创建一个随机身份验证密钥,将其存储*(同样,存储在数据库或任何东西中),并将其返回给客户端。
    *存储的身份验证密钥必须足够长(24个字符和+),并且必须在定义的延迟后过期

  • 客户端将其存储在cookie或其他东西中(为了保持“登录”),并且每次向服务器发送请求时都必须提供身份验证密钥:服务器每次都需要检查身份验证密钥的有效性–客户端标识

  • 除了这种身份验证,我想不出其他任何东西。
    我讨厌JS那样的安全问题

    但这样,客户端的用户名和密码就不会被存储,身份验证密钥也会过期


    PS:在将用户密码存储到服务器之前,请先对其进行哈希运算。那样的话,从技术上讲就不可能知道原始密码。您不能忘记数据被盗的可能性。

    如何在会话中保存哈希值并在此处使用,在这种情况下,您不需要一直比较您的IP地址,即使您更改了服务器或其他原因,它也会工作。使用密码和用户名如何。。大多数支付网关都是这样使用的……但不要使用get方法传递它们。。使用https。注意,我在别处看到“$\u服务器['REMOTE\u ADDR']可能实际上不包含真实的客户端IP地址”,这是由于代理和假IP。我发现关于它的主题:@vSugumar用户和密码对于支付api费用的用户来说是很好的。好的。但是我应该如何识别我的网站的请求呢?@MartinAJ只是为你自己/你自己的网站创建一个用户吗?好的。我将删除对IP的检查,并将重点放在每个请求都应检查的访问令牌上。都很好。但在这种情况下,我如何验证自己的网站?我需要为我的网站投入一个令牌,它应该由每个ajax请求发送,对吗?好的,在这种情况下,令牌应该写在JS代码中,这对每个人都是可见的。所以每个人都可以免费使用API(通过复制/粘贴属于我自己网站的令牌)。有什么建议吗?@MartinAJ-您可以同时使用这两个世界:
    如果($ip=='::1'| |在_数组($authKey,$allowedAuthKeys))
    。诸如此类。@Matiboux你的建议是合理的,谢谢。但我不认为这是保罗的意思。@MartinAJ-你可以给你自己的网站一个认证密钥。使用较大的密钥长度(请执行较大但合理的密钥长度,以防止快速暴力攻击),您可以生成大量密钥。@MartinAJ-当时的情况稍微复杂一点。查看我的编辑