新人在這裏問一個問題,應該遇到什麼簡單的解決方案。驗證文件上傳服務器端 - 只允許圖像與php
我試了一堆代碼。看起來我可以獲取getimagesize的文件流並讓其他東西在不崩潰的情況下運行。
我正在打掃一箇舊的項目,需要限制上傳的文件,使他們只有圖像文件,沒有什麼邪惡的。
此代碼總是給我一個錯誤消息不管是什麼
$imageinfo = getimagesize($_FILES['bf_file'][$key]['tmp_name']);
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') {
alert ("Sorry, we only accept GIF and JPEG images");
exit;
}
這裏是黑名單努力
$blacklist = array(".php", ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py"
,".txt", ".doc");
foreach ($blacklist as $file)
{
if(preg_match("/$file\$/i", $_FILES['bf_file'][$key]['tmp_name']))
{
alert "ERROR: Uploading executable files Not Allowed\n";
exit();
}
}
這裏是另一個和getimagesize
$size = getimagesize($_FILES[bf_file][$key][tmp_name]);
$fp = fopen($_FILES[bf_file][$key][tmp_name], "rb");
if ($size && $fp) {
header("Content-type: {$size['mime']}");
fpassthru($fp);
continue;
} else
// error
alert("Inappropriate file type");
關於這些無論文件是否上傳,我都會收到錯誤消息。
我只需要將這些控件放置在我的文件的某個位置,以便如果上傳的文件通過檢查,則所有內容都會作爲上傳器傳遞,其他所有內容都可以正常工作,但不具備這些限制器和檢查的好處。
此外,用戶不應該被要求上傳文件。有3個字段,主題,正文和文件上傳。只有主體和身體需要有數據並且現在可以工作。
任何幫助將不勝感激。
感謝,
詹姆斯
'$ key'的值是什麼?無論它包含什麼內容,由於很久以前某些PHP作者的某些*高級*愚蠢,您需要引用'$ _FILES ['bf_file'] ['tmp_name'] [$ key]'而不是$ _FILES ['bf_file'] [$ key] ['tmp_name']'。另外請注意,'getimagesize()'是唯一明智的方法,我甚至無法在評論給我的少量空間中解釋你的黑名單方法是錯誤的。 – DaveRandom 2012-04-24 15:39:07
這裏有一個:你的preg_match不是多行的,所以很容易受到空白的攻擊。使用白名單的原因之一,而不是黑名單。另外,您確實需要從圖像畫布中複製像素數據,但如果您僅保存文件,則容易受到惡意用戶上載包含嵌入式服務器端腳本的圖像文件的影響。 – Cheekysoft 2012-04-24 16:10:29
@Cheekysoft,還有'index.php5'(它可能存在)和'index.php.fr'([content negotiation](http://httpd.apache.org/docs/current/content-negotiation.html) ) – xfix 2012-04-24 16:14:43