生成多部分边界

问题描述 投票:0回答:4

我正在编写一个脚本,将文件上传到需要多部分请求的 cgi 脚本,例如 HTML 页面上的表单。

boundary
是一个唯一标记,用于注释请求正文中的文件内容。这是一个示例正文:

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

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

由于显而易见的原因,

boundary
不能出现在文件内容中。

我应该怎么做才能创建一个独特的边界?我是否应该生成一个随机字符串,检查它是否在文件内容中,如果是,则生成一个新的,冲洗并重复,直到我有一个唯一的字符串?或者“相当随机的令牌”(例如,时间戳、进程 ID 等的组合)就足够了吗?

multipart
4个回答
56
投票

如果您使用足够随机的东西(例如 GUID),则不需要搜索有效负载来检查边界的别名。像这样的东西:-

----=NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45
标题:....

有效负载
-==NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45--


14
投票

对于 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();

参考网址:https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/MultipartEntityBuilder.java#L234


1
投票

对于 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
}

1
投票

如果您感到偏执,您可以生成一个随机边界并在要发送的字符串中搜索它,在查找时附加随机字符(或重新创建新字符),重复。但我的经验是任何 10 个左右字符的任意非字典字符串几乎不可能出现,因此选择类似 ---BOUNDARY---BOUNDARY---BOUNDARY--- 的东西就完全足够了。

© www.soinside.com 2019 - 2024. All rights reserved.