欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PHP中Mkdir函數(shù)如何使用

本篇文章給大家分享的是有關(guān)PHP中Mkdir函數(shù)如何使用,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)與策劃設(shè)計(jì),濱城網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:濱城等地區(qū)。濱城做網(wǎng)站價(jià)格咨詢:13518219792

此過程中例如需要寫入目標(biāo)文件為:

PHP中Mkdir函數(shù)如何使用

首先需要先寫一張

PHP中Mkdir函數(shù)如何使用

為什么會這樣?假設(shè)直接寫目標(biāo)文件,過程中會首先創(chuàng)建目錄:    

PHP中Mkdir函數(shù)如何使用

其實(shí)這個(gè)過程是沒有創(chuàng)建任何目錄的,因?yàn)榕袛嗍莇irectoryalready ,到下一步寫入圖片這里是Imagick::writeImage,在這里就會出問題。invaildfile path.報(bào)錯(cuò)。因?yàn)檫@里不存在 /var/www/html/wordpress/wp-content/uploads/2019/03/1.jpg?    這個(gè)目錄,這涉及到系統(tǒng)調(diào)用,因系統(tǒng)的不同相對于的系統(tǒng)處理函數(shù)處理的方式也不同。        

列如在kali 下 Imagick::writeImage寫入 ./1?/../1.png     , ./1? 這個(gè)目錄是會報(bào)錯(cuò)的。具體系統(tǒng)調(diào)用如下:

PHP中Mkdir函數(shù)如何使用

首先判斷了這個(gè)文件的狀態(tài),而后調(diào)用openat 打開這個(gè)文件并不存在。AT_FDCWD    表示打開的文件位置相對于當(dāng)前目錄。這是我在做的時(shí)候遇到的情況。

但是在 WORDPRESS IMAGE 遠(yuǎn)程代碼執(zhí)行漏洞分析    一文中,甚至其他另一篇。都沒提到兩次寫圖片。難道因?yàn)閣indow和linux的不同嗎?就這個(gè)問題我進(jìn)行了一次對mkdir的探究。發(fā)現(xiàn)其實(shí)有很有趣。

二、PHP內(nèi)核 && 系統(tǒng)差異 之mkdir()

2.1 Linux &&PHP 7.3.2-3

mkdir('./1?/../1',777    ,true);

mkdir('./1?/../1',777    ,false);

當(dāng)?shù)谌齾?shù)為$recursivetrue     時(shí)可以寫目錄,先說一下這個(gè)參數(shù)的含義$recursive用來循環(huán)創(chuàng)建目錄。什么意思呢,當(dāng)false時(shí)只能創(chuàng)建1級目錄,即目錄連接符最后的一個(gè)目錄。而當(dāng)true        時(shí)是可以創(chuàng)建多級目錄至到最后一個(gè)目錄。列如./a/b/c當(dāng)abc都不存在時(shí),會通過系統(tǒng)函數(shù)mkdir循環(huán)創(chuàng)建目錄,abc都會被創(chuàng)建,但若為false            會因?yàn)樽叩絘處目錄不存在,則不回去創(chuàng)建最后一個(gè)c。

但是第一個(gè)mkdir即使為true卻也沒有創(chuàng)建1?    目錄,這里我們從php內(nèi)部mkdir執(zhí)行情況和 系統(tǒng) mkdir         執(zhí)行情況來探究。

2.1.1PHP_FUNTCION(mkdir)

PHP內(nèi)調(diào)過程如下圖:

PHP中Mkdir函數(shù)如何使用    

我們在出現(xiàn)分支的地方細(xì)分 
/php-src/main/streams/plain_wrapper.c

PHP中Mkdir函數(shù)如何使用

2.1.1.1 $recursive =fasle

其中出現(xiàn)的分支的地方在判斷$recursive 若是不需要循環(huán)創(chuàng)建則直接進(jìn)入php_mkdir

/php-src/ext/standard/file.c

PHP中Mkdir函數(shù)如何使用

跟進(jìn)php_mkdir_ex

PHP中Mkdir函數(shù)如何使用

首先會檢查open_basedir,接著會進(jìn)入VCWD_MKDIR    ,VCWD_MKDIR是個(gè)宏命令,有三種不同定義:

PHP中Mkdir函數(shù)如何使用

