Генерация многокомпонентной границы
-
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 или около того символов практически невозможна, поэтому выбора чего-то вроде ---ГРАНИЦА---ГРАНИЦА---ГРАНИЦА--- вполне достаточно.