filter_input函數用於獲取並過濾PHP 中的輸入數據。其基本用法如下:
<span><span><span class="hljs-title function_ invoke__">filter_input</span></span><span>(type, variable_name, filter = FILTER_DEFAULT, options = </span><span><span class="hljs-literal">null</span></span><span>)
</span></span>
type :指定輸入數據的類型,如INPUT_GET , INPUT_POST , INPUT_COOKIE等。
variable_name :輸入變量的名稱。
filter :應用的過濾器類型,可以是預定義的過濾器常量(例如FILTER_VALIDATE_INT )。
options :用於過濾器的額外選項(可選)。
對於處理用戶上傳文件,通常我們需要通過$_FILES超全局數組來訪問文件上傳相關的字段。而filter_input雖然不是直接作用於文件本身,但它可以用於過濾文件的其他屬性,如文件的大小、類型等。
用戶上傳文件時,通常我們關心文件的類型、大小、名稱等信息。通過filter_input可以對這些信息進行有效的過濾和驗證,從而提高上傳操作的安全性。
文件的MIME 類型是判斷文件是否符合預期的常用方式。我們可以使用filter_input來檢查用戶上傳的文件是否符合特定的類型。以下是一個示例:
<span><span><span class="hljs-variable">$file_type</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filter_input</span></span><span>(INPUT_POST, </span><span><span class="hljs-string">'file_type'</span></span><span>, FILTER_SANITIZE_STRING);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file_type</span></span><span> !== </span><span><span class="hljs-string">'image/jpeg'</span></span><span> && </span><span><span class="hljs-variable">$file_type</span></span><span> !== </span><span><span class="hljs-string">'image/png'</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"不支持的文件類型!"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>
在這個示例中,我們過濾了文件類型,只允許JPEG 和PNG 格式的圖片上傳。 FILTER_SANITIZE_STRING用於移除非法字符,雖然MIME 類型的過濾通常由服務器完成,但這種過濾可以作為額外的保障。
對於用戶上傳的文件大小,我們需要確保文件不超過服務器設定的最大上傳限制。通常,我們通過$_FILES['file']['size']來獲取上傳文件的大小,但也可以通過filter_input來過濾和驗證文件大小。
<span><span><span class="hljs-variable">$file_size</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filter_input</span></span><span>(INPUT_POST, </span><span><span class="hljs-string">'file_size'</span></span><span>, FILTER_VALIDATE_INT);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file_size</span></span><span> > </span><span><span class="hljs-number">1000000</span></span><span>) { </span><span><span class="hljs-comment">// 限制最大文件大小為1MB</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件太大,不能上傳!"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>
在此代碼中, FILTER_VALIDATE_INT被用來驗證文件的大小是否為整數值。如果文件的大小超過了設定的最大值(如1MB),則輸出提示信息並終止程序。
文件上傳是Web 開發中的一個敏感操作,若不進行有效的驗證和過濾,可能會導致安全漏洞(如上傳惡意文件、覆蓋現有文件等)。 filter_input函數在以下幾個方面能夠增強上傳過程的安全性:
使用filter_input過濾用戶提交的文件類型和文件大小,可以避免一些常見的安全風險。例如,防止用戶上傳超大文件或不符合預期的文件類型(如腳本文件)。
<span><span><span class="hljs-variable">$file_type</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filter_input</span></span><span>(INPUT_POST, </span><span><span class="hljs-string">'file_type'</span></span><span>, FILTER_SANITIZE_STRING);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$file_type</span></span><span>, [</span><span><span class="hljs-string">'image/jpeg'</span></span><span>, </span><span><span class="hljs-string">'image/png'</span></span><span>])) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"非法文件類型!"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>
通過filter_input還可以過濾文件的原始文件名,避免文件名中包含惡意字符,減少文件名註入攻擊的風險。
<span><span><span class="hljs-variable">$file_name</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filter_input</span></span><span>(INPUT_POST, </span><span><span class="hljs-string">'file_name'</span></span><span>, FILTER_SANITIZE_STRING);
</span><span><span class="hljs-variable">$file_name</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/[^a-zA-Z0-9_\-\.]/'</span></span><span>, </span><span><span class="hljs-string">'_'</span></span><span>, </span><span><span class="hljs-variable">$file_name</span></span><span>);
</span></span>
在這個例子中,我們使用正則表達式替換文件名中的非法字符,確保上傳的文件名符合預期格式,防止特殊字符可能引發的安全問題。
上傳文件時,若不進行有效的檢查,用戶有可能上傳一個與服務器上已有文件同名的文件,導致原有文件被覆蓋。為避免這種情況,我們可以在文件上傳時通過filter_input函數過濾和校驗文件名。
<span><span><span class="hljs-variable">$file_name</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filter_input</span></span><span>(INPUT_POST, </span><span><span class="hljs-string">'file_name'</span></span><span>, FILTER_SANITIZE_STRING);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-string">"/uploads/<span class="hljs-subst">$file_name</span></span></span><span>")) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件已存在,請更換文件名!"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>
此代碼通過檢查上傳文件的路徑是否已經存在相同的文件名,從而避免了文件覆蓋的風險。
下面是一個簡單的文件上傳處理程序示例,它結合了filter_input函數,展示瞭如何過濾和驗證用戶上傳的文件。
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$_SERVER</span></span><span>[</span><span><span class="hljs-string">'REQUEST_METHOD'</span></span><span>] == </span><span><span class="hljs-string">'POST'</span></span><span>) {
</span><span><span class="hljs-variable">$file_type</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filter_input</span></span><span>(INPUT_POST, </span><span><span class="hljs-string">'file_type'</span></span><span>, FILTER_SANITIZE_STRING);
</span><span><span class="hljs-variable">$file_size</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filter_input</span></span><span>(INPUT_POST, </span><span><span class="hljs-string">'file_size'</span></span><span>, FILTER_VALIDATE_INT);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file_size</span></span><span> > </span><span><span class="hljs-number">1000000</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件大小超過限制!"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$file_type</span></span><span>, [</span><span><span class="hljs-string">'image/jpeg'</span></span><span>, </span><span><span class="hljs-string">'image/png'</span></span><span>])) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"不支持的文件類型!"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-variable">$file_name</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filter_input</span></span><span>(INPUT_POST, </span><span><span class="hljs-string">'file_name'</span></span><span>, FILTER_SANITIZE_STRING);
</span><span><span class="hljs-variable">$file_name</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/[^a-zA-Z0-9_\-\.]/'</span></span><span>, </span><span><span class="hljs-string">'_'</span></span><span>, </span><span><span class="hljs-variable">$file_name</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-string">"/uploads/<span class="hljs-subst">$file_name</span></span></span><span>")) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件已存在,請更換文件名!"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-title function_ invoke__">move_uploaded_file</span></span><span>(</span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'tmp_name'</span></span><span>], </span><span><span class="hljs-string">"/uploads/<span class="hljs-subst">$file_name</span></span></span><span>");
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件上傳成功!"</span></span><span>;
}
</span></span>
filter_input函數在PHP 中用於從請求中獲取和過濾數據,雖然它主要用於處理GET、POST 等常規請求的數據,但它同樣可以用於處理用戶上傳文件時的相關信息。通過合適的過濾和驗證,可以有效增強文件上傳操作的安全性,避免常見的安全問題如惡意文件上傳、文件覆蓋、非法文件類型等。在實際應用中, filter_input作為一種輔助工具,能夠幫助開發者編寫更加安全和可靠的文件上傳功能。