理解Flash Player 10的文件上传安全模型

10
我一直在阅读有关Flash Player 10文件上传安全限制的内容。根据FileReference docs for upload(),上传不必由用户触发(浏览操作必须由用户触发,但那是另一回事)。如果需要的话,这将为多文件上传带来尴尬的用户体验,因为一次只能上传一个文件--因此用户必须为每个文件点击(或按下按钮)以启动上传,但只有在前一个文件上传完成后才能这样做。
另一方面,URLLoader.load()文档指出:
在Flash Player 10及更高版本中,如果您使用多部分Content-Type(例如“multipart/form-data”)来包含上传(在POST主体中的“content-disposition”标头中由“filename”参数指示),则POST操作受到应用于上传的安全规则的限制: 必须响应用户发起的操作(例如鼠标单击或按键)执行POST操作。 此Flash安全文章支持URLLoader文档(请参见“POST API”部分)。
然而,原始白皮书没有说明这一点-只有FileReference的浏览必须是响应于用户发起的操作,而不是(潜在的URLLoader驱动的)上传本身:
当SWF文件使用FileReference.browse()和FileReference.upload()方法上传文件到服务器时,Flash Player会执行两个安全规则:
- 必须在用户事件处理程序(鼠标或键盘事件)中调用FileReference.browse()。 - Flash Player在任何时候调用网络API以执行POST请求并将其发送到服务器时,都会执行这些相同的规则。
就我从实际使用URLLoader API上传文件的情况来看,上传确实不需要来自用户发起的操作;但是,这是因为我正在使用播放器的调试版本,还是因为文档有误?(或其他原因?)
简而言之:文档包含了矛盾的信息,我不信任我的现场测试(面对说不应该起作用的文档)。URLLoader是否可以在没有用户交互的情况下用于上传文件?还是只能使用FileReference?(这将破坏大多数文件预处理可能性,而这恰好是我感兴趣的!)
2个回答

2
我认为Adobe想要使您无法使用URLLoader在没有交互的情况下上传文件。我只是觉得他们没有以最佳方式实现它,根据您如何使用URLLoader上传文件,您可以绕过它(如果您在POST中为URLLoader放置文件名,它应该会出错,但您可以通过对文件进行Base64编码并将其与URLLoader一起发送到PHP来解决这个问题)。
请看这篇文章。也请阅读其中的评论,它们似乎解决了这个问题。希望这能有所帮助。

2
您没有遇到错误,因为您正在调试。在我的速度测试项目中也遇到了同样的问题。
因此,对于以下问题:
  • FileReference 无法在没有用户交互的情况下上传文件。

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

  • 如果您使用类似于 application/octet-stream 的内容类型,并将文件主体编码(例如使用 base64)放入您的 post 请求中,则可以使用 URLLoader 上载文件。这意味着,如果您使用 PHP,则将不使用 $_FILES,而是使用 $_POST 数组来获取您的文件。

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


啊,这是因为调试播放器的原因!但是据我所知,FileReference 可以在没有用户交互的情况下上传文件(它只是不能浏览它们)。我讨厌双重标准。 - Cameron
1
根据您在问题中发布的内容以及adobe.com网站上的说明,必须在调用FileReference.Upload()之前调用FileReference.browse() - Den
这不是这样的。我正在使用MultiPowerUpload,所以上传需要2次点击,第一次点击浏览,然后您可以管理图像,如裁剪或调整大小,然后第二次点击上传所有图像。如果您想要的话,我可以发布一些代码部分,说明它是如何制作的。 - Den
当然,我非常好奇你是如何让它工作的!(我所能想到的唯一方法就是同时开始所有上传。) - Cameron
刚意识到我从未在这个问题上接受过答案。我最终所做的是将我的URLLoader上传的内容类型更改为“application/octet-stream”,然后发送一个“x-content-type”为“multipart/form-data”的请求,我的服务器上的自定义脚本会检测并适当处理它。 - Cameron
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接