在這里我剛開始并沒有考慮太多,跟著gdb的流程走,直接執(zhí)行mkdir(),會直接調(diào)用系統(tǒng)的_mkdir()    . mkdir("./1?/../1",         01411) = -            1 ENOENT (No such file or directory)

會直接報(bào)錯(cuò)。在預(yù)料之類,linux系統(tǒng)下mkdir是不允許這樣創(chuàng)建目錄的,會效驗(yàn)每一層目錄的有效性。回到第一次出現(xiàn)分叉的時(shí)候。

2.1.1.2 $recursive =true

PHP中Mkdir函數(shù)如何使用

這里會進(jìn)入expand_filepath_with_mode,這里其實(shí)很熟悉,之前也是在看路徑處理的時(shí)候看到過這個(gè)函數(shù),它是一個(gè)展開函數(shù),會通過遞歸的方式展開需要被創(chuàng)建的目錄。在其過程會先把相對目錄和當(dāng)前腳本執(zhí)行目錄評價(jià)起來,若是絕對目錄則忽略. 
其中我們的相對目錄為 ./1?/../1    會變成 /var/www/html/WordPress/wp-content/themes/4/5/6/./1?/../1 
當(dāng)前我所在的目錄為 /var/www/html/WordPress/wp-content/themes/4/5/6                     
           然后通過遞歸的方式 去掉 .././             ,//.并且對應(yīng)目錄前移,會變成 /var/www/html/WordPress/wp-content/themes/4/5/6/1                                     
                   然后在傳遞給系統(tǒng)的mkdir函數(shù)。

在這個(gè)函數(shù)里面存在win32 和linux的不同分支,但在具體處理之前win32判斷了目錄名不能存在 *?

PHP中Mkdir函數(shù)如何使用

注意一下此處!     

附上strace ,也是驗(yàn)證上訴分析過程

1.   mkdir("/var/www/html/WordPress/wp-content/themes/4/5/6/1",     01411) = 0

2.1.2 Mkdir In Linux

在linux中單純的mkdir是會層層驗(yàn)證目錄,而后在創(chuàng)建一級目錄。mkdir 也可以帶參 -p,代表系統(tǒng)層面循環(huán)的創(chuàng)建目錄。 
當(dāng)執(zhí)行mkdir -p 時(shí) :

 strace -f -e trace        =mkdir  mkdir -p  ./1            ?/../1

 mkdir("1?", 0777        )  = 0

mkdir("1", 0777        )   = 0

我們能看到它并不像php內(nèi)部那樣,展開而后處理 。它會層層按照輸入的目錄創(chuàng)建。

2.2 window&& PHP 7.0.12

這里是我為什么要探究的一個(gè)重要問題點(diǎn)所在,在前面我提到的那篇文章中作者在window下實(shí)驗(yàn)當(dāng)$recursivefalse        才能創(chuàng)建成功,正好是反著的。作者的解釋的false的時(shí)候不會去層層判斷,但是真的是這樣嗎?

而后我也做了一個(gè)驗(yàn)證性的實(shí)驗(yàn),在window 上用 php 5.6做了這個(gè)測試,但是結(jié)果讓我疑惑了,無論在false還是 true        的情況都不會創(chuàng)建目錄.而且報(bào)錯(cuò)也很有意思,在false的情況下報(bào)錯(cuò) no error 但是就是無法創(chuàng)建。在true的情況下報(bào)錯(cuò) invaild path。

難道是php-cli 問題?我又用cgi測了一遍,發(fā)現(xiàn)同樣是這樣。有意思,而后我通過郵件聯(lián)系了那篇文章作者,詢問其版本號。很快,得到了他的答復(fù),php-7.0.12。

于是下載php-7.0.12源碼 重新編譯加debug,此處省略1000字... 
在編譯完成后我迫不及待的試了一下,同樣如此和我的php5.6 一摸一樣,無論在cli 模式 或者 cgi 模式下都是無法復(fù)現(xiàn)作者文中的情況。這到底問題出在哪呢?

先調(diào)了再說,VS調(diào)試php 網(wǎng)上基本上沒有詳細(xì)的介紹,有的都是Vscode。我不知道如何啟動并調(diào)試,只好想了個(gè)attach的辦法。在mkdir前面寫上sleep(10)        ,但是這樣做,其實(shí)是有一點(diǎn)雞肋的,php內(nèi)核初始化過程你其實(shí)抓不到的,但是用在這里夠了,還是在php_plain_files_mkdir這個(gè)地方下斷,刷新頁面,attach到啟動的php-cgi 上。

