2010-01-15 21 views
32

Estoy escribiendo un script que carga un archivo a un script cgi que espera una solicitud multiparte, como un formulario en una página HTML. El boundary es un token único que anota el contenido del archivo en el cuerpo de la solicitud. He aquí un ejemplo de cuerpo:Generando límite multiparte

--BOUNDARY 
Content-Disposition: form-data; name="paramname"; filename="foo.txt" 
Content-Type: text/plain 

... file contents here ... 
--BOUNDARY-- 

El boundary no puede estar presente en el contenido del archivo, por razones obvias.

¿Qué debo hacer para crear un límite único? ¿Debo generar una cadena aleatoria, verificar para ver si está en el contenido del archivo, y si es así, generar una nueva, enjuagar y repetir, hasta que tenga una cadena única? ¿O sería suficiente con un "token bastante aleatorio" (por ejemplo, combinación de marca de tiempo, identificación del proceso, etc.)?

+2

¿Qué lenguaje de programación usas? Usualmente tal cosa es manejada por una biblioteca. –

+0

Estoy usando Ruby. Tendría que estar en el stdlib, sin embargo, no puede usar gemas ya que la secuencia de comandos debe poder ejecutarse en cualquier sistema con ruby ​​instalado, sin tener que instalar gemas. –

Respuesta

0

Si se siente paranoico, puede generar un límite aleatorio y buscarlo en la cadena que se enviará, añada char al azar en find. Pero mi experiencia es que cualquier cadena arbitraria no diccionario de 10 o más caracteres es casi imposible de encontrar, por lo que elegir algo así como --- LIMITES --- LIMITES --- LIMITES --- es perfectamente suficiente.

+35

No, no es suficiente. Porque no podrá enviar el código fuente de su programa (o este comentario) usando su programa. – stepancheg

+4

@stepancheg: parece que te sientes paranoico, en este caso usa la solución del primer párrafo de mi respuesta. Sin embargo, si estás mentalmente sano, usa 'Content-Encoding: gzip' y deja de preocuparte por los usuarios que intentan atraparte. –

+0

Es responsabilidad del programador evitar errores futuros previsibles. – BornToCode

46

Si utiliza algo lo suficientemente aleatorio como un GUID, no debería haber ninguna necesidad de buscar en la carga útil para buscar un alias del límite. Algo así como: -

---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45
Cabecera: ....

carga útil
---- = NextPart_3676416B-9AD6-440C-B3C8- FC66DDC7DB45--

+2

¡Gracias! Su respuesta es tan buena como la respuesta etiquetada, pero necesitaba el representante más de lo que lo hizo;) –

+2

esta respuesta es mejor ya que un GUID está diseñado específicamente para ser "globalmente único". Cuando puedes obtener un GUID de una línea de código, ¿por qué intentas crear tu propia cadena un tanto aleatoria? – Keith

12

Para los chicos de Java: url

protected String generateBoundary() { 
      StringBuilder buffer = new StringBuilder(); 
      Random rand = new Random(); 
      int count = rand.nextInt(11) + 30; // a random size from 30 to 40 
      for (int i = 0; i < count; i++) { 
      buffer.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]); 
      } 
      return buffer.toString(); 
     } 

private final static char[] MULTIPART_CHARS = 
      "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 
        .toCharArray(); 

Referencia: http://hc.apache.org/httpcomponents-client-ga/httpmime/xref/org/apache/http/entity/mime/MultipartEntity.html