PHP檔案上傳處理邏輯大梳理(全面分析)

藏色散人
發布: 2023-04-11 08:38:02
轉載
3188 人瀏覽過

本文跟大家介紹有關PHP檔案上傳的邏輯實現分析,想必這種實現在專案中都比較常見的,大家一起來看看吧~希望對需要的朋友有所幫助~

#檔案名稱處理

檔案名稱得看業務要求。不需要保留原始名字,則隨機產生名字,拼接上白名單校驗過的字尾即可。 【推薦學習:PHP影片教學

反之要謹慎處理:

//允许上传的后缀白名单
$extension_white_list = ['jpg', 'pdf'];
//原始文件的名字
$origin_file_name = 'xx/xxx/10月CPI同比上涨2.1%.php.pdf';
//提取文件后缀,并校验是否在白名单内
$extension = strtolower(pathinfo($origin_file_name, PATHINFO_EXTENSION));
if (!in_array($extension, $extension_white_list)) {
    die('错误的文件类型');
}
//提取文件名
$new_file_name = pathinfo($origin_file_name, PATHINFO_BASENAME);
//截取掉后缀部分
$new_file_name = mb_substr($new_file_name, 0, mb_strlen($new_file_name) - 1 - mb_strlen($extension));
//只保留有限长度的名字
$new_file_name = mb_substr($new_file_name, 0, 20);
//替换掉所有的 . 避免攻击者构造多后缀的文件,缺点是文件名不能包含 .
$new_file_name = str_replace('.', '_', $new_file_name);
//把处理过的名字和后缀拼接起来构造成一个名字
$new_file_name = $new_file_name . '.' . $extension;
print_r($new_file_name); //10月CPI同比上涨2_1%_php.pdf
登入後複製

檔案內容處理

檔案後綴只是表面,一個php 文件,把後綴改成jpg,也改變不了它攜帶php 程式碼的事實。

針對圖片文件,可以讀取圖片文件頭判斷圖片類型,當然我也沒測試過這個方法,有興趣的可以自測。

另外即使上述方法可行,依然可以繞過,只要在 php 檔案的頭部寫入某個圖片類型的頭部特徵的位元組即可偽裝。

針對圖片檔案內容處理,真正的大招是重繪圖圖。

windows 系統下用copy 指令可以製作一個包含php 程式碼的圖片文件,指令如下:

Copy 1.jpg/b + test.php/a 2.jpg
登入後複製

上述指令的意思是,把test.php 合併到1.jpg 的尾部,並重新匯出到2.jpg 裡面,如此一來,這個2.jpg 就是一個包含php 程式碼的圖片文件,可以用記事本打開它,拖滾動條到底部看到php 程式碼。

像是這種不乾淨的圖片,用重繪圖的方式可以剔除不乾淨的部分。以下是重繪圖的 php 程式碼:

try {
    $jpg = '包含php代码的.jpg';
    list($width, $height) = getimagesize($jpg);
    $im = imagecreatetruecolor($width, $height);
    $image = imagecreatefromjpeg($jpg);
    imagecopyresampled($im, $image, 0, 0, 0, 0, $width, $height, $width, $height);
    $target = '重绘后干净的图片.jpg';
    imagejpeg($image, $target);
} finally {
    isset($im) && is_resource($im) && imagedestroy($im);
    isset($image) && is_resource($image) && imagedestroy($image);
}
登入後複製

這個處理辦法的缺點是,耗費內存,圖片失真,而且只能處理圖片。

當然其它的檔案格式,我也不知道能不能用重繪的思路去處理。

檔案權限處理

只討論Linux 下的權限,先簡單介紹Linux 的權限:

读取,字母 r 或数字 4 表示
写入,字母 w 或数字 2 表示
执行,字母 x 或数字 1 表示
登入後複製

對檔案來講,rwx 是如下意義:

r:可打开读取此文件
w:可写入此文件
x:可执行此文件
登入後複製

對目錄來講,rwx 的含義又有點差別:

r:可读取此目录的内容列表
w:可在此目录里面进行:增、删、改文件和子目录
x:可进入此目录
登入後複製

另外Linux 裡面,針對一個文件,用戶是會被分成三種,分別是:創建該文件的使用者、和創建該檔案的使用者處於同一使用者群組的使用者、既不是創建者也不是同一個群組的其它使用者。

有了對Linux 的權限了解,針對上傳的檔案所在的目錄,應該設定755 權限,表示:

  • 建立該目錄的使用者有讀取、寫入、進入此目錄的權限

  • 和建立該目錄的使用者處於同一使用者群組的使用者有讀取、進入此目錄的權限

  • #既不是創建者也不是同一個小組的其它用戶有讀取、進入此目錄的權限

#755 的權限設定,可以讓nginx 代理靜態文件的時候不會報403 錯誤。

程式碼範例:

mkdir($save_path, 0755, true);
登入後複製

針對上傳的文件,採用更嚴格的權限設定,應該設定644 權限,表示:

  • 創建該檔案的使用者有讀取、寫入此檔案的權限,無法執行

  • 和建立該檔案的使用者處於同一使用者群組的使用者只有讀取權限

  • #既不是創建者也不是同一個小組的其它用戶只有讀取權限

644 的權限設定,可以確保即便是上傳了一個非法文件也無法串改內容、執行。

程式碼範例:

chmod($file, 0644);
登入後複製

檔案伺服器處理

#掏錢買個oss 儲存服務吧,啥雞毛都不考慮了,直接丟上去。

原文網址:https://learnku.com/articles/73100
作者部落格:https://learnku.com/blog/buexplain

以上是PHP檔案上傳處理邏輯大梳理(全面分析)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!