2.2.1PHP_FUNCTION(mkdir)

2.2.1.1 $recursive== false

還是先分析false的情況,前面都一樣,不同的是在php_mkdir_ex            中VCWD_MKDIR調(diào)用的函數(shù)不一樣

PHP中Mkdir函數(shù)如何使用

這次走到不一樣的調(diào)用上

PHP中Mkdir函數(shù)如何使用

跟進(jìn)virtual_mkdir

PHP中Mkdir函數(shù)如何使用

同樣調(diào)用了virtual_file_ex(),前面有一點(diǎn)沒提到,在expand展開路徑的過程中最后其實(shí)也是進(jìn)入的這個(gè)函數(shù),前面說過在處理的過程中若是win32的情況會判斷路徑存不存在 *            , ?.若是存在則會直接返回1,不會進(jìn)入后面寫路徑。為什么那篇文章的作者會在false的情況下寫成功呢?

2.2.1.1 $recursive== true

這里前面說過這里會進(jìn)行expand過程,但是同樣會判斷路徑名中存不存在*?            ,會報(bào)錯(cuò) Invaild Path。

2.2.2 mkdir inwindow

這里因?yàn)闆]有都沒有執(zhí)行到寫目錄。此處我們還無法探究window系統(tǒng)mkdir 函數(shù)是如何執(zhí)行的。

三、程安全與非線程安全

重新梳理一下,現(xiàn)在是三種不一樣的情況: 
 linux /true 可寫 
 window/7.0.12 : 

 1. false 可寫 
 2. true/false 都不可寫

window 出現(xiàn)了兩種情況。仔細(xì)在走一遍window/false的情況,現(xiàn)在我唯一沒有考慮到是VCWD_MKDIR             選擇情況。前面都是跟著調(diào)試流程走的,這是唯一可能出現(xiàn)分叉的地方,重新看一下它的兩種種宏定義:        

PHP中Mkdir函數(shù)如何使用

若非那片文章作者,是走的第二個(gè)define,于是我把第一個(gè)define先注釋掉了,換上了第二個(gè)define,再重新編譯一邊,結(jié)果竟然出現(xiàn)了和那篇作者一樣的情況。但是這里有一個(gè)小小不同,寫入的目錄是相對于php-cgi.exe解釋器的,不是相對于WWW的網(wǎng)站根目錄下的,當(dāng)你看了下面的分析以后,應(yīng)該會給你一個(gè)答案,那么很顯然問題現(xiàn)在出現(xiàn)在 VIRTUAL_DIR             定義的情況,在它沒有定義的情況下,才會走到第二個(gè)define,我看看VIRTUAL_DIR 

是在哪被定義的

/php-src/Zend/zend_virtual_cwd.h

PHP中Mkdir函數(shù)如何使用

熟悉php內(nèi)核的朋友不會陌生ZTS,這是php 線程安全的標(biāo)志。用來應(yīng)對那些使用線程來處理并發(fā)請求的Web服務(wù)器,列如window下的IIS,worker_mpm模式下的apahce,生活在線程里面的php需要考慮線程間的讀寫同時(shí)也要保證線程間是安全,所以php需要自己提供ZTS層來管理線程間的操作。當(dāng)定義了ZTS時(shí)候,就也同時(shí)定義了虛擬目錄(VIRTUAL_DIR)。為什么會存在虛擬目錄這一說法呢,其實(shí)很簡單你通過對應(yīng)virtual_file_ex()            可以看出來,這個(gè)函數(shù)的目的在于針對相對路徑替換出完整的絕對路徑。舉很簡單的例子,php腳本中寫的相對路徑,其相對路徑一定是針對于該腳本的。在執(zhí)行腳本的過程中,會進(jìn)入相應(yīng)的php 內(nèi)核里面的php_execute_script(),其中有一步是VCWD_CHDIR_FILE(filename)                ,這是用來根據(jù)要執(zhí)行的腳本位置去切換當(dāng)前目錄,同樣這個(gè)宏定義有兩個(gè)不同的函數(shù),一個(gè)是在虛擬目錄下切換目錄,一個(gè)是非線程安全環(huán)境下單線程切換目錄,不同是在線程安全下切換目錄,并不是直接調(diào)用系統(tǒng)的_chdir(),                    而是將執(zhí)行腳本的目錄存儲在TSRMG中,并給定一個(gè)cwd_globals_id,要用的時(shí)候再去取,比如創(chuàng)建目錄,寫文件。因?yàn)樵?strong>多線程環(huán)境不能直接修改當(dāng)前進(jìn)程的目錄,只能預(yù)定義一個(gè)變量保存各線程的當(dāng)前目錄。                        可以看到在線程安全的模式下,若是給的相對路徑,都會出現(xiàn)當(dāng)前目錄和相對目錄的拼接。且都在win32的環(huán)境都會檢測目錄是否包含* ,?                            .        

四、結(jié)論匯總

我有注意到那篇的文章作者是在window 上用的phpstudy,我也去看了一下phpstudy的是否有7.0.12的版本,存在一個(gè) php-7.0.12-nts+Apache             確實(shí)也是非線程安全。也印證上面我修改php7.0.12 重新編譯的結(jié)果,但是一個(gè)很有趣的東西是,window的系統(tǒng)調(diào)用API _mkdir() 是存在和php內(nèi)部一樣的路徑展開功能,即他是允許這樣寫的./1?/../1                 可以在當(dāng)前目錄下寫入文件夾1的,這和linux不一樣,linux的系統(tǒng)函數(shù)是逐層判斷。在php7.1之后,改變了系統(tǒng)創(chuàng)建目錄的API,從_mkdir                     變成了CreateDirectoryW,但是不變的是還是可以存在路徑展開的功能。即便你這樣寫:@@#@$@#$^%$&&**/@!#@!$!%/../../evil                        也是可以創(chuàng)建目錄evil的,可以算是一個(gè)小技巧。但是條件是在windowphp非線程安全模式和PHP_FUNCTION(mkdir)                            第三個(gè)參數(shù)為false的情況下是可以這樣寫目錄的??梢运闶且粋€(gè)小tips吧。結(jié)合相應(yīng)的應(yīng)用特點(diǎn),是可以用到的,而且php版本一般都是非線程安全的,在nginx下都是多進(jìn)程處理php,即非線程安全。apache只有在worker_mpm才是多線程的,一般也不常用。一般都是prefork_mpm + php_mod,即便是fastcgi也是多進(jìn)程。利用環(huán)境還是比較常見的。

PHP中Mkdir函數(shù)如何使用        

以上就是PHP中Mkdir函數(shù)如何使用,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章名稱:PHP中Mkdir函數(shù)如何使用
本文URL:http://aaarwkj.com/article46/gdgseg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航搜索引擎優(yōu)化、用戶體驗(yàn)、服務(wù)器托管動態(tài)網(wǎng)站、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
国产精品国产三级国产普通话99| 亚洲激情中文字幕av网| 亚洲理论电影在线观看| 亚洲精品一区二区日本| 持续侵犯人妻中文字幕| 刚出嫁新婚少妇很紧很爽| 97国产精品亚洲精品| 97视频在线观看观看| 日韩一二三区欧美四五区新| 久久久国产精品视频网站| 羞涩插射视频网站在线观看| 欧美两性色一区二区三区| 日韩在线不卡播放视频| 一区二区亚洲欧美精品| 欧美成人极品一区二区三区| 91亚洲精品久久久蜜桃网站| 欧美日韩亚洲精品内裤| 2021天天操夜夜爽| 亚洲熟妇丰满多毛的大昊| 久久精品亚洲国产成人av| 国产特级黄色片免费看| 亚洲乱码一区二区三区人妇| 日本丝袜福利在线观看| 国产精品一区二区三区 在线| 色哟哟网站在线精品视频| 国产夫妻一区二区三区| 福利在线视频一区二区| 麻豆乱淫一区二区三爱免费| 18禁黄久久久一区二区三区| 中文字幕一区二区中文字幕| 91麻豆视频福利视频| 亚洲精品一品区二品区三| 亚洲无线码一区国产欧美国日| 91欧美视频在线观看| 日本欧美自拍偷拍高清| 亚洲黄色片大奶子水多| 欧美日韩一区二区综合性色| 精彩国产av一区二区三区| 欧美午夜福利一级高清| 日本精品专区在线观看| 久久不卡高清免费av|