文件上傳攻擊
? 有時(shí)在除了標(biāo)準(zhǔn)的表單數(shù)據(jù)外,你還需要讓用戶進(jìn)行文件上傳。由于文件在表單中傳送時(shí)與其它的表單數(shù)據(jù)不同,你必須指定一個(gè)特別的編碼方式multipart/form-data:
CODE:
?
<form action="upload.php" method="POST" enctype="multipart/form-data">
一個(gè)同時(shí)有普通表單數(shù)據(jù)和文件的表單是一個(gè)特殊的格式,而指定編碼方式可以使瀏覽器能按該可格式的要求去處理。
允許用戶進(jìn)行選擇文件并上傳的表單元素是很簡單的:
CODE:
<input type="file" name="attachment" />
該元素在各種瀏覽器中的外觀表現(xiàn)形式各有不同。傳統(tǒng)上,界面上包括一個(gè)標(biāo)準(zhǔn)的文本框及一個(gè)瀏覽按鈕,以使用戶能直接手工錄入文件的路徑或通過瀏覽選擇。在Safari瀏覽器中只有瀏覽按鈕。幸運(yùn)的是,它們的作用與行為是相同的。
為了更好地演示文件上傳機(jī)制,下面是一個(gè)允許用戶上傳附件的例子:
CODE:
<form action="upload.php" method="POST" enctype="multipart/form-data">Please choose a file to upload:
隱藏的表單變量MAX_FILE_SIZE告訴了瀏覽器最大允許上傳的文件大小。與很多客戶端限制相同,這一限制很容易被攻擊者繞開,但它可以為合法用戶提供向?qū)АT诜?wù)器上進(jìn)行該限制才是可靠的。
PHP的配置變量中,upload_max_filesize控制最大允許上傳的文件大小。同時(shí)post_max_size(POST表單的最大提交數(shù)據(jù)的大?。┮材軡撛诘剡M(jìn)行控制,因?yàn)槲募峭ㄟ^表單數(shù)據(jù)進(jìn)行上傳的。
接收程序upload.php顯示了超級全局?jǐn)?shù)組$_FILES的內(nèi)容:
CODE:
<?php header('Content-Type: text/plain'); print_r($_FILES); ?>
為了理解上傳的過程,我們使用一個(gè)名為author.txt的文件進(jìn)行測試,下面是它的內(nèi)容:
CODE:
Chris Shiflett http://miracleart.cn/
當(dāng)你上傳該文件到upload.php程序時(shí),你可以在瀏覽器中看到類似下面的輸出:
CODE:
Array ( [attachment] => Array ( [name] => author.txt [type] => text/plain [tmp_name] => /tmp/phpShfltt [error] => 0 [size] => 36 ) )
雖然從上面可以看出PHP實(shí)際在超級全局?jǐn)?shù)組$_FILES中提供的內(nèi)容,但是它無法給出表單數(shù)據(jù)的原始信息。作為一個(gè)關(guān)注安全的開發(fā)者,需要識別輸入以知道瀏覽器實(shí)際發(fā)送了什么,看一下下面的HTTP請求信息是很有必要的:
CODE:
POST /upload.php HTTP/1.1 Host: example.org Content-Type: multipart/form-data; boundary=----------12345 Content-Length: 245 ----------12345 Content-Disposition: form-data; name="attachment"; filename="author.txt" Content-Type: text/plain Chris Shiflett http://miracleart.cn/ ----------12345 Content-Disposition: form-data; name="MAX_FILE_SIZE" 1024 ----------12345--
雖然你沒有必要理解請求的格式,但是你要能識別出文件及相關(guān)的元數(shù)據(jù)。用戶只提供了名稱與類型,因此tmp_name,error及size都是PHP所提供的。
由于PHP在文件系統(tǒng)的臨時(shí)文件區(qū)保存上傳的文件(本例中是/tmp/phpShfltt),所以通常進(jìn)行的操作是把它移到其它地方進(jìn)行保存及讀取到內(nèi)存。如果你不對tmp_name作檢查以確保它是一個(gè)上傳的文件(而不是/etc/passwd之類的東西),存在一個(gè)理論上的風(fēng)險(xiǎn)。之所以叫理論上的風(fēng)險(xiǎn),是因?yàn)闆]有一種已知的攻擊手段允許攻擊者去修改tmp_name的值。但是,沒有攻擊手段并不意味著你不需要做一些簡單的安全措施。新的攻擊手段每天在出現(xiàn),而簡單的一個(gè)步驟能保護(hù)你的系統(tǒng)。
PHP提供了兩個(gè)方便的函數(shù)以減輕這些理論上的風(fēng)險(xiǎn):is_uploaded_file( ) and move_uploaded_file( )。如果你需要確保tmp_name中的文件是一個(gè)上傳的文件,你可以用is_uploaded_file( ):
CODE:
<?php $filename = $_FILES['attachment']['tmp_name']; if (is_uploaded_file($filename)) { /* $_FILES['attachment']['tmp_name'] is an uploaded file. */ } ?>
如果你希望只把上傳的文件移到一個(gè)固定位置,你可以使用move_uploaded_file( ):
CODE:
<?php $old_filename = $_FILES['attachment']['tmp_name']; $new_filename = '/path/to/attachment.txt'; if (move_uploaded_file($old_filename, $new_filename)) { /* $old_filename is an uploaded file, and the move was successful. */ } ?>
最后你可以用 filesize( ) 來校驗(yàn)文件的大?。?/span>
CODE:
<?php $filename = $_FILES['attachment']['tmp_name']; if (is_uploaded_file($filename)) { $size = filesize($filename); } ?>
這些安全措施的目的是加上一層額外的安全保護(hù)層。最佳的方法是永遠(yuǎn)盡可能少地去信任。?
以上就是PHP安全-文件上傳攻擊的內(nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(miracleart.cn)!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tostaycurrentwithphpdevelopmentsandbestpractices, followeyNewsssourcesLikePhp.netandphpweekly, engageWithCommunitiesonforumsandconference, keeptoolingupdatedandgraduallyAdoptNewFeatures, dan readribcoursourcourceSource

Phpbecamepopularforwebdevelopmentduetoitseaseoflearning, seamlessintegrationwithhtml, widespreadhostingsupport, andalargeecosystemincludingframeworkslikelaravelandcmsplatformsLikeWordPress.itexcelsinhandessubmissions

TosetTheRightTimeZoneinPhp, USEDATE_DEFAULT_TIMEZONE_SET () functionAtthestArtAfyourscriptwithavalididentifiersuchas'america/new_york'.1.usedate_default_timeSet ()

TOVALIDATEUSERIputInphp, UsEbuilt-InvalidationFunctionsLikeFilter_var () danFilter_Input (), applyRegularExpressionsforcustomformatssuchasususerorphonenumbers, checkdatatypesfornumericressplimeSpriceSprice, setLengthacheAngeAgeorpriceSprice, setLengthacheArpesenprice,

ThPhpFunctionserialize () andUnserialize () diselaraskanToConvertComplexDataStructructDestoresIntoStorasandabackagain.1.Serialize () C overtsdatalikeCarraysorObjectSrayStringContainingTyPeanStructureStructureStructureStructure.2.2Serialize ()

Anda boleh membenamkan kod PHP ke dalam fail HTML, tetapi pastikan fail itu mempunyai lanjutan .php supaya pelayan dapat menghuraikannya dengan betul. Gunakan tag standard untuk membungkus kod PHP, masukkan kandungan dinamik di mana sahaja di HTML. Di samping itu, anda boleh menukar PHP dan HTML beberapa kali dalam fail yang sama untuk merealisasikan fungsi dinamik seperti rendering bersyarat. Pastikan anda memberi perhatian kepada konfigurasi pelayan dan ketepatan sintaks untuk mengelakkan masalah yang disebabkan oleh label pendek, kesilapan tanda petikan atau label akhir yang ditinggalkan.

Kunci untuk menulis kod PHP yang bersih dan mudah dijaga terletak pada penamaan yang jelas, berikutan piawaian, struktur yang munasabah, menggunakan komen dan kesesuaian yang baik. 1. Gunakan pembolehubah, fungsi dan nama kelas yang jelas, seperti $ userData dan calculateToTalPrice (); 2. Ikuti gaya kod bersatu piawai PSR-12; 3. Pecahkan struktur kod mengikut tanggungjawab, dan aturnya menggunakan katalog MVC atau Laravel; 4. Elakkan kod gaya mi dan memecah logik ke dalam fungsi kecil dengan satu tanggungjawab; 5. Tambah komen pada mata utama dan tulis dokumen antara muka untuk menjelaskan parameter, pulangan nilai dan pengecualian; 6. Meningkatkan kebolehlihatan, mengguna pakai suntikan pergantungan, mengurangkan kaedah keadaan global dan statik. Amalan ini meningkatkan kualiti kod, kecekapan kerjasama dan kemudahan pasca penyelenggaraan.

Ya, youpanrunsqlqueriesusingphp, danTheProcessinvolveschoosingadatabaseextension, connectingTothedatabase, executingqueriSafely, andclosingconnectionswhendone.todothis, firstChoosebetweBetbeSquLiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpiorpdob
