最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP文件上傳安全:優(yōu)化代碼有效防范漏洞

 更新時(shí)間:2023年12月26日 08:47:39   作者:小松聊PHP進(jìn)階  
PHP文件上傳安全是網(wǎng)站開(kāi)發(fā)中至關(guān)重要的一環(huán),想要避免惡意攻擊和數(shù)據(jù)泄露?本指南將為您揭示優(yōu)化代碼、有效防范漏洞的關(guān)鍵方法,讓我們一起打造更安全的文件上傳系統(tǒng)吧!

說(shuō)明:任意文件上傳漏洞,很多PHP開(kāi)發(fā)者也會(huì)做一些簡(jiǎn)單的防護(hù),但是這個(gè)防護(hù)有被繞過(guò)的可能。

原生漏洞PHP示例代碼:

$file = $_FILES['file'] ?? [];
//檢測(cè)文件類(lèi)型
$allow_mime = ['image/jpg', 'image/jpeg', 'image/png', 'image/gif'];
if(! in_array($file['type'], $allow_mime)) {
    echo json_encode(['code' => 1, 'msg' => "文件類(lèi)型錯(cuò)誤"], JSON_UNESCAPED_UNICODE);
    return;
}

print_r($file);

上傳一個(gè)PHP文件,提示文件類(lèi)型錯(cuò)誤,使用ApiPost修改上傳的Content-Type,把原先的application/x-httpd-php修改為image/png,則可繞過(guò)。
因?yàn)椋?strong>$_FILES['type']是根據(jù)上傳文件的content-type獲取的,并文件本身的mime-type,而content-type又可以被篡改。

原生漏洞PHP漏洞優(yōu)化意見(jiàn)(獲取臨時(shí)文件的真實(shí)類(lèi)型):

$file = $_FILES['file'] ?? [];
//檢測(cè)文件類(lèi)型
$allow_mime = ['image/jpg', 'image/jpeg', 'image/png', 'image/gif'];
if(! in_array((new \finfo(\FILEINFO_MIME_TYPE))->file($file['tmp_name']), $allow_mime)) {
    echo json_encode(['code' => 1, 'msg' => "文件類(lèi)型錯(cuò)誤"], JSON_UNESCAPED_UNICODE);
    return;
}

print_r($file);

對(duì)Laravel框架,也有同樣的問(wèn)題,別用錯(cuò)函數(shù):

$file->getClientMimeType(); //相當(dāng)于$_FILES['file']['type'];
$file->getMimeType(); //相當(dāng)于(new \finfo(\FILEINFO_MIME_TYPE))->file($_FILES['file']['tmp_name'])

說(shuō)話(huà)得有依據(jù),經(jīng)過(guò)反復(fù)的追Laravel的源碼:

底層對(duì)getClientMimeType()的實(shí)現(xiàn):
是在vendor/symfony/http-foundation/Request.php的createFromGlobals()中,基于$_FILES做的封裝。
底層對(duì)getMimeType()的實(shí)現(xiàn):
是在vendor/symfony/mime/FileinfoMimeTypeGuesser.php的guessMimeType()中,利用finfo的內(nèi)置PHP類(lèi)實(shí)現(xiàn)的。

對(duì)Laravel任意文件上傳漏洞優(yōu)化意見(jiàn)(獲取臨時(shí)文件的真實(shí)類(lèi)型):

使用getMimeType函數(shù)。

整體修復(fù)意見(jiàn):

先判斷文件后綴,在判斷臨時(shí)文件的mime類(lèi)型屬性,不要根據(jù)請(qǐng)求頭判斷。

擴(kuò)展:

mime_content_type函數(shù)與(new \finfo(\FILEINFO_MIME_TYPE))->file('file_path')的區(qū)別?

檢測(cè)文件mime類(lèi)型,還有一個(gè)mime_content_type();

  • mime_content_type()獲取的mime類(lèi)型,會(huì)與操作系統(tǒng)的mime類(lèi)型有映射,意味著不同的系統(tǒng)可能存在一些小差別。
  • finfo類(lèi)使用了 PHP 的 FileInfo 擴(kuò)展。FileInfo 擴(kuò)展利用了文件的特征簽名(或稱(chēng)為魔術(shù)數(shù)字)來(lái)檢測(cè)文件的實(shí)際類(lèi)型,并根據(jù)文件的內(nèi)容進(jìn)行精確的 MIME 類(lèi)型推斷。

雖然兩者相差不大,但是推薦用(new \finfo(\FILEINFO_MIME_TYPE))->file('file_path');

(new \finfo(\FILEINFO_MIME_TYPE))->file('file_path')與finfo_file()的區(qū)別?

使用finfo_file()也可以獲取文件的mime類(lèi)型。

$mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $file['tmp_name']);
$mime = (new \finfo(FILEINFO_MIME_TYPE))->file($file['tmp_name']);

兩者底層對(duì)獲取mime類(lèi)型的實(shí)現(xiàn)無(wú)差別,展示寫(xiě)法不同。

什么是文件的魔術(shù)數(shù)字?

文件的魔術(shù)數(shù)字是文件頭部的一段特定的字節(jié)序列,用來(lái)描述文件的類(lèi)型或格式,一般用16進(jìn)制表示。
文件的魔術(shù)數(shù)字一般包含一些特殊的字符和數(shù)字組成的固定長(zhǎng)度的字節(jié)串,不同類(lèi)型的文件具有不同的魔術(shù)數(shù)字。例如,PNG 圖像文件的魔術(shù)數(shù)字為 89 50 4E 47 0D 0A 1A 0A,而 JPG 圖像文件的魔術(shù)數(shù)字為 FF D8 FF E0 00 10 4A 46 49 46 00 01。
PHP獲取魔術(shù)數(shù)字實(shí)現(xiàn)方案:

