web-dev-qa-db-ja.com

PHP 5.5から5.6へのアップグレード後にcURLファイルのアップロードが機能しなくなりました

PHP 5.5から5.6へのアップグレード後に失敗するcURLアップロードがあります:

$aPost = array(
    'file' => "@".$localFile,
    'default_file' => 'html_version.html',
    'expiration' => (2*31*24*60*60)
)

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiurl);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_POSTFIELDS, $aPost);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$sResponse = curl_exec ($ch);

ファイルは、ターゲットシステムで空のようです。

26
bardiir

実際、質問を始めている間に答えを見つけました。 PHP 5.5:CURLOPT_SAFE_UPLOADこれは、PHP 5.5でデフォルトでfalseに設定され、PHPでデフォルトのtrueに切り替えられます。 5.6。

これにより、「@」アップロード修飾子がセキュリティ上の理由で機能しなくなります-ユーザー入力に悪意のあるアップロード要求が含まれる可能性があります。 CURLFileクラスを使用してファイルをアップロードできますが、CURLOPT_SAFE_UPLOADtrueに設定されます(または変数が安全であることが確実な場合は、CURLOPT_SAFE_UPLOADからfalseに手動で):

 curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);

正しい方向に私を検索させた情報のソースは次のとおりです。 http://comments.gmane.org/gmane.comp.php.devel/87521

変更された関数にも記載されています: http://php.net/manual/en/migration56.changed-functions.php しかし、後方互換性のない変更ではなく、本当に私をつまずかせました...

40
bardiir

PHP 5.5以降で以下の変更を行うだけです

_"@" . $localFile_の代わりにnew \CURLFile($localFile)を使用してください

そしてセット

_curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
_
29
Deepti Gehlot

ランタイムチェックを含めて、コードが以下のような下位バージョンとも互換性を持つようにします

$aPost = array(
    'default_file' => 'html_version.html',
    'expiration' => (2*31*24*60*60)
)
if ((version_compare(PHP_VERSION, '5.5') >= 0)) {
    $aPost['file'] = new CURLFile($localFile);
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
} else {
    $aPost['file'] = "@".$localFile;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiurl);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_POSTFIELDS, $aPost);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$sResponse = curl_exec ($ch);
9