<span id="pfnzv"></span>
      <form id="pfnzv"><span id="pfnzv"></span></form><address id="pfnzv"><span id="pfnzv"><nobr id="pfnzv"></nobr></span></address>
      <form id="pfnzv"><dfn id="pfnzv"><listing id="pfnzv"></listing></dfn></form>

        <sub id="pfnzv"><address id="pfnzv"></address></sub>
          <address id="pfnzv"><form id="pfnzv"><listing id="pfnzv"></listing></form></address>
          <address id="pfnzv"><address id="pfnzv"><nobr id="pfnzv"></nobr></address></address>

            <address id="pfnzv"></address>
            0712-2888027 189-8648-0214
            微信公眾號

            孝感風信網絡科技有限公司微信公眾號

            當前位置:主頁 > 技術支持 > PHP > 如何防范用戶通過上傳功能,上傳PHP可執行文件

            如何防范用戶通過上傳功能,上傳PHP可執行文件

            時間:2024-06-06來源:風信官網 點擊: 730次
            在實際的項目開發過程中,我們常常用提供表單之類的文件上傳功能,在laravel社區看到一篇關于PHP 安全的指南,講述如何防范用戶上傳 PHP 可執行文件。

            上傳文件往往在處理不當的情況下,確實會帶來比較大的安全風險,特別是用戶偽造信息,通過一些特殊請求讓上傳php可執行文件,從而引發網站的安全問題。

            那么如何有效的防止用戶上傳php可執行文件呢?筆者摘錄了該問題的解決方法,供大家參考:

            為了解決這個問題,PHP中內置了一些特殊函數方法,只是為了在這種情況下使用。

            basename()

            第一個解決方案?---?basename() 它從路徑結束時提取路徑的一部分,直到它遇到第一個斜杠,但忽略字符串末尾的斜杠,參見示例。無論如何,你會收到一個安全的文件名。如果你覺得安全 - 那么是的這很安全。如果它被不法上傳利用 - 你可以使用它來校驗文件名是否安全。

            realpath()

            另一個解決方案?---?realpath()它將上傳文件路徑轉換規范化的絕對路徑名,從根開始,并且根本不包含任何不安全因素。它甚至會將符號鏈接轉換為此符號鏈接指向的路徑。

            因此,您可以使用這兩個函數來檢查上傳文件的路徑。要檢查這個文件路徑到底是否真正屬于此文件夾路徑。

            函數代碼

            編寫了一個函數來提供如上的檢查。我并不是專家,所以風險請自行承擔。代碼如下。

            <?php
            /**
             * Example for the article at medium.com
             * Created by Igor Data.
             * User: igordata
             * Date: 2017-01-23
             * @link https://medium.com/@igordata/php-running-jpg-as-php-or-how-to-prevent-execution-of-user-uploaded-files-6ff021897389 Read the article
             */
            /**
             * 檢查某個路徑是否在指定文件夾內。若為真,返回此路徑,否則返回 false。
             * @param String $path 被檢查的路徑
             * @param String $folder 文件夾的路徑,$path 必須在此文件夾內
             * @return bool|string 失敗返回 false,成功返回 $path
             *
             */
            function checkPathIsInFolder($path, $folder) {
                    if ($path === '' OR $path === null OR $path === false OR $folder === '' OR $folder === null OR $folder === false) {
                        /* 不能使用 empty() 因為有可能像 "0" 這樣的字符串也是有效的路徑 */
                    return false;
                }
                $folderRealpath = realpath($folder);
                $pathRealpath = realpath($path);
                if ($pathRealpath === false OR $folderRealpath === false) {
                    // Some of paths is empty
                    return false;
                }
                $folderRealpath = rtrim($folderRealpath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
                $pathRealpath = rtrim($pathRealpath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
                if (strlen($pathRealpath) < strlen($folderRealpath)) {
                    // 文件路徑比文件夾路徑短,那么這個文件不可能在此文件夾內。
                    return false;
                }
                if (substr($pathRealpath, 0, strlen($folderRealpath)) !== $folderRealpath) {
                    // 文件夾的路徑不等于它必須位于的文件夾的路徑。
                    return false;
                }
                // OK
                return $path;
            }
            

            結語

            必須過濾用戶輸入,文件名也屬于用戶輸入,所以一定要檢查文件名。記得使用 basename() 。
            必須檢查你想存放用戶文件的路徑,永遠不要將這個路徑和應用目錄混合在一起。文件路徑必須由某個文件夾的字符串路徑,以及 basename($filename) 組成。文件被寫入之前,一定要檢查最終組成的文件路徑。
            在你引用某個文件前,必須檢查路徑,并且是嚴格檢查。
            記得使用一些特殊的函數,因為你可能并不了解某些弱點或漏洞。
            并且,很明顯,這與文件后綴或 mime-type 無關。JPEG 允許字符串存在于文件內,所以一張合法的 JPEG 圖片能夠同時包含合法的 PHP 腳本。

            不要信任用戶。不要信任瀏覽器。構建似乎所有人都在提交病毒的后端。

            當然,也不必害怕,這其實比看起來的簡單。只要記住 “不要信任用戶” 以及 “有功能解決此問題” 便可。
            欄目列表
            推薦內容
            熱點內容
            展開
            国产精久久久久无码AV动漫|最新亚洲精品国偷自产在线|2021亚洲色中文字幕在线|最新无码av中文字专区 情欲美妇紧致敏感 国产免费AⅤ片在线播放 人妻爽爽免费在线视频 51精品国产人成在线观看 色偷偷av一区二区三区
            <span id="pfnzv"></span>
                <form id="pfnzv"><span id="pfnzv"></span></form><address id="pfnzv"><span id="pfnzv"><nobr id="pfnzv"></nobr></span></address>
                <form id="pfnzv"><dfn id="pfnzv"><listing id="pfnzv"></listing></dfn></form>

                  <sub id="pfnzv"><address id="pfnzv"></address></sub>
                    <address id="pfnzv"><form id="pfnzv"><listing id="pfnzv"></listing></form></address>
                    <address id="pfnzv"><address id="pfnzv"><nobr id="pfnzv"></nobr></address></address>

                      <address id="pfnzv"></address>