web-dev-qa-db-ja.com

マルチパート境界を生成しています

HTMLページのフォームなど、マルチパートリクエストを予期するcgiスクリプトにファイルをアップロードするスクリプトを書いています。 boundaryは、リクエストの本文でファイルの内容に注釈を付ける一意のトークンです。本文の例を次に示します。

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

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

明らかな理由により、boundaryをファイルの内容に含めることはできません。

一意の境界を作成するにはどうすればよいですか?ランダムな文字列を生成する必要がありますか?それがファイルの内容に含まれているかどうかを確認し、含まれている場合は、新しい文字列を生成して、一意の文字列になるまで繰り返しますか?または、「かなりランダムなトークン」(たとえば、タイムスタンプ、プロセスIDなどの組み合わせ)で十分でしょうか?

37
August Lilleaas

GUIDのような十分にランダムなものを使用する場合、境界のエイリアスをチェックするためにペイロードを探す必要はありません。

---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45
ヘッダ:....

ペイロード
---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45--

50
AnthonyWJones

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

11
John

そして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
sketchyTech

偏執狂を感じている場合は、ランダムな境界を生成して、送信する文字列でそれを検索し、ランダムな文字を追加(または新規に再作成)して、検索して繰り返します。しかし、私の経験では、10文字程度の辞書以外の任意の文字列は発生しません。そのため、--- BOUNDARY --- BOUNDARY --- BOUNDARY ---のようなものを選択するだけで十分です。

0
SF.