2010-01-15 13 views
32

Sto scrivendo uno script che carica un file in uno script cgi che si aspetta una richiesta multipart, come un modulo su una pagina HTML. Lo boundary è un token univoco che annota il contenuto del file nel corpo della richiesta. Ecco un esempio del corpo:Generazione del confine multiparte

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

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

Il boundary non possono essere presenti nel contenuto del file, per ovvie ragioni.

Cosa devo fare per creare un confine univoco? Devo generare una stringa casuale, verificare se si trova nel contenuto del file, e se lo è, generare un nuovo, risciacquo e ripetere, fino a quando non ho una stringa unica? O sarebbe sufficiente un "token piuttosto casuale" (ad esempio combinazione di timestamp, id di processo, ecc.)?

+2

Che linguaggio di programmazione usi? Solitamente una cosa del genere viene gestita da una biblioteca. –

+0

Sto usando Ruby. Dovrebbe essere nello stdlib, però, non può usare gems dato che lo script dovrebbe essere eseguibile su qualsiasi sistema con Ruby installato, senza dover installare gems. –

risposta

0

Se ti senti paranoico, puoi generare un limite casuale e cercarlo nella stringa da inviare, aggiungere caratteri casuali sul risultato. Ma la mia esperienza è che qualsiasi stringa arbitraria non-dizionario di 10 o più caratteri è impossibile, quindi scegliere qualcosa come --- BOUNDARY --- BOUNDARY --- BOUNDARY --- è perfettamente sufficiente.

+35

No, non è sufficiente. Perché non sarai in grado di inviare il tuo codice sorgente del programma (o questo commento) usando il tuo programma. – stepancheg

+4

@stepancheg: Sembra che tu ti senta paranoico, in questo caso usa la soluzione dal primo paragrafo della mia risposta. Se sei mentalmente sano, usa 'Content-Encoding: gzip' e smetti di preoccuparti per gli utenti che stanno cercando di ottenerti. –

+0

È responsabilità del programmatore evitare errori futuri prevedibili. – BornToCode

46

Se si utilizza qualcosa di casuale come un GUID, non ci dovrebbe essere alcuna necessità di cercare attraverso il carico utile per verificare un alias del confine. Qualcosa di simile: -

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

Payload
---- = NextPart_3676416B-9AD6-440C-B3C8- FC66DDC7DB45--

+2

Grazie! La tua risposta è valida quanto la risposta taggata, ma aveva bisogno del rappresentante più di te;) –

+2

questa risposta è migliore poiché un GUID è stato appositamente progettato per essere "globalmente unico". Quando è possibile ottenere un GUID da una riga di codice, perché provare a creare una stringa alquanto casuale? – Keith

12

Per i ragazzi Java:

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(); 

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