Генерация составной границы - PullRequest
36 голосов
/ 15 января 2010

Я пишу скрипт, который загружает файл в скрипт cgi, который ожидает многоэлементный запрос, такой как форма на странице HTML. boundary - это уникальный токен, который аннотирует содержимое файла в теле запроса. Вот пример тела:

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

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

boundary не может присутствовать в содержимом файла по понятным причинам.

Что я должен сделать, чтобы создать уникальную границу? Должен ли я генерировать случайную строку, проверить, находится ли она в содержимом файла, и, если она есть, сгенерировать новую, промыть и повторить, пока у меня не будет уникальной строки? Или будет достаточно «довольно случайного токена» (скажем, комбинации меток времени, идентификатора процесса и т. Д.)?

Ответы [ 4 ]

50 голосов
/ 15 января 2010

Если вы используете что-то достаточно случайное, например, GUID, не нужно искать через полезную нагрузку, чтобы проверить псевдоним границы. Что-то вроде: -

---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45
Заголовок: ....

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

12 голосов
/ 16 апреля 2011

Для 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: http://hc.apache.org/httpcomponents-client-ga/httpmime/xref/org/apache/http/entity/mime/MultipartEntity.html

0 голосов
/ 29 марта 2018

И для людей Swift (чтобы сбалансировать 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 голосов
/ 15 января 2010

Если вы чувствуете себя параноиком, вы можете сгенерировать случайную границу и найти ее в строке для отправки, добавить случайный символ (или заново создать новый) при поиске, повторите. Но по моему опыту любая произвольная строка из словаря, состоящая из 10 или более символов, практически невозможна, поэтому вполне достаточно выбрать что-то вроде --- BOUNDARY --- BOUNDARY --- BOUNDARY ---.

...