与许多开发人员一样,我希望通过服务器“A”与服务器“B”上的Web服务进行通信来提供JavaScript,但是由于same origin policy的当前版本而受到阻碍。克服这一点(我能找到)的最安全的方法是服务器脚本,它位于服务器“A”上,并充当它与“B”之间的代理。但是,如果我想在各种客户环境(RoR,PHP,Python,.NET等等)中部署此JavaScript并且无法为所有客户环境编写代理脚本,我该怎么办?
使用JSONP,some people say。好吧,Doug Crockford指出on his website和in interviews脚本标记hack(由JSONP使用)是一种不安全的方法来绕过相同的原始策略。 “A”服务的脚本无法验证“B”是他们所说的人,并且它返回的数据不是恶意的,或者会捕获该页面上的敏感用户数据(例如信用卡号)和把它传给卑鄙的人。这似乎是一个合理的问题,但是如果我只使用脚本标记hack并严格使用JSON进行通信怎么办?这样安全吗?如果没有,为什么不呢?使用HTTPS会更安全吗?示例场景将不胜感激。
附录:需要支持IE6。第三方浏览器扩展不是一种选择。让我们坚持解决脚本标签黑客的优点和风险,请。
答案 0 :(得分:2)
目前浏览器供应商在跨域JavaScript应如何工作方面存在分歧。一个安全且易于使用的optoin是Flash的Crossdomain.xml file。大多数语言都为它们编写Cross Domain Proxies,并且它们是开源的。
一个更邪恶的解决方案是使用xss Sammy Worm过去的传播方式。 XSS可用于使用xmlhttprequest“读取”远程域。如果其他域添加了<script src="https://YOUR_DOMAIN"></script>
,则不需要XSS。像这样的脚本标记允许您在另一个域的上下文中评估您自己的JavaScript,这与XSS相同。
同样重要的是要注意,即使有相同原始策略的限制,您也可以让浏览器将请求传输到任何域,您只是无法读取响应。这是CSRF的基础。您可以动态地向页面写入不可见的图像标记,以使浏览器触发无限数量的GET请求。图像标记的使用是攻击者在另一个域上使用XSS获取documnet.cookie
的方式。 CSRF POST通过构建表单然后在表单对象上调用.submit()
来利用工作。
为了更好地理解相同的Orgin Policy,CSRF和XSS,您必须阅读Google Browser Security Handbook。
答案 1 :(得分:1)
看看easyXDM,它是一个干净的JavaScript库,允许您跨域边界进行通信,无需任何服务器端交互。它甚至支持开箱即用的RPC 它支持所有“现代”浏览器,以及具有传输时间的IE6。为15ms。
一个常见的用例是使用它来公开ajax端点,允许你轻松地执行跨域ajax(请查看首页上的小样本)。
答案 2 :(得分:0)
如果我只使用脚本标记hack并严格用JSON进行通信怎么办?这样安全吗?如果没有,为什么不呢?
假设您有两台服务器 - frontend.com和backend.com。 frontend.com包含<script>
这样的标记 - <script src="http://backend.com/code.js"></script>
。
浏览器评估时code.js
被视为frontend.com
的一部分,而不是backend.com
的一部分。因此,如果code.js包含与backend.com通信的XHR代码,将失败。
使用HTTPS会更安全吗?示例场景将不胜感激。
如果您刚刚将<script src="https://backend.com/code.js>
转换为https,那么 NOT 就是安全的。如果页面的其余部分是http,则攻击者可以轻松地在页面中间并将https更改为http - 或者更糟糕的是,包括他自己的javascript文件。
如果您将整个网页及其所有组件转换为https,则会更安全。但如果你是偏执狂这样做,你也应该偏执不要依赖外部服务器为你的数据。如果攻击者攻击backend.com,他在frontend.com,frontend2.com和您的所有网站上都有效地获得了足够的杠杆。
简而言之,https很有帮助,但如果您的后端服务器遭到入侵,它将无法帮助您。
那么,我的选择是什么?
你推荐什么?
我的建议是创建代理服务器,并在整个网站中使用https。
答案 3 :(得分:0)
向所有试图回答我问题的人道歉。它是在假设脚本标记如何工作的错误假设下进行的。假设可以简单地将一个脚本标记附加到DOM,并且该附加脚本标记的内容不会受到相同原始策略的限制。
如果我在发布问题之前打扰测试我的假设,我会知道附加标签的源属性是不受限制的。 JSONP通过建立一个在回调函数中包装传统JSON Web服务响应的协议,更进一步。
然而,无论如何使用脚本标记hack,都无法筛选恶意代码的响应,因为浏览器会执行任何返回的JavaScript。在这种情况下,IE,Firefox和Webkit浏览器都不会检查SSL证书。据我所知,Doug Crockford是正确的。从JavaScript 1.8.5开始,没有安全的方法来执行跨域脚本编写。