虽然跨站点脚本通常被认为是负面的,但我遇到了几种必要的情况。
我最近在一个非常有限的内容管理系统范围内工作。我需要在页面中包含数据库代码,但托管服务器没有任何可用的东西。我在自己的服务器上设置了几个简单的脚本,最初认为我可以使用 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 模板中显示。
虽然此解决方案有效,但似乎有更好的方法来完成同样的事情。使跨站点脚本专门用于包含来自完全不同域的内容的最佳方法是什么?
最佳答案
你有三个选择:
- 创建 server side proxy script .
创建一个远程脚本以读取远程动态 HTML。使用像 jQuery 这样的库使这更容易。您可以使用 load function在需要的地方注入(inject) HTML。 编辑 我最初的意思是例如#2 是利用 JSONP ,这需要服务器端脚本识别“回调=?”参数。
使用 client side Flash proxy并设置 crossdomain.xml服务器的网络根目录上的文件。
关于php - 最佳实践 : Legitimate Cross-Site Scripting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52646/