2017-03-25 89 views
0

我的网站提出了一个支付(不是免费的) API。所以我需要确定所有传入的ajax调用并拒绝未知的请求。换句话说,我只的JSON结果返回到:如何识别ajax请求?

  • 请求来自我自己的网站
  • 请求来自谁已支付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'决定了我的网站的请求。现在我想知道我正在做什么安全?或者有更好的方法来处理?

+0

怎么样保存的哈希值在会话,并在这里使用,在这种情况下,你并不需要所有的时间来比较你的IP地址,如果你改变你的服务器或某些其他原因,它仍然工作。 –

+0

怎么样使用用户名和密码..大部分的支付网关的使用是这样的...但不要”使用get方法传递他们..使用https .. –

+0

要小心,我在其他地方看到“$ _ SERVER [ 'REMOTE_ADDR']可能实际上不包含真实的客户端IP地址“,这是由于代理和伪IP。我发现它是话题:http://stackoverflow.com/questions/3003145/how-to-get-the-client-ip-address-in-php – Matiboux

回答

1

你在做什么是安全的:如果Web服务器配置正确非授权用户无法与“假” IP接入服务。

是否有更好的方法来处理这个问题?

给每个授权的API消费者独特的,大的,授权密钥。

然后API消费者将请求发送与请求的头球每个请求的关键。喜欢的东西:

Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

的API消费者有提出请求时设置一个多标头值,但是这是微不足道的。

在对方授权API消费者通过IP有很多缺点。主要的是每个用户都必须有一个静态的IP地址。


编辑:因为我从你的Web服务是由JavaScript客户端(浏览器)的代码中直接消耗的意见理解。

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

的API消费者的服务器请求发送到您的Web服务(发送令牌)。获取数据。最后将检索到的数据作为ajax调用的响应发送给客户端。

这样的身份验证令牌没有在JavaScript代码暴露出来。不是您的代币,也不是您客户的代币

+0

好吧。我将删除检查IP并关注*访问令牌*,每个请求应该检查该访问令牌*。一切都好。但在这种情况下,我如何验证自己的网站?我需要为每个Ajax请求发送一个令牌给我的网站,对吧?好的,在这种情况下,该标记应该写入每个人都可见的JS代码中。所以eveybody可以免费使用API​​(通过复制/粘贴属于我自己网站的令牌)。任何建议? –

+1

@MartinAJ - 你可以使用两个世界:'if($ ip ==':: 1'|| in_array($ authKey,$ allowedAuthKeys))''。类似的东西。 – Matiboux

+0

@Matiboux你的建议是合理的,谢谢。但我几乎认为这就是保罗的意思。 –

0

叹息。
我不认为存储令牌JS脚本任何安全的方式。它是公开的,它很糟糕。

我来保护你的API将混合使用这两个用户名/密码认证和身份验证密钥(令牌)的唯一途径。
让我来解释一下步骤。

  1. 您的客户必须在您的网页中同时输入用户名和密码。提交表单会触发一个JS脚本,它会将用户名和密码发送到您的服务器。

  2. 你的服务器上的脚本将用户名和密码相比较于那些存储在数据库或什么的。如果这些符合存储的脚本,脚本将创建一个随机授权密钥,将其存储*(再次存储在数据库或任何其他内容中)并将其返回给客户端。
    *所存储的AUTH密钥必须是足够长(24字符和+),并且具有定义的延迟后过期。

  3. 客户端会将它存储在一个cookie或其他东西(为了保持“登录”),并且每次向服务器发送请求时都必须提供auth密钥:服务器需要检查授权密钥有效期 - 客户端身份 - 每次。

我不认为任何东西,但那种认证..
我恨JS的那种安全问题..

不过这样一来,客户的用户名和密码没有存储,并且授权密钥过期。

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