可以从同一 Web 服务器加载非 public 文件吗?

Possible to load non-public file from same web server?

我正在为客户端开发一个基于 Web 的 Flash 应用程序,它从服务器上的同一目录加载外部文件。我使用 URLRequest 加载文件:

loader.load(new URLRequest("Config.xml));

目前 Config.xml 文件使用 chmod 644,这赋予它 public 读取权限。但是,客户端希望保护配置文件,使其不能被第三方下载。

我认为通过删除 public 读取权限 (chmod 640) 将无法隐藏文件,因为这样在客户端执行的 Flash 文档将无法阅读。我的测试似乎证实了这一点。 Web 上的 Flash 应用程序是否有任何方法可以从服务器读取文件而不将其暴露给 public?

简答:

不行,你不能那样做。

长答案:

,你不能那样做,因为你已经知道,Flash Player是一种客户端技术,所以它和浏览器完全一样,任何文件由您的 SWF 加载的文件对于任何有权访问该 SWF 文件的人来说都是可访问和可见的,同时忘记在这种情况下没有任何影响的文件访问权限。

请注意,您可以使用一些加密系统来加密该文件的内容,然后您的 SWF 将对其进行解密,但这里的问题是,您还必须加密您的 SWF 文件,据我所知,这是不是一种非常可靠的技术,因为现在 SWF 反编译器确实非常高效 ...

...

希望能帮到你。

。 Flash 使用常规 HTTP 请求加载配置文件,因此如果文件不可公开访问,它当然无法获取该文件。

可以 做的是要求对配置文件进行身份验证,并在您的 URLRequest 声明中包含凭据。但是,这仍然存在有人嗅探流量以发现身份验证的弱点,然后 运行 使用另一个工具再次请求。

最终,您无法同时拥有这两种方式:要么您的配置可访问但不安全,要么安全但不可用。

正如其他人已经说过的,你不能这样做。对于能够从客户端加载文件的 SWF,它必须是 public.

一个可能对您的客户来说足够好的解决方案是在服务器端将 XML 文件内容嵌入到您的 HTML 中,例如 FlashVars 或 JavaScript输出,那么SWF不需要直接加载XML文件,也不需要制作文件public。

例如:

服务器端PHP:

<?php
$xml = file_get_contents("Config.XML");
$encodedXml = rawurlencode($xml);
?>

<object type="application/x-shockwave-flash" data="my-flash.swf" width="550" height="400">
  <param name="movie" value="my-flash.swf" />
  <param name="FlashVars" value="config=<? echo $encodedXml ?>"/>
</object>

客户端 AS3:

var xml:XML = XML(stage.loaderInfo.parameters.config);

当然有人可以查看您的 HTML 源代码并自行解码 XML,但是您将 XML 内容放入您的 SWF 中的任何方式都会暴露这种可能性,以改变难度级别。您可以使编码更加混淆(url 编码很容易发现)或加密以使其更难找到。

客户端应用程序(Flash 或其他)无法自行读取或加载来自服务器的任何文件,即使来自它的来源服务器也是如此。当它加载 public xml 文件时,它会发出请求,如果该文件具有正确的权限并且服务器知道如何提供该文件,则请求被授予并提供该文件。这是一个服务器端操作,所以当你说:"Flash runs client-side, so how would I take any advantage of a server-side solution?" 这显然是对客户端和服务器端工作方式的误解,因为如果你加载 xml文件,那么您就可以利用服务器端解决方案。话虽这么说,如果关闭了文件权限怎么办。

通常不允许访问服务器上的文件或目录,在这种情况下,无法授予客户端直接访问这些文件或目录的权限。因此,这就是您需要使用服务端技术来提供这些文件的时候。服务端技术,例如 PHP 可以访问服务器上的所有文件并复制它们或临时更改它们的权限等...

您可以通过简单地编写一个服务端脚本来为您的客户端提供那些被禁止的文件,该脚本将根据您定义的某些标准(或 none)为您提供文件。服务器端可以更改允许您下载它的权限,然后再将其更改回来,或者它可以复制文件并将其放在 public 可访问的地方,然后将其删除。您还可以更改 xml 的扩展名(例如更改为 .whatever)并且不为其提供 mimetype,即使文件是 public 服务器也无法提供服务,您然后可以让您根据需要为您提供服务端脚本更改其扩展名。只有数百种方法可以做到这一点,包括 Web 服务甚至 AMF 等等,而所需的文件无法 public 访问。但是,是的,您必须编写服务器端脚本,这是向客户端提供文件的一种非常常见的方式。