日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

真得好好细讲文件上传,否则漏洞百出

發(fā)布時(shí)間:2023/12/15 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 真得好好细讲文件上传,否则漏洞百出 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、表單?

????1,上傳文件的表單使用post方式;還要加上enctype='multipart/form-data'。?
????2,一般要加上隱藏域:<input?type=hidden?name='MAX_FILE_SIZE'?value=dddddd>,位置在file域前面。value的值是上傳文件的客戶端字節(jié)限制。據(jù)說(shuō)可以減少文件超標(biāo)時(shí)客戶端的等待時(shí)間,不過(guò)我沒(méi)覺(jué)得有什么區(qū)別。?
????3,file域是不許賦值的(無(wú)value="")。

二,文件上傳錯(cuò)誤代碼?

????預(yù)定義變量$_FILES數(shù)組有5個(gè)內(nèi)容:?
????$_FILES['userfile']['name']——客戶端機(jī)器文件的原名稱?
????$_FILES['userfile']['type']——文件的?MIME?類型?
????$_FILES['userfile']['size']——已上傳文件的大小,單位為字節(jié)?
????$_FILES['userfile']['tmp_name']——文件被上傳后在服務(wù)端儲(chǔ)存的臨時(shí)文件名?
????$_FILES['userfile']['error']——和該文件上傳相關(guān)的錯(cuò)誤代碼?

????其中$_FILES['userfile']['error']的可以有下列取值和意義:?
????0——沒(méi)有錯(cuò)誤發(fā)生,文件上傳成功。??
????1——上傳的文件超過(guò)了?php.ini?中?upload_max_filesize?選項(xiàng)限制的值。??
????2——上傳文件的大小超過(guò)了?HTML?表單中?MAX_FILE_SIZE?選項(xiàng)指定的值。??
????3——文件只有部分被上傳。??
????4——沒(méi)有文件被上傳。??
?????
????1~3不用說(shuō)了。?
????“沒(méi)有文件被上傳”(4)是指表單的file域沒(méi)有內(nèi)容,是空字符串。?
????“文件上傳成功”(0)不一定真的有文件上傳了。比如你打了個(gè)“c:”給file域,就可以“上傳成功”——錯(cuò)誤代碼是0,['name']是“c:”,['type']是“application/octet-stream”,['size']是0,['tmp_name']是“xxx.tmp”(xxx是服務(wù)器起的名字)?
?????
三,文件大小限制和檢驗(yàn)?

????限制上傳文件大小的因素有?
????1,客戶端的隱藏域MAX_FILE_SIZE的數(shù)值(可以被繞開(kāi))。?
????2,服務(wù)器端的upload_max_filesize,post_max_size和memory_limit。這幾項(xiàng)不能夠用腳本來(lái)設(shè)置。?
????3,自定義文件大小限制邏輯。即使服務(wù)器的限制是能自己決定,也會(huì)有需要個(gè)別考慮的情況。所以這個(gè)限制方式經(jīng)常是必要的。?
?????
????我碰見(jiàn)的一種情況可能不是普遍性的,說(shuō)明一下。如果文件比服務(wù)器端限制(upload_max_filesize)大很多,但也還沒(méi)達(dá)到或接近post_max_size或者memory_limit,$_FILES就會(huì)“崩潰”——結(jié)果是$_FILES['userfile']變成了“Undefined?index”,當(dāng)然是什么檢驗(yàn)也做不到了?

????服務(wù)器端限制的檢驗(yàn)優(yōu)先于客戶端限制的檢驗(yàn)。就是說(shuō),如果兩個(gè)限制是一樣的,而文件過(guò)大了,$_FILES['userfile']['error']會(huì)出錯(cuò)誤代碼1。只有客戶端限制比服務(wù)器端限制小到一定“程度”,而且文件大小超過(guò)兩者的時(shí)候,才會(huì)出現(xiàn)錯(cuò)誤代碼2(難道這跟我感覺(jué)MAX_FILE_SIZE沒(méi)起到預(yù)想的作用是一個(gè)原因?)。上述的“程度”,在我的機(jī)器上試驗(yàn)在3~4K之間——我的機(jī)器設(shè)置的服務(wù)器端限制為2M……因?yàn)闆](méi)什么意味,就沒(méi)有追求精確的規(guī)律。?

