【问题标题】:cakephp data validation before posting remote form在发布远程表单之前进行 cakephp 数据验证
【发布时间】:2009-09-01 18:29:25
【问题描述】:

这个真的让我绞尽脑汁: 我需要将非敏感数据发布到第三方支付网关。我想使用内置的 cakephp 表单验证,它工作正常。

我正在做的是将表单提交给本地操作,该操作校准数据并输出任何错误(如果有)。如果没有验证错误,我被卡住的地方是尝试将该帖子数据重新提交到远程 url。问题是必须将浏览器重定向到带有发布数据的外部网址......我想我在这里丢失了它我知道这可能是不可能的...... 我的计划 B 只是使用 javascript 进行表单验证并直接发布到外部 url。我研究过使用 curl,但我需要浏览器重定向/打开外部 url。我有办法让 curl 在发布到 url 时重定向浏览器吗?

【问题讨论】:

  • 某件事告诉我我已经冒险超出了 HTTP 协议的范围

标签: php cakephp curl


【解决方案1】:

根据您的能力和其他与业务相关的决定,您可以采取多种方式。

我建议您使用 AJAX 验证方法来验证您的数据。然后,您的服务器将用于验证(并且您可以存储相关详细信息,如发票编号、客户信息等)。一旦验证,您可以让页面将表单数据提交到第 3 方站点。请注意,根据您的安全证书(用于 SSL)的设置方式,您可能会遇到一些与安全相关的问题。

另一种选择(我认为更安全的选择)是让您的网站接受数据。如果它没有验证,请从客户端请求修复(这里是非常基本的 Cake 内容)。如果验证通过,您可以使用 libcurl 将数据发送到您的第 3 方处理器,从而在您的请求的 POST 数据中正确形成每个变量。

您将无法使用 POST 有效负载重定向客户端。上述两个选项中的任何一个都可以帮助您完成工作。我个人会使用第二种方法,原因如下:1)更容易审计/调试(它已经在您的服务器环境中等)2)更安全 - 您可以比客户端系统更好地锁定您的服务器,3)看起来对我来说更干净(客户端看不到到处都是连接等)和 4)您可以在请求通过您的系统时修改和跟踪请求(当处理器报告错误时适当地响应客户端等)

总而言之,这是一件可行的事情。您的第 3 方是否提供 API?你也可以研究一下。

【讨论】:

    【解决方案2】:

    如果您的应用程序流程中可以有一个额外的步骤,您可以像这样轻松完成,无需 Javascript:

    1. 用户照常填写表格。
    2. 表单像往常一样提交给 Cake 操作并经过验证。
    3. 如果验证成功,您会显示一个中间页面,其中所有值都位于隐藏或只读表单元素中。
    4. Submit 将隐藏表单发送到外部站点。

    您可以向用户展示该中间页面,例如 “请最后一次确认您的数据,单击“返回”更改数据或点击“提交”将其提交到外部站点。”

    【讨论】:

    • 绝妙的想法,非常横向的思维!
    【解决方案3】:

    我知道的唯一选择是使用 JavaScript。

    如果您只想发送数据,则有多种选择。但重定向用户是另一回事。

    您最好的选择可能是重新考虑为什么要将用户发送到不同的网站。

    【讨论】:

      【解决方案4】:

      使用 CURL 进行重定向有点复杂,但它是可能的,而且并不难。如果您明确知道要重定向到哪个 URL,或者您可以构建该重定向 url,那就更容易了。这是一个 curl 调用示例:

      /usr/bin/curl -D "/tmp/0001"  -H "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)" -H "Cookie: key=value; key2=value2;" -H "Content-length: 89" -d "this=is&the=post&data=true" http://url.com/application.php
      

      让我们看一下命令:

      1. -D 将所有返回头存储到文件“/tmp/0001”中。从这里您可以解析出您需要找到的任何重定向。只需运行grep Location /tmp/0001 之类的内容即可获取带有位置重定向标头的行。也就是说,如果应用程序本身重定向。这也是您解析所有 cookie 的地方。
      2. -H 是您要发送到服务器的标头。如果页面需要 cookie,您可以发布 Cookie: 标头。您可能还需要根据您发布的数据生成内容长度。
      3. -d 是您要发布到应用程序的数据这是实际的“POST”。

      在您完成初始帖子并使其正常工作后,您只需使用第二个 url 再次调用 /usr/bin/curl。只需按照它应该查找第二页的方式构建标题,以及它发送给您的任何 cookie,它应该像浏览器一样发布。

      curl 命令的结果将是实际页面,您可以登录到某些数据库进行验证。

      我希望这会有所帮助。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2011-10-22
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 2013-07-05
      相关资源
      最近更新 更多