web-dev-qa-db-fra.com

Génération d'une limite en plusieurs parties

J'écris un script qui télécharge un fichier dans un script cgi qui attend une demande en plusieurs parties, telle qu'un formulaire sur une page HTML. boundary est un jeton unique qui annote le contenu du fichier dans le corps de la demande. Voici un exemple de corps:

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

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

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

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

35
August Lilleaas

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 (ou recréer une nouvelle) à la recherche, répétez. Mais, selon mon expérience, il est pratiquement impossible de trouver une chaîne arbitraire non-dictionnaire de 10 caractères environ, donc choisir quelque chose comme --- BOUNDARY --- BOUNDARY --- BOUNDARY --- est parfaitement suffisant.

0
SF.

Si vous utilisez quelque chose d'assez aléatoire, comme un GUID, il ne devrait pas être nécessaire de rechercher la charge utile pour rechercher un alias de la limite. Quelque chose comme:-

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

Charge utile
---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45--

49
AnthonyWJones

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

12
John

Et pour le peuple Swift (pour équilibrer le Java):

func createBoundaryString() -> String {
    var str = ""
    let length = arc4random_uniform(11) + 30
    let charSet = [Character]("-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

    for _ in 0..<length {
        str.append(charSet[Int(arc4random_uniform(UInt32(charSet.count)))])
    }
    return str
}
0
sketchyTech