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

时间:2008-09-09 19:09:57

标签: php javascript xss

虽然跨网站脚本通常被认为是否定的,但我遇到了一些必要的情况。

我最近在一个非常有限的内容管理系统的范围内工作。我需要在页面中包含数据库代码,但托管服务器没有任何可用的可用内容。我在自己的服务器上设置了几个简单的脚本,最初认为我可以使用AJAX将脚本的内容直接导入到CMS的模板中(从而保留动态图像,菜单项,CSS等)。我错了。

由于XMLHttpRequest个对象的限制,无法从其他域获取内容。所以我想 iFrame - 即使我不是框架的粉丝,我认为我可以创建一个与内容的宽度和高度相匹配的框架,这样它就会显示为原生的。再次,我被跨站脚本“保护”阻止了。虽然我确实可以将远程文件加载到 iFrame 中,但我无法在主页或加载页面内执行JavaScript来修改其大小。

在这种特殊情况下,我无法将子域指向我的服务器。 我也无法在CMS服务器上创建可以代理我服务器内容的脚本,因此我最后的想法是使用远程JavaScript。

远程JavaScript工作。当用户禁用JavaScript时,它会中断,这是一个缺点;但它的确有效。我使用远程JavaScript时遇到的“问题”是我必须使用JS函数document.write()来输出任何内容。任何不是JS的输出都会导致脚本错误。除了为每一行使用document.write()之外,您还必须确保对内容进行转义 - 否则最终会出现更多脚本错误。

我的解决方案如下:

我的脚本收到GET参数(“page”),然后查找文件({$page}.php),并将内容读入变量。但是,我必须使用笨拙的缓冲技术才能实际执行包含的脚本(对于数据库交互等内容),然后删除所有换行符(\n)的最终内容,然后转义所有必需的字符。最终结果是我的原始脚本(输出JavaScript)访问我服务器上看似“标准”的脚本,并将其标准输出转换为JavaScript,以便在CMS模板中显示。

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

5 个答案:

答案 0 :(得分:14)

你有三个选择:

  1. 创建server side proxy script
  2. 创建远程脚本以读入远程动态HTML。使用像jQuery这样的库可以让您更轻松。您可以使用load function在需要的地方注入HTML。 编辑我最初的意思是#2使用JSONP,这要求服务器端脚本识别“callback =?” PARAM。

  3. 使用client side Flash proxy并在服务器的网络根目录上设置crossdomain.xml文件。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

之前我遇到过YDN server side proxy script。它表示它是与雅虎的搜索API一起使用的。

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

答案 4 :(得分:0)

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]