當前位置:首頁 » 文件管理 » php安全的文件上傳

php安全的文件上傳

發布時間: 2022-12-20 03:19:49

❶ 怎樣用php實現文件上傳

創建一個文件上傳表單
允許用戶從表單上傳文件是非常有用的。
請看下面這個供上傳文件的 HTML 表單:
<html>
<body>

<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

請留意如下有關此表單的信息:
<form> 標簽的 enctype 屬性規定了在提交表單時要使用哪種內容類型。在表單需要二進制數據時,比如文件內容,請使用 "multipart/form-data"。
<input> 標簽的 type="file" 屬性規定了應該把輸入作為文件來處理。舉例來說,當在瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。
注釋:允許用戶上傳文件是一個巨大的安全風險。請僅僅允許可信的用戶執行文件上傳操作。
創建上傳腳本
"upload_file.php" 文件含有供上傳文件的代碼:
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>

通過使用 PHP 的全局數組 $_FILES,你可以從客戶計算機向遠程伺服器上傳文件。
第一個參數是表單的 input name,第二個下標可以是 "name", "type", "size", "tmp_name" 或 "error"。就像這樣:
$_FILES["file"]["name"] - 被上傳文件的名稱
$_FILES["file"]["type"] - 被上傳文件的類型
$_FILES["file"]["size"] - 被上傳文件的大小,以位元組計
$_FILES["file"]["tmp_name"] - 存儲在伺服器的文件的臨時副本的名稱
$_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼
這是一種非常簡單文件上傳方式。基於安全方面的考慮,您應當增加有關什麼用戶有權上傳文件的限制。
上傳限制
在這個腳本中,我們增加了對文件上傳的限制。用戶只能上傳 .gif 或 .jpeg 文件,文件大小必須小於 20 kb:
<?php

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "Invalid file";
}

?>

注釋:對於 IE,識別 jpg 文件的類型必須是 pjpeg,對於 FireFox,必須是 jpeg。
保存被上傳的文件
上面的例子在伺服器的 PHP 臨時文件夾創建了一個被上傳文件的臨時副本。
這個臨時的復制文件會在腳本結束時消失。要保存被上傳的文件,我們需要把它拷貝到另外的位置:
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>

上面的腳本檢測了是否已存在此文件,如果不存在,則把文件拷貝到指定的文件夾。
注釋:這個例子把文件保存到了名為 "upload" 的新文件夾。

❷ php上傳文件到伺服器

1、通過PHP,可以把文件上傳到伺服器。創建一個文件上傳表單,下面這個供上傳文件的 HTML 表單:

<html>
<body>

<formaction="upload_file.php"method="post"
enctype="multipart/form-data">
<labelfor="file">Filename:</label>
<inputtype="file"name="file"id="file"/>
<br/>
<inputtype="submit"name="submit"value="Submit"/>
</form>

</body>
</html>

2、創建上傳腳本,命名為"upload_file.php" 文件含有供上傳文件的代碼:

<?php
if($_FILES["file"]["error"]>0)
{
echo"Error:".$_FILES["file"]["error"]."<br/>";
}
else
{
echo"Upload:".$_FILES["file"]["name"]."<br/>";
echo"Type:".$_FILES["file"]["type"]."<br/>";
echo"Size:".($_FILES["file"]["size"]/1024)."Kb<br/>";
echo"Storedin:".$_FILES["file"]["tmp_name"];
}
?>

註:通過使用 PHP 的全局數組 「$_FILES」,就可以實現從客戶計算機向遠程伺服器上傳文件。

❸ PHP 文件上傳安全需要注意哪些方面

1,文件大小
2,編碼
3,CSV的話,定長不定長

❹ php 在做文件上傳時,如何設置才能更安全

只允許上傳圖片,伺服器端收到文件後,利用GD函數獲取圖片信息,對各屬性超過范圍的文件拒絕接受,我的程序例子如下:

$tmp_name=$HTTP_POST_FILES["f_image"][tmp_name];
$imginfo=getimagesize($tmp_name);
//壓縮寬度超過800的圖片為800,10K以上的JPG圖片用30%進行壓縮
if ($imginfo[0]>800){
echo "你上傳的圖片幅面為 $imginfo[0] x $imginfo[1] ,將被壓縮到800個象素寬。<br>";
system('"C:\Program Files\ImageMagick-6.0.7-Q16\convert.exe"'." -sample 800 -quality 80 $tmp_name $tmp_name");
} elseif($imginfo[2]==2 && $src_size>10240) system('"C:\Program Files\ImageMagick-6.0.7-Q16\convert.exe"'." -quality 30 $tmp_name $tmp_name");

