【发布时间】:2013-06-13 10:49:24
【问题描述】:
在 HTML 中,我们可以创建一个表单并放入输入数据,然后将其作为 POST 发送到某个目的地;这意味着我们同时发送和重定向,而目的地将两者检测为同一事物。我想用 cURL 做同样的事情;意味着当我使用 cURL 发布数据时,我应该能够使用诸如 header() 之类的东西进行重定向,并且目标的行为就像使用 HTML 表单定期完成的过程一样。
有可能吗?!
【问题讨论】:
在 HTML 中,我们可以创建一个表单并放入输入数据,然后将其作为 POST 发送到某个目的地;这意味着我们同时发送和重定向,而目的地将两者检测为同一事物。我想用 cURL 做同样的事情;意味着当我使用 cURL 发布数据时,我应该能够使用诸如 header() 之类的东西进行重定向,并且目标的行为就像使用 HTML 表单定期完成的过程一样。
有可能吗?!
【问题讨论】:
是的,您可以使用以下选项让 cURL 跟随重定向:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
来自Manual:
CURLOPT_FOLLOWLOCATION
TRUE 后跟服务器作为 HTTP 标头一部分发送的任何“Location:”标头(注意这是递归的,PHP 将跟随着它发送的尽可能多的“Location:”标头,除非设置了 CURLOPT_MAXREDIRS)。
【讨论】:
我相信你想做的事情是这样的:
Client --> Server A
Server A --> POST --> Server B
Client <------------------------ Server B
这样,例如,客户端可以在不知道服务器 A 知道的密码的情况下登录服务器 B。
如果是这样,你可以做一些类似的事情,但不是完全你想要的(可能类似于 OpenID,不过,并且可以用 OpenID 解决)。
您可以让服务器 A 进行 POST 并接收答案,然后将答案发送给客户端。不幸的是,您可能无法设置 cookie(它们对 A 子域有效,并且不会再发送到服务器 B)并且会话可能由于类似原因而无法工作。
您可能可以让服务器 A 作为一个完整的代理工作:请参阅此答案 How can I scrape website content in PHP from a website that requires a cookie login?。
大多数银行都有 API 可以做到这一点(Paypal,即使它不是银行,does,WorldPay 也是如此)。
一种可能的工作流程是将所有数据发送到银行,银行会使用唯一 ID 进行响应。然后,您要么自己显示所有信息,要么(银行更喜欢)银行向客户显示信息,当你使用特殊的 URL 和唯一的 URL 重定向他们时身份证。
客户可以更改他的表单中的数据——但他得到的只是中止交易,因为两个数据副本不再一致,他无法触摸您发送的副本(当然还有其他方法和工作流程)。
如果您的系统按照此工作流程(或类似工作流程)运行并使用银行自己的 API 和建议的做法,请忽略并接受我的道歉:您做得对。但以防万一你不是,好吧,请三思而后行。
尝试使用 cURL 制作自定义工作流程也许是可能的(对于某些银行来说,绝对可能),但它可能与 rolling your own cryptography 很接近,银行可能不太支持,并且可能会触发银行方面的一些异常检测器(仅举一个例子,许多付款似乎来自相同的 IP 地址或范围)。
【讨论】: