虽然跨站点脚本通常被认为是负面的,但我遇到了几种必要的情况。
我最近在一个非常有限的内容管理系统的范围内工作。我需要在页面中包含数据库代码,但托管服务器没有任何可用的东西。我在自己的服务器上设置了几个简单的脚本,最初认为我可以使用 AJAX 将脚本的内容直接导入到 CMS 的模板中(从而保留动态图像、菜单项、CSS 等)。我错了。
由于XMLHttpRequest
对象的限制,不可能从不同的域中获取内容。所以我想到了iFrame——尽管我不喜欢框架,但我认为我可以创建一个与内容的宽度和高度相匹配的框架,这样它就会显得原生。再一次,我被跨站点脚本“保护”阻止了。虽然我确实可以将远程文件加载到iFrame中,但我无法执行 JavaScript 在主机页面或加载页面内修改其大小。
在这种特殊情况下,我无法将子域指向我的服务器。 我也无法在 CMS 服务器上创建可以代理服务器内容的脚本,所以我最后的想法是使用远程 JavaScript。
远程 JavaScript 工作。当用户禁用 JavaScript 时,它会中断,这是一个缺点;但它有效。我在使用远程 JavaScript 时遇到的“问题”是我必须使用 JS 函数document.write()
来输出任何内容。任何不是 JS 的输出都会导致脚本错误。除了document.write()
为每一行使用之外,您还必须确保内容被转义 - 否则您最终会遇到更多脚本错误。
我的解决方案如下:
我的脚本收到一个 GET 参数(“页面”),然后查找文件({$page}.php
),并将内容读入变量。但是,我不得不使用笨拙的缓冲技术来实际执行包含的脚本(用于数据库交互等),然后剥离所有换行符 ( \n
) 的最终内容,然后转义所有必需的字符。最终结果是我的原始脚本(输出 JavaScript)访问了我服务器上看似“标准”的脚本,并将它们的标准输出转换为 JavaScript,以便在 CMS 模板中显示。
虽然这个解决方案有效,但似乎有更好的方法来完成同样的事情。使跨站点脚本专门用于包含来自完全不同域的内容的最佳方法是什么?