【问题标题】:Understanding the Flash Player 10 Security Model for File Uploads了解用于文件上传的 Flash Player 10 安全模型
【发布时间】:2012-02-18 17:20:22
【问题描述】:

我一直在阅读有关 Flash Player 10 中文件上传的安全限制。根据FileReference docs for upload(),上传不必由用户启动的操作触发(browse() 可以,但仅此而已另一个故事)。如果是这样,这将导致多文件上传的用户体验尴尬,因为一次只能进行一次上传——因此用户必须在每个文件上单击(或按下按钮)一次才能启动上传,但只能当上一个文件完成上传时。

另一方面,documentation for URLLoader.load() 声明:

在 Flash Player 10 及更高版本中,如果您使用多部分 Content-Type(对于 包含上传的示例“multipart/form-data”)(由 POST 中“content-disposition”标头中的“filename”参数 body), POST 操作受应用到的安全规则的约束 上传:

必须执行 POST 操作以响应用户发起的 操作,例如鼠标点击或按键。

This Flash Security article 证实了 URLLoader 文档(请参阅“POST API”部分)。

然而,原始的whitepaper 并没有说明这一点——只是 FileReference browse 必须响应用户发起的操作,而不是(可能是 URLLoader 驱动的)上传本身:

当 SWF 文件使用 FileReference.browse() 和 FileReference.upload() 方法将文件上传到服务器,Flash 播放器执行两个安全规则:

  • FileReference.browse() 必须从用户事件处理程序(鼠标或键盘事件)中调用。

[...]

Flash Player 在任何时候都会强制执行这些相同的规则 调用网络 API 以执行向服务器显示的 POST 包含上传

据我所知,从实际使用 URLLoader API 来上传文件,上传确实需要来自用户启动的操作;但是,这是因为我使用的是播放器的调试版本,还是因为文档有误? (或者别的什么?)

TL;DR: 文档包含相互矛盾的信息,我不相信我的现场测试(面对说它们不应该工作的文档)。 可以使用 URLLoader 上传文件而无需用户交互吗? 还是仅使用 FileReference? (这会扼杀大多数文件预处理的可能性,而这正是我感兴趣的事情!)

【问题讨论】:

    标签: flash security file-upload


    【解决方案1】:

    您没有遇到错误,因为您正在调试中运行。在处理我的速度测试项目时遇到了同样的问题。
    所以对于问题:

    • FileReference 无法在没有用户交互的情况下上传文件。

    • 如果您使用POSTmultipart/form-datafilename 属性,URLLoader 无法在没有用户交互的情况下上传文件。

    • 如果您使用 application/octet-stream 之类的内容类型并将文件正文编码(例如以 base64 格式)放入您的发布请求,您可以使用 URLLoader 上传文件。这意味着,如果您使用的是 PHP,那么您将不会使用 $_FILES,而是使用 $_POST 数组来获取您的文件。

    • 在本地机器上以调试模式工作,不会触发URLLoader限制错误。

    【讨论】:

    • 啊,是因为Debug播放器!但是,据我所知,FileReference 可以 在没有用户交互的情况下上传文件(它只是不能浏览 文件)。我讨厌双重标准。
    • 正如您在问题中发布的那样,根据 adobe.com,FileReference.browse() 必须在 FileReference.Upload() 之前调用。
    • 是的,我明白 :-) 但是想象一下用户单击“浏览”按钮并通过 FileReferenceList 选择 17 个文件。然后可以上传这 17 个文件,而无需进一步的用户交互。但是,如果我们想在上传它们之前以某种方式修改它们(例如,在客户端调整图像文件的大小),那么用户将不得不再点击 17 次,一次以启动每个 (URLLoader) 上传。这就是我所说的双重标准。当然,当存在可接受的变通方法(例如 Base64 编码)时,没有人实际上会强迫用户点击 17 次。
    • 事实并非如此。我使用的是MultiPowerUpload,所以要上传你需要2次点击,第一次浏览,然后你可以管理图像,如裁剪或调整大小,然后第二次点击上传所有图片。如果你愿意,我会发布一些代码,它是如何制作的。
    • 当然,我很好奇你是怎么做到的! (我能想到的唯一方法是一次开始所有上传。)
    【解决方案2】:

    我相信 Adob​​e 希望拥有它,这样您就不能在没有交互的情况下使用 URLLoader 上传文件。我只是认为他们碰巧没有以最好的方式做到这一点,您可以根据您使用 URLLoader 上传文件的准确程度来解决它(如果您在 URLLoader 的 POST 中放置文件名,它应该会出错,但是您可以通过 Base64 编码文件并使用 URLLoader 将其发送到 php 来解决此问题。

    看看this post。通读那里的 cmets,他们似乎也解决了这个问题。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2012-07-17
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多