20

虽然跨站点脚本通常被认为是负面的,但我遇到了几种必要的情况。

我最近在一个非常有限的内容管理系统的范围内工作。我需要在页面中包含数据库代码,但托管服务器没有任何可用的东西。我在自己的服务器上设置了几个简单的脚本,最初认为我可以使用 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 模板中显示。

虽然这个解决方案有效,但似乎有更好的方法来完成同样的事情。使跨站点脚本专门用于包含来自完全不同域的内容的最佳方法是什么?

4

5 回答 5

14

你有三个选择:

  1. 创建服务器端代理脚本
  2. 创建一个远程脚本以读取远程动态 HTML。使用像jQuery这样的库可以让这更容易。您可以使用load 函数在需要的地方注入 HTML。编辑我最初的意思是例如#2 是利用JSONP,这需要服务器端脚本识别“回调=?” 参数。

  3. 使用客户端 Flash 代理并在服务器的 Web 根目录上设置crossdomain.xml文件。

于 2008-09-09T20:01:19.863 回答
2

就个人而言,我会调用服务器上的其他域并获取并解析那里的数据以在您的页面中使用。这样您就可以避免任何问题,并获得服务器端语言/平台的强大功能来获取和解析数据。

不确定这是否适用于您的特定场景...即使您的详细描述也很难知道...

于 2008-09-09T19:12:55.300 回答
1

您可以尝试easyXDM,通过包含很少的代码,您可以在不同域的文档之间传递数据或方法调用。

于 2009-07-05T21:32:53.183 回答
0

我以前遇到过那个YDN 服务器端代理脚本。它说它是为与雅虎的搜索 API 一起工作而构建的。

如果您只是修剪雅虎 API 代码,它是否适用于任何域?或者您是否需要将其替换为您希望它使用的域?

于 2008-09-15T17:43:08.663 回答
0

iframe 远程内容可以通过本地 javascript 访问。

远程服务器只需要设置document.domain页面。

例如:

站点 A 包含一个 iframesrc='Site B/home.php'

home.php 看起来像这样:

[php stuff]...[/php]
[script type='text/javascript']document.domain='Site A'[/script]
于 2010-05-10T12:27:27.620 回答