我正在開發一個系統,用戶可以在其中上傳“.docx”檔案。驗證它的擴展名是否足以知道這個“.docx”檔案沒有被感染?
這是我上傳的PHP代碼:
<?php
session_start();
include("connection.php");
include("functions.php");
// Just to validate the user
$user_data = check_login($con);
include("connectionPostsDB.php");
if (isset($_POST['submit'])){
$title = $_POST['title'];
$tag = $_POST['tag'];
$description = $_POST['description'];
$file = $_FILES['file'];
$fileName = $_FILES['file']['name'];
$fileTmpName = $_FILES['file']['tmp_name'];
$fileSize = $_FILES['file']['size'];
$fileError = $_FILES['file']['error'];
$fileType = $_FILES['file']['type'];
$fileExt = explode('.', $fileName);
$fileActualExt = strtolower(end($fileExt)); //here I get the actual file's extension (I hope xD)
$allowed = array('docx');
if(in_array($fileActualExt, $allowed)){
if($fileError === 0){
if($fileSize < 1000000){
$fileNameNew = uniqid('', true).".".$fileActualExt;
$fileDestination = '../imgs/posts/'.$fileNameNew;
move_uploaded_file($fileTmpName, $fileDestination);
$query = "INSERT INTO posts (title, descr, imgname, tag)
VALUES ('".$title."','".$description."','".$fileNameNew."','".$tag."')";
mysqli_query($postcon, $query);
echo 'File successfully uploaded';
}
else {
echo 'Your file is too big.';
}
}
else {
echo 'There was an error uploading your file.';
}
}
else {
echo 'This type of file not allowed.';
}
}
那么,我檢查檔案的擴展名是否足以防止某些用戶在我的服務器中放置一些 php 代碼(或者做一些事情從服務器獲取資訊)?
uj5u.com熱心網友回復:
不,僅檢查擴展名是不夠的,但是主要問題是您所說的safe究竟是什么意思。
您顯示的代碼僅將檔案存盤在您的服務器上(在服務器生成的名稱下),然后在資料庫中發布它的存在。這些東西本身都不會是危險的,即使檔案包含黑瘟疫的數字等價物。
但讓我們先退后一步;您的 SQL 查詢非常不安全,盡管這與上傳的檔案無關。您應該仔細閱讀準備好的陳述句,因為當您以這種方式創建查詢時,您的整個站點都對 SQL 注入開放。
現在,回到主題:
至少有兩件事你可以探索,以便對.docx檔案應該是什么變得更加放松。
據我所知,
docx格式實際上只是一個.zip包含一些.xml檔案的檔案。PHP 理解這兩種格式,因此您可以嘗試解壓縮它的內容,查看它是否包含您期望的檔案型別,包括xml(s),然后查看這些 XML 檔案是否可決議。您可以將上傳的檔案提供給病毒掃描程式
這兩種方法都不是完全證明,但它們都會稍微說明情況,讓您(更具體地說,您的演算法)做出更明智的決定。
現在至于我所說的“你所說的安全究竟是什么意思”。您在此處執行的操作(僅重命名和存盤檔案以及將文本寫入資料庫)從根本上來說是非常安全的。
但我想在那個資料庫的另一邊有某人或其他東西讀取同一個資料庫表,并允許某人打開和/或下載該檔案。現在,該操作確實具有很多安全隱患。
現在,如果該資料庫僅通過您的應用程式查看,那么理論上您可以免除所有責任并說“這個檔案是天知道是誰匿名上傳的,把它當作是未知發件人到達您的電子郵件垃圾檔案夾一樣”。但是,如果您承擔任何級別的責任(無論是隱含的還是字面的),您都必須以您認為合適的程度來驗證它。
uj5u.com熱心網友回復:
不,僅僅檢查檔案擴展名是不夠的,因為我們可以將.docx擴展名設定為任何檔案型別。
我們還應該檢查更多的東西,比如:
- 檔案的 MIME 型別是預期的嗎?
- 檔案大小是否足夠合理。例如,如果有人上傳了一個 25 GB 的 docx 檔案,那么即使它是一個有效的 docx 檔案,您的服務器也可能會出現故障。
- 理想情況下,您不應在任何生產服務器中上傳任何檔案,而應在任何存盤提供商(如 AWS 的 s3 存盤桶)中上傳任何檔案。這樣即使該檔案是可執行的,它也不會在您的服務器中執行。它被上傳到一個不同的服務器,該服務器已經過優化以處理檔案。
還有更多這樣的事情需要考慮。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/394706.html