❺ 求PHP上傳文件夾的三種解決方案

1 壓縮上傳(用戶把文件夾壓縮後上傳),
2 input里加這個屬性webkitdirectory就是默認可以上傳文件夾了。谷歌瀏覽器可以。其他瀏覽器好像不行
3 業務上進行優化 如:(上傳時還是上傳文件,但是需要填寫文件夾得名稱,上傳之後,後台根據文件夾名稱,自動創建文件夾)

❻ 北大青鳥設計培訓:用PHP控制FTP文件上傳

利用PHP,你總是可以有多種方式來完成某個特定的任務。
我們就拿文件上傳舉個例子。
當然了,你可以按照傳統的方式來使用HTTP文件上傳,把文件直接傳輸到Web伺服器磁碟上。
煙台電腦培訓http://www.kmbdqn.cn/認為你還可以用更加奇異的方式上傳,用FTP協議兩步就完成上傳:從你的本地硬碟到Web伺服器,然後再到FTP伺服器。
PHP在本機同時支持FTP和HTTP上傳,所以你可以根據自己應用程序的設計需要進行最佳的選擇。
使用PHP的FTP函數進行文件傳輸幾乎與使用傳統的FTP客戶端相同——你會看到連函數的名字都和標準的FTP命令類似。
關於HTTP文件上傳的文章已經多得滿天飛了,這就是為什麼本文有必要把注意力放在基於FTP的文件上傳上了(但是在後面給出的例子中,兩種方式你都會看到)。
要注意的是,本教程假設你已經安裝好了PHP/Apache,而且HTTP文件上傳和FTP的函數都已經激活了。
第一步:確信你擁有連接/上傳到FTP伺服器的許可權PHP的FTP函數需要客戶端-伺服器連接,所以你需要在進行文件上傳之前登錄到目標伺服器上。
你的第一項任務是確信你已經擁有了完成這項任務的信任書。
這一步可能看起來是理所當然的,但是你會驚奇地發現有多少開發人員忘了這么做,結果後來浪費大量的時間來解決因此而出現的問題。

❼ 如何設計出一個安全的文件上傳功能

這兩天我們的老朋友PDP在BlackHat 08上做了一個關於GIFAR的演講。和往常一樣,PDP的東西基本上都很猥瑣,這個也是。主題是關於是如何把GIF或者 JPG文件和JAR文件捆綁在一起,然後欺騙伺服器以為是GIF或JPG文件,結果卻是在客戶端的JVM中執行JAR的例子。
他還舉了些欺騙的例子,比如在office2007中,doc文件實際上就是zip格式了,裡面都是些xml,那麼他把jar文件打包在zip文件里,再把後綴改成doc,來達到欺騙的目的。
在這里是客戶端的問題,我想到的則是其他的問題,比如安全上傳。
根據以往的經驗看來,我們可能會設計如下文件上傳的安全規則:
1. 文件上傳的目錄設置為不可執行
2. 判斷文件類型
3. 單獨設置文件伺服器的域名
4. 改寫文件名,文件路徑不可預測
第一點規則是顯而易見的,是為了減小執行動態語言腳本的風險。如果被成功上傳了一個webshell,但是不能執行,還是能夠起到深度防禦的作用。
第二點,在判斷文件類型的時候,我們一般要求使用白名單,而不是黑名單,因為黑名單可能會列不全,還可能會造成一些bypass的風險。
比如以前老版本的 FCKEditor就出過這種問題,只做了黑名單的控制,最後被bypass。
而apache有個特性,是解析第一個「 . 」後的文件後綴作為文件類型,比如 fvck.php.rar.rar.rar 會被apache當作 fvck.php解析。 我最近看了下php的手冊,在安裝文檔里,針對這個問題,專門有一個指導:
15. Tell Apache to parse certain extensions as PHP. For example, lets have
Apache parse .php files as PHP. Instead of only using the Apache AddType
directive, we want to avoid potentially dangerous uploads and created
files such as exploit.php.jpg from being executed as PHP. Using this
example, you could have any extension(s) parse as PHP by simply adding
them. Well add .phtml to demonstrate.
<FilesMatch .php$>
SetHandler application/x-httpd-php
</FilesMatch>
IIS6也有這種類似的特性,即在文件夾名字為 fvck.asp 時(fvck可替換為任意值),該文件夾下任何文件都會被當作asp來執行,
至今似乎也未見到微軟有把這個特性當作bug來fix的跡象。
所以如果不熟悉這些webserver的特性,你可能會覺得漏洞來的如此神奇:我明明做了充分限制,為什麼還是被「做俯卧撐」了?
在判斷文件類型的時候,大多數程序都是使用的採用檢查文件後綴的方法,這里主要需要注意的hacking trick是某些檢查函數是否會以0位元組作為結束的判斷,以前動網就出過類似的漏洞,上傳 fvck.jpg%00.asp即可繞過文件類型檢查。
我也見過只檢查文件頭部的,這種也很好欺騙,構造一個合法的gif文件頭部,然後將webshell貼在後面,在後綴合法的情況下,一樣能夠被瀏覽器解析:
GIF89a ?
<? phpinfo(); ?>
比較高級一點的是做更多的文件格式檢查,比如檢查圖片里像素的長寬等,然後再對圖片做一次壓縮,這樣出來的圖片基本都變形了,有啥webshell也被破壞了。
而檢查文件格式時候一般會用到一些網上已經封裝好的類,在掃描文件格式方面還是比較有優勢的。但是在檢查大文件的時候效率顯然是一個需要考慮的問題,很多程序員出於效率原因可能不太會願意選擇這種方式。
但是今天從PDP的這個綁定文件的猥瑣方法看來,詳細檢查文件格式的方法還是非常有必要的,因為攻擊者的目標可能不光是伺服器,還是客戶端,如果要對客戶端有所保證,就必須要詳細檢查文件格式,使之落在白名單中。
第三點,單獨設置文件伺服器域名,也是一種針對客戶端的保護。這樣可能會避免許多跨域的問題。如果發生了XSS,攻擊者可能還需要突破跨域的限制才能進一步擴大戰果。再比如如果被上傳了crossdomain.xml,可能就會導致flash的跨域問題,這些都是實實在在的風險。
第四點,改寫文件名,隨機文件路徑。這是把風險藏起來,現在基本上盡職一點的程序員都會這么設計,這也是最大程度減小風險的非常切實有效的手段。
需要注意的是構造隨機文件名或路徑的演算法需要足夠「隨機」,而不要從比如cookie之類的地方直接取一段hash出來。比較好的做法是在server上用類似random()一類的函數來生成,相信程序員們這點意識還是有的,不再贅述了。

