PHP - 在两台服务器之间安全地发送请求/响应?

And*_*rew 1 php security api post

简介:我用PHP创建了一个应用程序.它是呼叫中心的主管系统.我现在需要允许合作伙伴通过将我们的应用程序与其专有CRM集成来为应用添加新的潜在客户.简而言之,我想我需要为我的应用程序构建一个API.

我能想到的最简单的方法是一个简单的HTML帖子.这会被认为太不安全吗?如果是这样,对于这种情况最好的办法是什么?

谢谢你的帮助,

安德鲁.

Séb*_*uld 7

通过构建API的过程,您很可能会遇到其中一些问题.我将概述可能非常方便实际构建可用的API的概念,并遵循开放标准(反过来,这使得第三方调整现有代码与其交互变得微不足道) .

API处置

第一个关键字是:SSL.永远不要想到不使用它.这提供了一个安全的套接字层,在该套接层上可以以安全的方式进行通信,因此使得窃听和MitM攻击更难以构思.

无论如何,不​​要跳过这个.证书的成本低于每年60美元,所以它的成本并不高,从长远来看可以为您节省很多.

在服务器技术方面,使用您想要的.您的主要要求是可以处理四个常见HTTP谓词的Web服务器:GET,POST,PUT,DELETE.我马上解释一下原因.

API授权

这是一个有争议的领域,因为很多人"认为他们有一个安全的方式这样做".答案是不正确的.您的身份验证的目的是允许客户端使用其凭据轻松进行身份验证,但要防止没有特权的第三方这样做.

只需在Feed中添加API密钥,就会导致有人最终获得它.我已经多次看到这个特定的东西,我强烈反对它,特别是因为有更容易的选择.

我将介绍几个方面,分别将它们标记为(A)(S),用于身份验证和签名.签名是用于呈现您的请求防篡改的方法.身份验证证明了您的身份.

HMAC-SHA512签署(A)(S)

亚马逊将此技术用于其所有S3/AWS API,并且是一种非常轻量级的签名和身份验证请求方法.我个人觉得它比较巧妙.

基本理念:

  1. 汇总所有GET和POST字段(包括您的公钥)
  2. 按字母顺序排序
  3. 使用URLEncode或等效连接它们
  4. 对数据执行HMAC哈希密码,使用私钥作为HMAC的密钥.
  5. 将结果4附加到您的请求中.

这很简单而且很巧妙.它保证的是什么:

  1. 不知道私人不能更改请求和公共密钥
  2. 您无法在不更改请求的情况下更改密钥

这使用相同的HTTP请求整齐地包装两个问题,代价是一个保留的GET/POST字段.亚马逊还要求请求中存在时间戳,以防止重放攻击.整齐!

(对于参考:HMAC- ALGO = ALGO( (key XOR PAD) concat ALGO(key XOR PAD2) concat message).ALGO可以是任何散列密码- SHA256优选用于其轻量的特性)

OAuth(A)

你可能听说过它.这个想法很简单:给你一把钥匙和秘密.这允许您排队等待临时令牌.然后,此令牌用于执行请求.

这样做的主要优点是存在许多库来处理它,包括客户端和服务器端.另一个优点是OAuth有两种操作模式:双腿(服务器 - >没有客户端交互的服务器)和三脚(客户端 - >服务器 - >服务器).

主要缺点是获取令牌的2个HTTP请求.

只需通过(A)发送私钥

......导致重播攻击.不要考虑它.

混合方法是可能的事情.例如,与OAuth结合使用时,HMAC标牌非常棒!

API概念

如今的API端点遵循两个主要标准:SOAP(XML-RPC)或REST.如果您要构建终端以发布潜在客户,您也可以构建相应的API来读取潜在客户并将其删除以备将来使用.

因此,您的API将采用以下形式:

 /my/endpoint/
  - GET: gets a list of leads
  - POST: creates a new lead
 /my/endpoint/ID/
  - GET: get lead info
  - PUT: modifies lead
  - DELETE: deletes the lead
Run Code Online (Sandbox Code Playgroud)

这样您就可以方便地对API进行面向未来的验证.