2012-08-11 31 views
5

我在這裏有一個小問題,我怎麼能告訴cURL專門將一個文件附加到請求?使用cURL上傳不帶@符號的文件?

如果我上傳與捲曲的文件時,則常用的方法是將其附加與具有@在它前面的值,例如POST數據陣列的一部分:

CURLOPT_POSTFIELDS=>array('my-file'=>'@my-file.txt') 

這顯然的工作,但我有兩個問題是:如果

  • 它實際上不是我上傳的文件?如果我的POST值實際上是'@ my-file.txt'並且它試圖上傳文件呢?它造成了我拼命試圖避免的漏洞。
  • 如何從URL上傳文件?我是否需要下載它,將它存儲在臨時文件夾中,然後用@從該臨時文件夾中附加它?爲什麼我不能提供cURL只是我希望用作文件的內容?

cURL CURLOPT_INFILE不是一個選項,因爲它不會顯示爲$ _FILES數組的一部分。

看起來這樣的漏洞在cURL中依賴於POST字段值中的@符號。有沒有辦法解決它?爲什麼沒有CURLOPT_FILEFIELDS數組?命令行cURL對此有一個單獨的標誌(-F),但是由於某種原因,我沒有在PHP中看到它作爲一個選項。

任何幫助將不勝感激,謝謝!

+1

重新發現漏洞,這似乎是不可修復的:https://bugs.php.net/bug.php?id=46439檢查輸入值時,您必須手動檢查是否存在「@」。 – 2012-08-11 09:39:39

+0

也許['http_build_query'](http://php.net/http_build_query),在[這個答案](http://stackoverflow.com/a/648296/773625)? – mAu 2012-08-11 09:39:51

+0

謝謝佩卡,我只希望有一個解決方案。但是mAu:這不起作用,因爲我的API也需要支持文件上傳。如果可以從POST字段中單獨提交文件,並且我需要在POST中提交一些數據(因爲GET的限制不在POST中),那麼一切都會好起來的。 – kingmaple 2012-08-11 10:10:02

回答

1

我最終所做的是檢測是否有任何輸入數據以@符號開頭,如果他們這樣做,然後將它們作爲GET變量(作爲cURL中提交URL的一部分)提交。這對所有情況都沒有幫助(例如,當提交的字符串以@開頭時),但是刪除了我用Twitter處理過的問題。