2010-01-15 3 views
32

J'écris un script qui télécharge un fichier dans un script cgi qui attend une requête multi-parties, telle qu'un formulaire sur une page HTML. Le boundary est un jeton unique qui annote le contenu du fichier dans le corps de la demande. Voici un exemple de corps:Génération d'une limite multi-parties

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

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

Le boundary ne peut pas être présent dans le contenu du fichier, pour des raisons évidentes.

Que dois-je faire pour créer une limite unique? Dois-je générer une chaîne aléatoire, vérifier si elle est dans le contenu du fichier, et si c'est le cas, générer un nouveau, rincer et répéter, jusqu'à ce que j'ai une chaîne unique? Ou est-ce qu'un "jeton assez aléatoire" (par exemple, une combinaison d'horodatage, d'identifiant de processus, etc.) serait suffisant?

+2

Quel langage de programmation utilisez-vous? Habituellement, une telle chose est gérée par une bibliothèque. –

+0

J'utilise Ruby. Il devrait être dans le stdlib, cependant, ne peut pas utiliser des gemmes puisque le script devrait être exécutable sur n'importe quel système avec ruby ​​installé, sans avoir à installer des gemmes. –

Répondre

0

Si vous vous sentez paranoïaque, vous pouvez générer une limite aléatoire et la rechercher dans la chaîne à envoyer, ajouter un caractère aléatoire sur find. Mais mon expérience est que n'importe quelle chaîne non-dictionnaire arbitraire d'environ 10 caractères est à peu près impossible de se produire, donc choisir quelque chose comme --- BOUNDARY --- BOUNDARY --- BOUNDARY --- est parfaitement suffisant.

+35

Non, ce n'est pas suffisant. Parce que vous ne serez pas en mesure d'envoyer votre code source du programme (ou ce commentaire) en utilisant votre programme. – stepancheg

+4

@stepancheg: Il semble que vous vous sentez paranoïaque, dans ce cas utilisez la solution du premier paragraphe de ma réponse. Si vous êtes en bonne santé mentale, utilisez 'Content-Encoding: gzip' et arrêtez de vous inquiéter des utilisateurs qui essaient de vous trouver. –

+0

Il est de la responsabilité du programmeur d'éviter les erreurs futures prévisibles. – BornToCode

46

Si vous utilisez quelque chose de suffisamment aléatoire comme un GUID, il ne devrait pas être nécessaire de parcourir la charge utile pour vérifier un alias de la frontière. Quelque chose comme: -

---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45
tête: ....

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

+2

Merci! Votre réponse est aussi bonne que la réponse étiquetée, mais il a eu besoin de la représentante plus que vous;) –

+2

cette réponse est meilleure car un GUID est spécifiquement conçu pour être "globalement unique". Quand vous pouvez obtenir un GUID d'une ligne de code, pourquoi essayer de trouver votre propre chaîne quelque peu aléatoire? – Keith

12

Pour Java: les gars

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 de référence: http://hc.apache.org/httpcomponents-client-ga/httpmime/xref/org/apache/http/entity/mime/MultipartEntity.html