Генерация многокомпонентной границы

StackOverflow https://stackoverflow.com/questions/2071257

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

----=Следующая часть_3676416b-9AD6-440C-B3C8-FC66DDC7DB45
Заголовок:....

Полезная нагрузка
----=Следующая часть_3676416b-9AD6-440C-B3C8-FC66DDC7DB45--

Другие советы

Для парней с 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

И для людей 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
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top