1

PHP と CURL を介してサーバーに multipart/form-data ポスト リクエストを送信できるようにする必要があります。

以下のような通常の変数を送信するだけでなく、正しいコンテンツ タイプを取得することもできます。

------------------------------2f860b21c344
Content-Disposition: form-data; name="contactId"

8
------------------------------2f860b21c344
Content-Disposition: form-data; name="wt"

00:00:00
------------------------------2f860b21c344

この問題は、次のセクションで発生します。

-----------------------------221901842288
Content-Disposition: form-data; name="attchmnt[0]"; filename=""
Content-Type: application/octet-stream


-----------------------------221901842288

私が得た最も近いものはこれです:

------------------------------2f860b21c344
Content-Disposition: form-data; name="attchmnt[0]"

filename="";type=application/octet-stream
------------------------------2f860b21c344

マルチパート ヘッダーが必要なため、POST データに配列を使用しています。そのため、CURL コードが 100% 機能している限り、機能していないのはこの配列だけです。以下は、完全な DataArray です。

<?PHP
$dataArray = array(
'tid' => '',
'parentId' => '',
'contactId' => '8',
'wt' => '00:00:00',
'ts' => 'OFF',
'smtl' => '',
'ctctCombo' => 'John Hawkins',
'contact' => '8',
'location' => '16',
'priority' => '-2',
'group' => '1',
'status' => '2',
'category' => '5',
'categoryOption' => '8',
'estimatedDate' => '',
'assignedTo' => '16',
'asset' => '',
'zenAsset' => '',
'cf_20_new' => '512',
'subject' => 'Subject',
'cc' => '',
'bc' => '',
'note' => 'Message',
'attchmnt[0]' => 'filename="";type=application/octet-stream',
'notifyTech' => 'on',
'_notifyTech' => '',
'_notifyUser' => ''
);
?>

問題は、CURL で name="attchmnt[0]"; と同じ行に 'filename="";type=application/octet-stream' を追加するにはどうすればよいかということです。?

ファイルをアップロードできれば簡単ですが、ファイルがアップロードされていないだけのファイルストリームであることを指定する必要があります。

4

1 に答える 1

2

これを行うためのクリーンな方法はありません、私は恐れています。@構文を使用して、既存のファイルをアップロードできます(cURLは、で指定octet-streamしたファイル名を指定し、使用します。ただし、その方法でのファイル名をfilename指定することはできません。

あなたはこれを行うことができます...あなた自身のコードに対する複数行のインジェクション攻撃。cURLは気にしないようですが、それが設計によるものなのか、汚い行為を行えるようにするためなのか、それとも偶然であり、次のリリースで機能しなくなる可能性があるのか​​はわかりません。

$dataArray['attchmnt[0]"; filename=""'."\r\n".'Content-Type: octet-stream'] = '';

これは次のように解釈されます。

    0x0a30:  2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d  ----------------
    0x0a40:  2d2d 2d2d 2d2d 2d2d 2d2d 2d33 6331 3837  -----------3c187
    0x0a50:  3162 6630 3132 360d 0a43 6f6e 7465 6e74  1bf0126..Content
    0x0a60:  2d44 6973 706f 7369 7469 6f6e 3a20 666f  -Disposition:.fo
    0x0a70:  726d 2d64 6174 613b 206e 616d 653d 2261  rm-data;.name="a
    0x0a80:  7474 6368 6d6e 745b 305d 223b 2066 696c  ttchmnt[0]";.fil
    0x0a90:  656e 616d 653d 2222 0d0a 436f 6e74 656e  ename=""..Conten
    0x0aa0:  742d 5479 7065 3a20 6f63 7465 742d 7374  t-Type:.octet-st
    0x0ab0:  7265 616d 220d 0a0d 0a0d 0a2d 2d2d 2d2d  ream"......-----
    0x0ac0:  2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d  ----------------
    0x0ad0:  2d2d 2d2d 2d2d 2d2d 2d33 6331 3837 3162  ---------3c1871b
    0x0ae0:  6630 3132 362d 2d0d 0a                   f0126--..

それはあなたが求めているものでなければなりません。

テスト

// $dataArray as defined by you

// Change the 'attchmnt[0]' entry
$dataArray['attchmnt[0]"; filename=""'."\r\n".'Content-Type: octet-stream'] = '';

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER,         False);
curl_setopt($ch, CURLOPT_VERBOSE,        False);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
curl_setopt($ch, CURLOPT_URL,            'http://127.0.0.1/');
curl_setopt($ch, CURLOPT_POST,           True);
curl_setopt($ch, CURLOPT_POSTFIELDS,     $dataArray);
curl_exec($ch);
于 2012-10-29T13:49:23.127 に答える