2012-02-18 24 views
10

He estado leyendo sobre las restricciones de seguridad para las cargas de archivos en Flash Player 10. De acuerdo con FileReference docs for upload(), la carga no tiene que ser activada por una acción iniciada por el usuario (el browse() sí, pero esa es otra historia). Si lo hiciera, eso forzaría una experiencia de usuario incómoda para cargas múltiples, ya que solo una carga puede ocurrir a la vez, por lo que el usuario tendría que hacer clic (o presionar un botón) una vez por archivo para iniciar la carga, pero solo cuando el archivo anterior había terminado de cargarse.Comprensión del modelo de seguridad de Flash Player 10 para carga de archivos

El documentation for URLLoader.load(), por el contrario, afirma:

En Flash Player 10 y posterior, si se utiliza un multiparte Content-Type (por ejemplo "multipart/form-data") que contiene una subida (indicado por un parámetro "nombre de archivo" en una "Content-Disposition" de cabecera dentro del cuerpo de POST ), la operación POST es sujeta a las normas de seguridad aplicadas a cargas:

debe ser llevado a cabo la operación POST en respuesta a un usuario -iniciado acción, como un clic del mouse o presionar la tecla.

This Flash Security article corrobora la documentación URLLoader (véase la sección "API post").

El original whitepaper, sin embargo, no indica esto - sólo que una FileReference de exploración debe ser en respuesta a una acción iniciada por el usuario, no el (potencialmente URLLoader impulsado-) subir en sí:

Cuando un archivo SWF utiliza el FileReference.browse() y FileReference.upload() para cargar un archivo a un servidor, flash jugador hace cumplir dos reglas de seguridad:

  • Se debe llamar a FileReference.browse() desde un controlador de evento de usuario (evento de mouse o teclado).

[...]

Flash Player hace cumplir estas mismas reglas en cualquier momento una API de red está llamado a desempeñar un puesto que parece que el servidor para contener una carga.

Por lo que yo puedo decir por el uso real de la API URLLoader para cargar un archivo, los archivos de hecho no deben provenir de una acción iniciada por el usuario; pero, ¿esto es porque estoy usando una versión de depuración del reproductor o porque la documentación es incorrecta? (¿O algo más?)

TL; DR: La documentación contiene información contradictoria, y no confío en mis pruebas de campo (frente a los documentos que dicen que no deberían funcionar). ¿Se puede usar URLLoader para cargar un archivo sin interacción del usuario? ¿O solo FileReference? (Eso mataría a la mayoría de las posibilidades de preprocesamiento de archivos, que es lo que estoy interesado en hacer!)

Respuesta

2

No tiene errores, porque está ejecutando depuración. Tengo el mismo problema al trabajar en mi proyecto de velocidad.
Así que para las preguntas:

  • FileReference no puede cargar archivos sin la interacción del usuario.

  • URLLoader no pueden subir archivos sin la interacción del usuario si está usando POST, multipart/form-data y filename propiedades.

  • Puede cargar archivos con URLLoader si está utilizando el tipo de contenido como application/octet-stream y colocando el cuerpo del archivo codificado (por ejemplo, en base64) en su solicitud posterior. Eso significa que, si está usando PHP, entonces no trabajará con el $_FILES, sino con el arreglo $_POST, para obtener su archivo.

  • Al trabajar en modo de depuración en la máquina local, no se activará el error de restricción URLLoader.

+0

¡Ah, es por el reproductor Debug! Pero, hasta donde yo sé, FileReference * puede * cargar archivos sin la interacción del usuario (simplemente no puede * explorar * para ellos). Odio los dobles estándares. – Cameron

+1

Como ha publicado en su pregunta, y de acuerdo con adobe.com, 'FileReference.browse()' debe invocarse antes de 'FileReference.Upload()'. – Den

+0

Sí, entiendo :-) Pero imagine que el usuario hace clic en un botón "examinar" y selecciona 17 archivos a través de una 'FileReferenceList'. Esos 17 archivos pueden cargarse sin más interacción del usuario. Pero, si queremos modificarlos de alguna manera antes de subirlos (digamos, cambiar el tamaño de los archivos de imagen en el cliente), entonces el usuario tendría que hacer clic 17 veces más, una para iniciar cada carga (URLLoader). Eso es lo que quise decir con un doble rasero. Por supuesto, en realidad * nadie * forzará a sus usuarios a hacer clic 17 veces cuando hay soluciones temporales aceptables (como la codificación Base64). – Cameron

2

Creo que Adobe quiere tenerlo para que NO pueda usar URLLoader para cargar un archivo sin interacción. Simplemente creo que ellos no lo hicieron de la mejor manera y puedes evitarlo dependiendo de cómo uses exactamente el URLLoader para cargar el archivo (si pones un nombre de archivo en el POST para el URLLoader, debería salir el error, pero puedes resolverlo con Base64 codificando el archivo y enviándolo con el URLLoader a php).

Eche un vistazo a this post. Lea los comentarios allí también, parecen abordar el problema. Espero que esto ayude un poco.

Cuestiones relacionadas