了解用于文件上载的Flash Player 10安全模型

时间:2012-02-18 17:20:23

标签: flash security file-upload

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

另一方面,documentation for URLLoader.load()表示:

  

在Flash Player 10及更高版本中,如果您使用多部分内容类型(for   示例“multipart / form-data”)包含上传(由a表示)   POST中“content-disposition”标题中的“filename”参数   正文),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? (这会杀死大多数文件预处理的可能性,这正是我真正感兴趣的事情!)

2 个答案:

答案 0 :(得分:2)

我相信Adobe希望拥有它,以便您无法在没有交互的情况下使用URLLoader上传文件。我只是认为他们碰巧没有以最好的方式做到这一点,你可以绕过它取决于你使用URLLoader上传文件的确切方式(如果你在URL中为URLLoader放置一个文件名,它应该出错,但你可以通过Base64对文件进行编码并将其与URLLoader一起发送到php)。

看看this post。仔细阅读那里的评论,他们似乎解决了这个问题。希望这有点帮助。

答案 1 :(得分:2)

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

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

  • 如果您使用URLLoaderPOSTmultipart/form-data属性,
  • filename无法在没有用户互动的情况下上传文件。

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

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