HTMLページのフォームなど、マルチパートリクエストを予期するcgiスクリプトにファイルをアップロードするスクリプトを書いています。 boundary
は、リクエストの本文でファイルの内容に注釈を付ける一意のトークンです。本文の例を次に示します。
--BOUNDARY
Content-Disposition: form-data; name="paramname"; filename="foo.txt"
Content-Type: text/plain
... file contents here ...
--BOUNDARY--
明らかな理由により、boundary
をファイルの内容に含めることはできません。
一意の境界を作成するにはどうすればよいですか?ランダムな文字列を生成する必要がありますか?それがファイルの内容に含まれているかどうかを確認し、含まれている場合は、新しい文字列を生成して、一意の文字列になるまで繰り返しますか?または、「かなりランダムなトークン」(たとえば、タイムスタンプ、プロセスIDなどの組み合わせ)で十分でしょうか?
GUIDのような十分にランダムなものを使用する場合、境界のエイリアスをチェックするためにペイロードを探す必要はありません。
---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45
ヘッダ:....
ペイロード
---- = NextPart_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();
そして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文字程度の辞書以外の任意の文字列は発生しません。そのため、--- BOUNDARY --- BOUNDARY --- BOUNDARY ---のようなものを選択するだけで十分です。