????出現(xiàn)錯(cuò)誤代碼1或2的時(shí)候:?
????$_FILES['userfile']['name']為客戶端機(jī)器文件的原名稱?
????$_FILES['userfile']['type']為空字符串?
????$_FILES['userfile']['size']為0?
????$_FILES['userfile']['tmp_name']為空字符串?

四,文件路徑檢驗(yàn)?

????回顧一下:?
?????
????file域無(wú)輸入,錯(cuò)誤代碼為4(無(wú)文件上傳)?
????$_FILES['userfile']['name']為空字符串?
????$_FILES['userfile']['type']為空字符串?
????$_FILES['userfile']['size']為0?
????$_FILES['userfile']['tmp_name']為空字符串?
?????
????file域是非文件路徑的字符串(不考慮客戶端的假“限制”了),錯(cuò)誤代碼是0(“上傳成功”)?
????$_FILES['userfile']['name']為原字符串?
????$_FILES['userfile']['type']為application/octet-stream?
????$_FILES['userfile']['size']為0?
????$_FILES['userfile']['tmp_name']為一個(gè)暫時(shí)文件名?

五,is_uploaded_file()的返回值?

????手冊(cè)上面不很詳細(xì)地說(shuō),用法是:?
????????bool?is_uploaded_file(?string?filename)?
????實(shí)際上?
????????is_uploaded_file($_FILES['userfile']['name']);?
????總是返回FALSE。后來(lái)看見(jiàn)別人是用:?
????????is_uploaded_file($_FILES['userfile']['tmp_name']);?

????比較一下:?

????file域無(wú)輸入——————返回FALSE——error=>4,name=>'',???tmp_name=>'',???type=>'',???size=>0?
????file域?yàn)榉锹窂阶址祷?TRUE——error=>0,name=>'xxx',tmp_name=>'yyy',type=>'zzz',size=>0?
????文件上傳成功——————返回?TRUE——error=>0,name=>'xxx',tmp_name=>'yyy',type=>'zzz',size=>sss?
????文件太大————————返回FALSE——error=>1,name=>'xxx',tmp_name=>'',???type=>'',???size=>0?
????文件太大————————返回FALSE——error=>2,name=>'xxx',tmp_name=>'',???type=>'',???size=>0?
????文件部分上傳——————沒(méi)機(jī)會(huì)試驗(yàn)?—error=>3?

????有點(diǎn)懷疑這個(gè)函數(shù)是怎么工作的,還是覺(jué)得用$_FILES['userfile']['size']檢驗(yàn)好些。?

六,檢驗(yàn)順序?

if($_FILES['userfile']['error']!=4){//有文件上傳if($_FILES['userfile']['error']!=3){//全部上傳了if($_FILES['userfile']['error']!=1){//不超過(guò)服務(wù)器端文件大小限制if($_FILES['userfile']['error']!=2){//不超過(guò)客戶端文件大小限制if($_FILES['userfile']['size']>0){//確實(shí)是文件if(......){//自定義文件大小檢驗(yàn)邏輯if(......){//自定義文件類型檢驗(yàn)邏輯if(move_uploaded_file($_FILES['userfile']['tmp_name'],...))//移動(dòng)文件//.......... }elsegive_a_message(...);}elsegive_a_message(...);}elsegive_a_message(...);}elsegive_a_message(...);}elsegive_a_message(...);}elsegive_a_message(...);}elsegive_a_message(...);}


?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的真得好好细讲文件上传,否则漏洞百出的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。