0

box.net へのファイルのアップロードに取り組んでいます。Curlを使用してファイルを送信していますが、

しかし、私が直面している問題は、選択したファイルをアップロードせず、代わりに .tmp ファイルをアップロードすることです。

以下は私のコードです:

<?php
$upload_url = 'Server-Url';

$tmpfile = $_FILES['new_file1']['tmp_name'];
$_POST['new_file1'] = '@'.$tmpfile;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $upload_url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST); 

$response = curl_exec($ch);
curl_close($ch);
echo $response;     
?>


<form action=""
  enctype="multipart/form-data" accept-charset="utf-8" method="POST">
<input type="file" name="new_file1" />
<input type="text" name="share" value="1" />
<input type="submit" name="upload_files" value="Upload File" />
</form>

私は何か間違ったことをしていますか?この問題を解決するために誰か助けてください。

4

2 に答える 2

1

私が見た限りでは、curl は 1 つのファイルを選択することを提案していませんが、アップロード中に別の名前を送信しています。この柔軟性を実現するために HTTP 要求全体を自分で作成したくない場合を除き、ディスク上のファイルの名前を正しい名前に変更する必要があります。ただし、ファイルの名前を任意のユーザー提供の名前に変更することは、常に大きなセキュリティ リスクになります。以下では、一意の一時ディレクトリを作成し、ファイルがそのディレクトリに移動されることを再確認して、パス インジェクション攻撃を回避し、他のファイルを上書きしないようにしています。私が考えていないより多くの攻撃ベクトルがあるかもしれませんし、ないかもしれません!

do {
    $tmpDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid('upload');
} while (file_exists($tmpDir));
$uploadFile = realpath($tmpDir . DIRECTORY_SEPARATOR . basename($_FILES['new_file1']['name']));

if (strpos($uploadFile, $tmpDir) !== 0) {
    trigger_error('File path not within expected directory', E_USER_ERROR);
    exit;
}

mkdir($tmpDir, 0600);
move_uploaded_file($_FILES['new_file1']['tmp_name'], $uploadFile);

...
curl_setopt($ch, CURLOPT_POSTFIELDS, array('file' => "@$uploadFile"));
...

unlink($uploadFile);
rmdir($tmpDir);
于 2012-12-09T10:04:40.560 に答える
1

tmp_name一時的な名前が含まれているはずです。実際のファイル名はname要素にあります。マニュアルを参照してください。

ただし、あなたが持っているコードでname要素を使用すると、攻撃者がスクリプトにサーバーからローカル ファイルをアップロードさせる可能性があるため、コードに大きな脆弱性が生じます。move_uploaded_file()それを防ぐために使い ます。

于 2012-12-08T18:08:47.733 に答える