关于php:最佳实践:合法的跨站点脚本编写

关于php:最佳实践:合法的跨站点脚本编写

Best Practice: Legitimate Cross-Site Scripting

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

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

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

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

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

我的解决方法如下:

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

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


您有以下三种选择:

  • 创建服务器端代理脚本。
  • 创建一个远程脚本以读取远程动态HTML。使用类似jQuery的库可以使此操作更容易。您可以使用load函数在需要的地方注入HTML。编辑我最初的意思是例如#2是利用JSONP,它要求服务器端脚本识别" callback =?"参数。

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


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

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


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


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

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

    例如:

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

    的iframe

    home.php看起来像这样:

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

    我以前遇到过该YDN服务器端代理脚本。它说它是为与Yahoo's Search API一起使用而构建的。

    如果您只需要剪裁Yahoo API代码,它将适用于任何域吗?还是需要将其替换为您要使用的域?


    推荐阅读