最佳长期选择:JSONP vs EasyXDM
Posted
技术标签:
【中文标题】最佳长期选择:JSONP vs EasyXDM【英文标题】:Best long term choice: JSONP vs EasyXDM 【发布时间】:2011-11-13 20:29:47 【问题描述】:JSONP 和 EasyXDM 之间的最佳长期选择是什么,以允许 http 上的域与 https 上的同一域通信(跨协议)?
例如,我希望 http://mywebsite.com 与 https://mywebsite.com 对话,因为会话 cookie 仅通过 https。我想在 http 网站上显示一个用户名,而无需通过 http 传输该数据。
EasyXDM 用security release 吓到我了,JSONP 对安全预防措施不是很清楚。
【问题讨论】:
【参考方案1】:免责声明:我是easyXDM的主要作者。
要直接回答这个问题其实并不容易,要考虑的事情很多。
首先,让我们在问题范围之外比较 easyXDM 和 JSONP。
JSONP 允许 客户端程序(使用 BOM/DOM 的 javascript)与 服务器端程序(使用 db、会话存储等的.net、php 等)进行交互),并且只有客户端可以发起消息传递(请求/响应、轮询或推送,尽管对于推送,您可以轻松设置 IMG.src、执行 XHR 或 FORM 帖子,因为您不需要响应)。 客户端可以发送到服务器的数据量是有限的,并且该数据还必须被格式化以适合作为查询字符串参数,并且服务器必须设置为响应所述数据。对于每条消息,都会以由此产生的成本运行一次网络旅行。
easyXDM 使用基于字符串的传输堆栈促进任意两个客户端程序之间的消息传递。不需要涉及任何服务器端程序,也没有网络流量。双方都是平等的,都可以发起消息传递,并且都可以在客户端上保持状态(因此使用术语 programs 而不是普通的 Javascript)。 消息的大小没有限制,只要数据可以序列化为字符串,传输就可以处理(easyXDM允许你设置自定义序列化器,或者使用JSON)。
这两者的主要区别在于一个是在客户端和服务器之间,只有客户端可以发起消息传递,另一个是在两个平等的客户端程序之间,其中一个可以使用XHR和其他方式进行通信,或将数据中继到服务器。
关于安全性; JSONP 要求客户端绝对信任服务器,毕竟它允许它在其程序中运行任意代码。除此之外,几乎没有问题,但这是一个严重的问题。 easyXDM 只传输信息(字符串),不传输代码,由接收方检查信息并对其采取行动。所以绝对没有执行任意代码的风险。虽然上述情况属实,但 easyXDM 建立通道所依赖的一些组件易受 XSS 攻击(特制的 url 会导致客户端执行任意代码),但这些组件已被关闭。目前尚无此类漏洞,所有新代码都经过彻底审查。
我自己将 easyXDM 用于一些要求很高的项目,LinkedIn、Twitter 和 Disqus 等网站以及诺基亚和其他公司运行的应用程序都在 easyXDM 提供的消息传递框架之上构建了他们的应用程序,所以有很多人翻阅过代码并检查过,并通过使用它来保证其安全性。
最后,它真的是关于用例。例如,JSONP 不能用于跨域调整窗口大小,因为这需要 client/client 通信。但是通过让其中一方使用 XHR,easyXDM 可以同时用于客户端/客户端和客户端/服务器。
在您的情况下,如果您只需要在不安全的域上提供一小部分信息,则这些都不是真正需要的。
浏览安全域,在不安全域上设置 cookie 浏览安全域,让它重定向到其请求中的不安全传递信息 浏览安全域,在重定向到不安全域之前将数据存储在 window.name 中。如果信息不能被欺骗至关重要,那么您需要对所有这些数据进行签名,以便确认其真实性,但如果您只需要一个名称,那么这应该是不必要的。 一个简单的方法来检查真实性是
在不安全域上,生成随机密钥并存储,并重定向到传递密钥的不安全域。 在安全域上将机密与信息一起传回(使用上述任一方法) 在客户端上验证信息是否包含机密。由于只有双方可能拥有秘密,因此信息得到验证。
总结,确实没有确定的答案,这完全取决于情况。所以选择,但要明智地选择:)
【讨论】:
哇,这是一个很好的答案!我不想将 cookie 或客户端名称存储在不安全的域中。我认为不安全的域可以使用 EasyXDM 调用安全域并以这种有限的方式获取它的信息,而无需任何信息通过不安全的 http。再次,非常感谢。 很好的答案!我只想解决一件事,因为我个人必须解决它。当您在最后描述您检查真实性的方式并得出结论时:“由于只有双方可能拥有秘密,因此信息已得到验证。”这实际上是不正确的。原则上,有人可以将“安全”iframe 嵌入到不安全的环境中。嵌入“安全”iframe 的“应用程序”必须使用会话密钥对其请求进行签名,以验证它们是否来自应用程序。您的服务器可以在做某事之前验证会话 cookie 和应用程序的签名。以上是关于最佳长期选择:JSONP vs EasyXDM的主要内容,如果未能解决你的问题,请参考以下文章
Gradle vs. Maven:哪一个是 Android 开发的最佳选择 [关闭]