[英]php if statement not failing as part of ajax call
我有一個從javascript調用的php文件,目的是將文件上傳到我的服務器。
澄清一下,即時通訊正在用ajax調用此php文件,因此據我了解,它不是以傳統的方式運行,這就是為什么我不使用$ _FILE和$ _POST的原因,因為該項目的重點是處理fileupload /無需重新加載頁面即可完成用戶數據的收集。
顯然,我們需要某種服務器端文件驗證,這是我在if語句中設置的。
但是,無論我選擇哪種文件類型,代碼都會成功執行並繼續進行上傳。
有人可以告訴我什么地方出了錯/或指導我朝正確的方向前進嗎?
<?php
session_start();
$name = $_SESSION['name'];
$email = $_SESSION['email'];
$phone = $_SESSION['phone'];
$date = date('Y-m-d');
$mypath = $name . '-' . $phone . '-' . $date;
$ext = $_SERVER['HTTP_X_FILE_TYPE'];
$allow = array('psd', 'ai', 'eps', 'svg', 'jpg', 'png', 'docx', 'doc', 'pptx', 'ppt');
if(!in_array($ext,$allow)){
if(!file_exists($mypath)) {
mkdir($mypath,0777,TRUE);
}
$str = file_get_contents('php://input');
$title = $_SERVER['HTTP_X_FILE_NAME'];
$path = "$mypath/".$title;
file_put_contents($path,$str);
}else{
return false;
}
?>
非常感激-B先生
代碼的問題是(就像注釋中提到的@Cashbee),是代碼的if(!in_array($ext,$allow))
部分。 如果文件擴展名不在 $allow
數組中,則此部分允許上傳文件。 正確的代碼應如下所示。
<?php
session_start();
$name = $_SESSION['name'];
$email = $_SESSION['email'];
$phone = $_SESSION['phone'];
$date = date('Y-m-d');
$mypath = $name . '-' . $phone . '-' . $date;
$ext = $_SERVER['HTTP_X_FILE_TYPE'];
$allow = array('psd', 'ai', 'eps', 'svg', 'jpg', 'png', 'docx', 'doc', 'pptx', 'ppt');
if(in_array($ext,$allow)){
if(!file_exists($mypath)) {
mkdir($mypath,0777,TRUE);
}
$str = file_get_contents('php://input');
$title = $_SERVER['HTTP_X_FILE_NAME'];
$path = "$mypath/".$title;
file_put_contents($path,$str);
}else{
exit;
}
?>
重要說明:請記住,基於瀏覽器的javascript命令設置的標頭信任擴展名的風險很高,因此不應被信任。 如果需要這樣做,您必須將這些文件存儲在無法通過網絡訪問/從網絡訪問的文件夾中,並根據請求使用正確的mime標頭將其原始提供,或者在上傳時檢查多個文件擴展名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.