如何使用PHP预填充表单或将数据发送到第三方网站?

时间:2019-03-27 04:33:37

标签: php curl php-curl

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

理想情况下,在将表单提交到我的网站上后,我想在iframe中打开其第三方表单网站,该表单的表单中已预先填充了从表单中收集的数据。显而易见的目标是防止用户不得不两次输入相同的数据,第一次是在我的表单上,第二次是在第三方表单上。另一个好处是,我的网站没有重点关注,因为用户在第三方网站上提交表单后需要完成其他步骤。

我知道有些方法可以在其他网站上预先填充表格。例如,Google表单允许通过将值传递给查询字符串中相应输入的名称属性来预填充表单。这是我创建的一个示例来说明这一点(注意查询字符串。):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属于同一个域,否则无法在我的网站上对其进行操作。我简要地研究了phantom.js,但是(据我所了解的一点),看来在目标站点上维护用户的会话会出现问题。需要重新加载,这将清除预先填充的数据,从而破坏了整个目的。

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

更新: 使用DevTools的“网络”选项卡,我再次尝试提交表单,其中输入之一是Jude的名字。我终于可以通过“ Jude”过滤来隔离包含信息的标题。编辑的标头信息和请求URL如下: Query String Data in Header Actual Request URL that header belongs to enter image description here

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

1 个答案:

答案 0 :(得分:0)

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

如果目标网站足够简单,则可以代理整个服务器上的整个表单请求和响应,Cookie和标头(尤其是如果您使用的是PHP),那么您就可以避免跨源问题,因为浏览器将将它们视为一个起源

然后您可以访问iframe DOM

  window.frames[0]...

或使用的钓鱼器范围

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