❽ php文件上傳

如果 即使存在也不是重要文件的話,可以不管文件是否存在, 直接刪了再move就行。
**********
**********
**********

$dir = '../../images/proct/';
$filepath = $dir . $id . '.' . $file_ext;

/* 添加部分 */
@unlink($filepath );

if (is_uploaded_file($tmp_filename)) { //判斷是否通過HTTP POST上傳
******************
******************
******************

❾ php上傳文件

前端頁面:

<formaction=""method="post"enctype="multipart/form-data">
<inputtype="file"name="file">
<inputtype="submit"name="submit"value="Submit">
......
</form>

後台接收頁面:

if(is_uploaded_file($_FILES['file']['tmp_name'])){
if(move_uploaded_file($_FILES['file']['tmp_name'],'目標路徑')){
//上傳成功
}else{
//上傳失敗
}
}

❿ php文件上傳怎麼做

PHP上傳用到的知識(不懂的可以到網上找資料):1、FORM標簽enctype屬性表單中enctype="multipart/form-data"的意思,是設置表單的MIME編碼。默認情況,
這個編碼格式是application/x-www-form-urlencoded,不能用於文件上傳;
只有使用了multipart/form-data,才能完整的傳遞文件數據 input標簽 type 屬性中的 "file"
2、$_FILES 系統函數 $_FILES['myFile']['name'] 客戶端文件的原名稱。
$_FILES['myFile']['type'] 文件的 MIME 類型,例如"image/gif"。
$_FILES['myFile']['size'] 已上傳文件的大小,單位為位元組。
$_FILES['myFile']['tmp_name'] 儲存的臨時文件名,一般是系統默認。
$_FILES['myFile']['error'] 該文件上傳相關的錯誤代碼。

熱點內容
我的世界國服pvp伺服器ip地址 發布:2025-08-17 19:45:35 瀏覽:497
聊城電腦伺服器 發布:2025-08-17 19:34:59 瀏覽:407
互聯網編程語言 發布:2025-08-17 19:18:40 瀏覽:851
python主流框架 發布:2025-08-17 19:11:51 瀏覽:176
開源海量文件存儲 發布:2025-08-17 19:07:05 瀏覽:193
帶密碼的發票有什麼用 發布:2025-08-17 18:53:18 瀏覽:689
免費php模板下載 發布:2025-08-17 18:47:31 瀏覽:240
ubuntuphp開發 發布:2025-08-17 18:34:44 瀏覽:499
c語言小程序游戲 發布:2025-08-17 18:23:09 瀏覽:801
ios今日頭條源碼 發布:2025-08-17 18:23:02 瀏覽:309