4

multipart/form-data コンテンツ タイプを使用してファイルを投稿しようとしていますが、次の質問がありました:
ファイルのコンテンツを書き込むときに CRLF をエスケープすべきではありませんか? Web でコードを入手しましたが、間違っている可能性があります。

NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: url];
[req setHTTPMethod: @"POST"];

NSString* contentType = @"multipart/form-data, boundary=AaB03x";
[req setValue:contentType forHTTPHeaderField: @"Content-type"];

NSData* boundary = [@"\r\n--AaB03x\r\n" dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *postBody = [NSMutableData data];
[postBody appendData: boundary];
[postBody appendData: [@"Content-Disposition: form-data; name=\"datafile\"; filename=\"t.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData: [@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData: imageData];
[postBody appendData: boundary];
[req setHTTPBody:postBody];

imageData には \r\n シーケンスが含まれている可能性があるため、これは間違っていますよね? もしそうなら、生データで CRLF をエスケープする方法はありますか? または、何か不足していますか?

前もって感謝します!

4

2 に答える 2

3

これは興味深い質問です。マルチパート メディア タイプ RFCを見ると、カプセル化されたデータに境界が表示されないようにするのは構成エージェント次第であるように見えます。さらに、次のように述べています。

注: カプセル化されるボディ パーツに境界区切り文字が表示されてはならないため、ユーザー エージェントは、一意の境界パラメーター値を選択するように注意する必要があります。上記の例の境界パラメーター値は、データを事前にスキャンしなくても、カプセル化されるデータに既に存在する可能性が非常に低い境界区切り文字を生成するように設計されたアルゴリズムの結果である可能性があります。

これは、カプセル化されたデータに境界値が表示されないようにするために、境界値のデータをスキャンする必要があることを意味すると解釈します。ほとんどの場合、これは容認できないほどコストのかかる操作であるため、ユーザー エージェントは、データ内で発生する可能性が非常に低い値を単純に選択することが予想されます。

あなたの例の境界がランダムなバイト文字列で発生する確率を考えてみましょう(議論のために、JPEG画像を表すと仮定します)。画像データを早期に終了するために一致させる必要がある完全な文字列は、"\r\n--AaB03x" - 10 バイトまたは 80 ビットになります。どのビットから始めても、次の 10 バイトがそのシーケンスである確率は 2^80 分の 1 です。1MB の JPEG ファイルには、2^23 ビットがあります。これは、シーケンスを含む JPEG ファイルの可能性が 2^23/2^80 未満、つまり 2^57 分の 1 (100 京以上) であることを意味します。

したがって、答えは、100% 確実にするには、境界シーケンスのデータを確認し、その境界シーケンスがデータに存在する場合は別のものを使用する必要があるということだと思います。しかし実際には、境界シーケンスが発生する可能性は十分に小さいため、価値はありません。

于 2011-01-21T19:04:03.083 に答える
0

RFC2046\r\nに記載されているように、末尾が境界の一部であってはならないため、技術的には間違っています。末尾は の一部である必要がありますが、実際には、とにかく境界の後に配置するので問題になりません。\r\ntransport-padding

また、サブシーケンスではなく、シーケンス全体を回避する必要があると考えています。

于 2018-06-28T05:55:43.867 に答える