【问题标题】:Client HTTP Post to external sites客户端 HTTP Post 到外部站点
【发布时间】:2011-03-24 22:14:22
【问题描述】:

是否有任何网络语言允许客户端自己向外部站点创建 HTTP 帖子。

我知道 JavaScript 使用 XMLHttpRequest 执行此操作,但它不允许跨域发布,除非接收域希望允许发送域。

我想将数据发布到外部站点(我无法控制),并使用客户端浏览器已有的内容(cookie 等)对请求进行身份验证。

这可能吗?我尝试了 cURL,但它似乎发出了服务器 HTTP 帖子,而不是客户端 HTTP 帖子。


编辑:

对我正在尝试做的事情有更多的了解:

我正在尝试使用用户会话将 JSON 发布到网站(我说的是 cookie,但我相信它们是 PHP 会话,我想我仍然考虑使用 cookie)。

网站不检查推荐(安全性差 #1) 我可以使用我的个人主页在网页上执行 javascript 和 html(安全性差 #2) 即使内容类型是表单,JSON 代码仍然可以工作(安全性差 #3) 根本没有安全检查,只有 PHP 会话检查。

表单的想法很棒,而且很有效。可能又是它的 JSON。因此,将 postdata 作为 foo={"test":"123", "test2":"456"} 发送后,整个 foo= 部分就搞砸了。加上表单似乎将 JSON 转换为表单编码,所以它的发送:

富=%7B%22 测试%22%3A+%22 123%22%2C+%22 test2%22%3A+%22 456%22%7D

当我需要它发送时;

{"test":"123", "test2":"456"}

那么在所有已知的情况下,是否有更好的机会发送 JSON?

【问题讨论】:

  • #1 我不会考虑不检查推荐人的安全性差,这与问“那么你从哪里来?哦,好,进来吧。保证你的名字不是马洛里?好极了!”这背后没有合法的安全性,任何使用 wget 甚至 firefox 的实时 http 标头的人都可以在 7 秒内轻松欺骗它。 #3 也可以更改为 content type = "Magic spaghetti Pasta",我可以将它们发送到 ajax json 中,里面装满了带有多汁培根的数组。所以我也不认为这是对安全的真正威胁。然而,#2 是个问题。

标签: java php javascript ruby perl


【解决方案1】:

我不这么认为:您不会从服务器端获取第三方网站上的用户身份验证 cookie(因为单一来源策略),并且您不能向第三方网站发出 Ajax 请求.

你能做的最好的可能是创建一个<form>(可能在<iframe>),将它指向第三方站点,用数据填充它,然后让用户提交它(或自动提交它) .您将无法以编程方式获取请求结果(同样是因为单一来源政策),但也许可以 - 您仍然可以向用户显示请求结果。

【讨论】:

  • @Pekka 你现在提出了一个有趣的想法,我以前从未停止过思考。所以我不能在幕后代表用户提交表单并取回结果,比如使用 ajax。但是...如果我的站点中有一个隐藏的 iframe,它从机器读取 cookie,将表单发布到远程站点,用 javascript 抓取屏幕以获取一些有趣的信息,然后将另一个隐藏的表单发布到我的站点,该表单正在记录没问题的信息。我是否在安全方面遗漏了一些我只是忽略的东西?不会那么容易吧?
  • @spinon 你不能为任何正确编程的网站做它(你想做的是一个跨站点请求伪造)。
  • @spinon 不,这是不可能的,因为您无法使用 Javascript 访问文档的任何部分。您甚至无法从中获取单个像素:stackoverflow.com/questions/1936021/…
  • @Artefacto 我的兴趣已经达到顶峰。正确编程的网站是什么意思?我仍然没有看到什么会阻止我做这样的事情?我确定一定有我遗漏的东西?
  • @Pekka 哦,好吧,没错。现在我想起来了。我知道我错过了一些东西。谢谢你清理我的大脑屁。呵呵!!
【解决方案2】:

我认为出于显而易见的原因,这是不允许的。如果允许这样做,将阻止恶意人员将表单数据从个人浏览器发布到某个隐藏的 iframe 或弹出窗口中的任意数量的站点。

如果这是您的应用程序设计,您需要重新考虑您要完成的工作。

编辑:正如@Pekka 指出的那样,我知道您可以使用典型的表单提交将表单提交到远程站点。我指的是使用一些客户端 ajax 解决方案。很抱歉造成混乱。

【讨论】:

  • 将表单数据从一个人的浏览器发布到外部站点是没有问题的。向一个人发出完整的 Ajax 请求并以编程方式获取响应是不可能的。
  • @Pekka 是的,这就是我想说的,只是不太清楚。阅读我在你的评论上留下的关于我以前从未想过的事情的评论。
【解决方案3】:

您应该遵循 OpenID 和其他单点登录系统的工作方式。 openID 的工作原理是您的网站向 openID 服务发布一些令牌,然后获得身份验证结果。参考How Does it Work? section here

【讨论】:

  • 可能无法正常工作,因为他无法控制向其发出请求所需的外部站点。
【解决方案4】:

可以,可以使用支持跨域调用的特殊flash库:YUI connection manager

添加:虽然不确定 cookie 身份验证问题...

【讨论】:

  • 这听起来不错,但我认为 Flash 在发出请求时不会使用浏览器的 cookie。不过,也许可以手动添加它们。
  • 这里的关键是cookies。如果不需要,他也可以在他的域中设置反向代理。
【解决方案5】:

客户不能直接发布到外部站点;它违反了基本的跨域安全模型。例外是使用 JSONP 访问 javascript。您所描述的内容需要访问另一个网站的用户 cookie,这是不可能的,因为浏览器只允许在同一域/路径内访问 cookie。

您需要使用服务器端代理来发出跨域请求,但您仍然无法访问外部 cookie:http://jquery-howto.blogspot.com/2009/04/cross-domain-ajax-querying-with-jquery.html

【讨论】:

  • 服务器端代理也无济于事,因为客户端浏览器中有身份验证 cookie,他似乎需要用于操作。
  • 我说访问cookie是不可能的,包括客户端+服务器端的方法。
猜你喜欢
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多