$fileHandle = fopen($_FILES['file']['tmp_name'], 'rb');
$hex = '';
while (! feof($fileHandle)) {
    $byte = fread($fileHandle, 1);
    $hex .= sprintf("%02X ", ord($byte));
}
fclose($fileHandle);
echo $hex;

到此這篇關(guān)于PHP文件上傳安全:優(yōu)化代碼有效防范漏洞的文章就介紹到這了,更多相關(guān)PHP防止任意文件上傳漏洞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • php的SimpleXML方法讀寫(xiě)XML接口文件實(shí)例解析

    php的SimpleXML方法讀寫(xiě)XML接口文件實(shí)例解析

    在php5中讀寫(xiě)xml文檔是非常方便的,可以直接使用php的SimpleXML方法來(lái)快速解析與生成xml格式的文件,本文實(shí)例說(shuō)明如下,需要的朋友可以參考下
    2014-06-06
  • php雙向隊(duì)列實(shí)例講解

    php雙向隊(duì)列實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于php雙向隊(duì)列如何理解的相關(guān)內(nèi)容及實(shí)例,需要的朋友們可以跟著學(xué)習(xí)下。
    2021-11-11
  • 解析VS2010利用VS.PHP插件調(diào)試PHP的方法

    解析VS2010利用VS.PHP插件調(diào)試PHP的方法

    以下是對(duì)VS2010利用VS.PHP插件調(diào)試PHP的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-07-07
  • PHP以mysqli方式連接類(lèi)完整代碼實(shí)例

    PHP以mysqli方式連接類(lèi)完整代碼實(shí)例

    這篇文章主要介紹了PHP以mysqli方式連接類(lèi)完整代碼實(shí)例,對(duì)于學(xué)習(xí)和了解mysqli都有很大的幫助,需要的朋友可以參考下
    2014-07-07
  • PHP實(shí)戰(zhàn)之投票系統(tǒng)的實(shí)現(xiàn)

    PHP實(shí)戰(zhàn)之投票系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要為大家介紹了如何利用PHP制作一個(gè)投票系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下
    2022-04-04
  • PHP實(shí)現(xiàn)多維數(shù)組多字段自定義排序

    PHP實(shí)現(xiàn)多維數(shù)組多字段自定義排序

    這篇文章主要介紹了PHP實(shí)現(xiàn)多維數(shù)組多字段自定義排序,通過(guò)將待排序數(shù)組的各個(gè)數(shù)組的$field保存在一維數(shù)組fieldArr中,在傳入array_multisort中參與排序,相當(dāng)于對(duì)$field一維數(shù)組的排序,而后根據(jù)排序后的key重新構(gòu)建傳入的待排序數(shù)組,需要的朋友可以參考下
    2023-10-10
  • ini_set的用法介紹

    ini_set的用法介紹

    PHP ini_set用來(lái)設(shè)置php.ini的值,在函數(shù)執(zhí)行的時(shí)候生效,對(duì)于虛擬空間來(lái)說(shuō),很方便,下面為大家介紹下此方法的使用
    2014-01-01
  • PHP中十六進(jìn)制顏色與RGB顏色值互轉(zhuǎn)的方法

    PHP中十六進(jìn)制顏色與RGB顏色值互轉(zhuǎn)的方法

    今天小編就為大家分享一篇關(guān)于PHP中十六進(jìn)制顏色與RGB顏色值互轉(zhuǎn)的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • ie與session丟失(新窗口cookie丟失)實(shí)測(cè)及解決方案

    ie與session丟失(新窗口cookie丟失)實(shí)測(cè)及解決方案

    正如標(biāo)題所言測(cè)試結(jié)果為:如果cookie設(shè)置是延后定時(shí)失效,而非進(jìn)程級(jí)的,那在open后也能看到,所以,針對(duì)此情況,防止用戶(hù)在使用ie內(nèi)核出現(xiàn)登錄狀態(tài)丟失,可以配合cookie來(lái)使用
    2013-07-07
  • PHP中explode函數(shù)和split函數(shù)的區(qū)別小結(jié)

    PHP中explode函數(shù)和split函數(shù)的區(qū)別小結(jié)

    相信大家都知道,explode和split在php中都是可以通過(guò)特定字符把字符串轉(zhuǎn)換成數(shù)組的,那么explode和split既然是一樣的為什么會(huì)有兩個(gè)函數(shù)呢,那么explode和split的區(qū)別在哪里呢,下面跟著小編我們一起來(lái)看看。
    2016-08-08

最新評(píng)論

瑞安市| 潜江市| 即墨市| 宁都县| 龙口市| 柘城县| 灵宝市| 梅州市| 辰溪县| 阿城市| 崇礼县| 汉川市| 榆社县| 玛多县| 溧水县| 合水县| 松阳县| 遵义市| 应用必备| 和政县| 海宁市| 孝昌县| 兴仁县| 本溪| 合肥市| 博罗县| 马关县| 皮山县| 佛教| 关岭| 嵩明县| 昔阳县| 海城市| 股票| 景泰县| 都兰县| 宜州市| 五常市| 天气| 温泉县| 无为县|