首页 > 解决方案 > 如何使用 PHP 在第三方网站上预填充表单或将数据发送到第三方网站?

问题描述

我正在构建一个包含表单的 Web 应用程序。目前,用户在此表单中输入数据,该表单保存在我的数据库中。然后,用户打开第 3 方网站,将完全相同的数据的子集输入到该网站上的表单中。

理想情况下,在我的网站上提交表单时,我想在 iframe 中打开第 3 方网站,其表单预先填充了从我的表单中收集的数据。显而易见的目标是防止用户必须两次输入相同的数据,第一次在我的表单上,第二次在第 3 方表单上。另一个好处是我的网站缺乏焦点,因为用户在第 3 方网站上提交表单后需要完成额外的步骤。

我知道有一些方法可以在其他网站上预填充表单。例如,Google Forms 允许通过将值传递给查询字符串中相应输入的名称属性来预填充表单。这是我创建的一个示例来演示这一点(注意查询字符串。):https ://docs.google.com/forms/d/e/1FAIpQLScqua9AJLvRgCuH8o-XfAGeZcbue9ND7a4z2JM5EcAuVqAwag/viewform?vc=0&c=0&w=1&entry.2020941857=Whatever+ and+whatever&entry.473490210=foobar

不幸的是,“目标”网站似乎没有以类似的方式处理传入的 GET 请求,这显然不足为奇。当然,事情不可能总是那么容易。我什至无法通过使用 Chrome DevTools 操作 DOM 来操作目标网站表单中的输入值(即使我可以,我也不会真正理解这对我有什么帮助)。

此外,表单甚至不使用 action 属性提交。相反,这里是我承认不理解的表单和按钮元素(为简洁起见,省略了一些属性):

<form name="theForm" ng-submit="submitForm(theForm.$valid)" 
no-submit-on-enter="" novalidate=""> 
<button class="btn btn-full ng-binding" type="submit" id="send-form" 
track-event="{category: 'theFormSubmit', action: 'clicked'}" 
skip-click-tracker=""> Submit </button> 
</form>

当我使用表单提交信息时,我还尝试使用 DevTools 来查看标题。当我单击按钮时,标题似乎没有改变。事实上,当我单击按钮时,“网络”选项卡中似乎根本没有任何活动。我根本看不到任何“表单数据”。但我可能误解了我所看到的。

对于它的价值,目标似乎严重依赖 Angular.js,我对此几乎一无所知,所以我不确定它是否相关。我也知道 iframe 不能被我网站上的 javascript 操作,除非它属于同一个域,但事实并非如此。我简要研究了 phantom.js,但是(据我所知)在目标站点上维护用户会话似乎存在问题。需要重新加载,这将消除破坏整个目的的预填充数据。

无论如何,我想知道是否有某种方法可以使用 PHP curl 或其他任何方法来实现我的目标。附带说明一下,如果还不是很明显:我无法访问目标网站的完整源代码,也可能无法访问它。

更新: 使用 DevTools 网络选项卡,我再次尝试提交表单,其中一个输入是 Jude 的名字。我终于能够通过“Jude”过滤来隔离包含信息的标题。编辑后的标头信息和请求 URL 如下: 查询 Header 中的字符串数据 标头所属的实际请求 URL 在此处输入图像描述

我觉得我终于到了某个地方。基于以上,我觉得我可能实际上可以将表单数据提交到第三方网站(回避实际输入和提交该网站的表单)。因为我使用的是 UI,所以我可以看到表单已成功提交,并且我有关于如何处理该信息的视觉提示。但是,HTTP 204 标头(无内容)似乎表明,如果我以编程方式发送信息,则不会返回任何内容供我分析表单的成功或失败以及如何处理信息。最终,无论如何,这可能都是一个红鲱鱼,因为我不确定我将如何处理它的 browser_session_id 部分。

标签: phpcurlphp-curl

解决方案


如果您使用的是 iframe,您可能会不走运,因为浏览器跨源策略将拒绝您的 JavaScript 篡改 IFRAME 中的 DOM。

如果目标网站足够简单,您可以通过服务器代理整个表单请求和响应、cookie 和标头(尤其是如果您使用 PHP),然后您就不会出现跨源问题,因为浏览器会将它们视为一个起源

然后你可以访问 iframe DOM

  window.frames[0]...

或使用钓鱼者范围

  angular.element("#appname").scope()

推荐阅读