最佳实践:合法的跨站点脚本

时间:2020-03-05 18:50:15  来源:igfitidea点击:

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

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

尽管此解决方案有效,但似乎有更好的方法可以完成同一件事。使跨站点脚本工作专门用于包括来自完全不同域的内容的最佳方法是什么?

解决方案

回答

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

不知道这是否适合特定情况...即使详细描述也很难知道...

回答

我们有三种选择:

  • 创建服务器端代理脚本。
  • 创建一个远程脚本以读取远程动态HTML。使用类似jQuery的库可以使此操作更容易。我们可以使用load函数在需要的地方注入HTML。编辑我最初的意思是,例如#2是利用JSONP,它要求服务器端脚本识别" callback =?参数。
  • 使用客户端Flash代理,并在服务器的Web根目录上设置crossdomain.xml文件。

回答

我之前遇到过该YDN服务器端代理脚本。它说它是与Yahoo的Search API一起使用的。

如果我们简单地削减Yahoo API代码,它将适用于任何域吗?还是需要用我们要使用的域替换它?

回答

我们可以尝试easyXDM,只需包含很少的代码,就可以在不同域的文档之间传递数据或者方法调用。

回答

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

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

例如:

网站A包含带有src ='Site B / home.php'的iframe。

home.php看起来像这样:

[php stuff]...[/php]
[script type='text/javascript']document.domain='Site A'[/script]