php文件上傳後綴名
1. php獲取上傳文件擴展名$filename= md5(time().rand(0,9).$_FILES["filedata"]["name"]).".bmp";
$filename=md5(time().rand(0,9).$_FILES["filedata"]["name"]).'.'.pathinfo($_FILES["filedata"]["name"],PATHINFO_EXTENSION);
2. 如果頁面提示不能上傳php文件那麼使用擴展名繞過方式上傳文件的話下列哪種方+
如果網頁限制了上傳PHP文件,可以嘗試使用以下方式繞過該限制上傳PHP文件:
1. 使用雙擴展名 - shell.php.jpg
伺服器可能只檢查第一個擴展名,這個可以上傳PHP文件並重命名為PHP執行。
2.使用空白符 - shell.php%20.jpg
一些伺服器過濾規則可能會忽略空白符,導致繞過。
3.使用大寫擴展名 - shell.PHP
有的伺服器僅檢查小寫擴展名。
4.使用特殊編碼 - shell.php%00.jpg
一些過濾器可能會忽略空字元00,從而可繞過。
5.使用條件注釋 - shell.php#.jpg
空格和#可能被過濾跳過而造成繞過。
6.使用特殊的雙擴展名 - shell.php.php5.jpg
一些過濾僅校驗第一個點。
7.切分文件頭和內容分開上傳
但是這些方法都依賴伺服器端的過濾規則不夠完善,從安全形度來說,伺服器端最好進行白名單驗證,而不是僅僅黑名單限制,從根本上杜絕文件上傳漏洞。
另外,作為用戶我們也不應該嘗試非法繞過上傳限制或者上傳不需要的webshell。
3. php文件上傳RAR的mime類型
首先要建立一個文件夾和兩個文件,具體如下:
File ——————文件夾,用於存放上傳的文件。
choose.htm ——————htm文件,用於選擇上傳的文件。
upload.php ——————php文件,用於處理上傳的文件。
第一步:建立 File 文件夾。
第二步:建立 choose.htm 文件,代碼如下:
____________________________________________________________________________________________________________
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FLIE_SIZE" value="1000000" />
上傳此文件:
<input name="userfile" type="file" id="userfile" />
<input type="submit" name="Submit" value="上傳" />
</form>
____________________________________________________________________________________________________________
第三步:建立 upload.php 文件,代碼如下:
____________________________________________________________________________________________________________
<?php
//上傳文件錯誤判定
if($_FILES['userfile']['error']>0)
{
echo '錯誤:';
switch($_FILES['userfile']['error'])
{
case 1: echo '文件尺寸超過允許的最大上傳限度!'; break;
case 2: echo '文件尺寸超過允許的最大上傳限度!'; break;
case 3: echo '只有部分文件被上傳!'; break;
case 4: echo '沒有任何文件被上傳!'; break;
}
exit;
}
//上傳文件格式判定
if($_FILES['userfile']['type'] !='text/plain')
{
echo '錯誤:非法文件格式!';
exit;
}
//設置文件保存路徑
$upfile = './File/' . $_FILES['userfile']['name'];
if(is_uploaded_file($_FILES['userfile']['tmp_name']))
{
if(!move_uploaded_file($_FILES['userfile']['tmp_name'],$upfile))
{
echo '錯誤:沒有將文件移動到指定目錄!';
exit;
}
}
else
{
echo '錯誤:可能文件上傳被攻擊!文件名:';
echo $_FILES['userfile']['name'];
}
echo '文件上傳成功!';
//格式化上傳的文件
$fp = fopen($upfile,'r');
$contents = fread($fp,filesize($upfile));
fclose($fp);
$contents = strip_tags($contents);
$fp = fopen($upfile,'w');
fwrite($fp,$contents);
fclose($fp);
//顯示上傳文件內容
echo '上傳文件的內容為:';
echo $contents;
?>
____________________________________________________________________________________________________________
測試一下:
1、建立一個 123.txt 文件,裡面輸入一些純文本字元,比如 abc,上傳成功!
2、我們再來試看其他後綴名,如.exe,.php,.htm之類的,只要非txt,就將導致失敗!
3、把任意一個大於1M的文件名改為123.txt並上傳,我們將發現超過限制大小的文件將導致上傳失敗!
4、將123.txt的內容改掉,刪除所有內容,輸入 <html>HTML code</html>,保存並上傳,我們會發現上傳失敗!
5、將123.txt的內容改掉,刪除所有內容,輸入 <?php echo'PHP code'; ?>保存並上傳,我們會發現 File 文件夾中有一個0位元組的,沒有任何內容的123.txt文件!
4. php 圖片上傳move_uploaded_file 出錯
上傳文件不存在。很可能是PHP臨時文件夾不存在導致的。
<?php
/*
* 文件上傳類
*/
class Uploads{
//上傳文件
private $uploadFile;
//上傳文件擴展名
private $ext = array('jpeg','jpg','gif','png');
//上傳文件大小
private $size = 5000000;
//上傳文件目錄
private $uploadDir = './uploads/';
//是否自定義名稱,默認FALSE
private $newName = '';
//上傳文件是否可讀,默認為TRUE
private $isRead = TRUE;
//上傳文件是否可寫,默認為TRUE
private $isWrite = TRUE;
//上傳信息
private $info;
/*
* 文件上傳類初始化
*/
public function __construct($newName='',$ext='',$size='',$dir='',$isRead=TRUE,$isWrite=TRUE){
$this->ext = empty($ext)?$this->ext:$ext;
$this->size = empty($size)?$this->size:$size;
$this->dir = empty($dir)?$this->uploadDir:$dir;
$this->newName = $newName;
$this->isRead = $isRead?TRUE:FALSE;
$this->isWrite = $isWrite?TRUE:FALSE;
}
/*
* 處理上傳文件
*/
public function doUpload(){
$this->checkData();
$this->checkFile() or $this->error();
$this->checkExt() or $this->error();
$this->checkSize() or $this->error();
$this->checkError() or $this->error();
$this->checkDir() or $this->error();
$this->upload() or $this->error();
return $this->info['msg'];
}
/*
* 處理上傳文件數據
*/
public function checkData(){
$num = 0;
$newArr = array();
foreach($_FILES as $v){
if(is_array($v['name'])){
$count = count($v['name']);
for($i=0; $i<$count; $i++){
foreach($v as $m=>$n){
$newArr[$num][$m] = $n[$i];
}
$num++;
}
}else{
$newArr[$num] = $v;
$num++;
}
}
$endArr = array();
foreach($newArr as $v){
if($v['name'] != ''){
$endArr[]=$v;
}
}
$this->uploadFile = $endArr;
}
/*
* 檢測上傳文件是否存在
*/
private function checkFile(){
if(empty($this->uploadFile)){
$this->info['error'] = '上傳文件不得為空!!!';
return FALSE;
}
return TRUE;
}
/*
* 檢測上傳文件類型是否合法
*/
private function checkExt(){
if(!is_array($this->ext)){
$this->ext = explode(',', $this->ext);
}
foreach($this->uploadFile as $v){
$ext = strtolower(substr(strrchr(basename($v['name']),'.'),1));
if(!in_array($ext,$this->ext)){
$this->info['error'] = '上傳文件類型非法,禁止上傳!!!';
return FALSE;
}
}
return TRUE;
}
/*
* 檢測上傳文件大小
*/
private function checkSize(){
foreach($this->uploadFile as $v){
if($v['size']>$this->size){
$this->info['error'] = '上傳文件體積過大,上傳失敗!!!';
return FALSE;
}
}
return TRUE;
}
/*
* 檢測文件上傳錯誤代碼
*/
private function checkError(){
foreach($this->uploadFile as $v){
switch($v['error']){
case 0:
return TRUE;
break;
case 1:
$this->info['error'] = '上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值,上傳失敗!!!';
return FALSE;
break;
case 2:
$this->info['error'] = '上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值,上傳失敗!!!';
return FALSE;
break;
case 3:
$this->info['error'] = '文件只有部分被上傳!!!';
return FALSE;
break;
case 4:
$this->info['error'] = '沒有文件上傳!!!';
return FALSE;
break;
}
}
return TRUE;
}
/*
* 檢測上傳文件夾是否存在
*/
private function checkDir(){
if(!file_exists($this->uploadDir)){
mkdir($this->uploadDir,0777,true);
}
if(!is_writeable($this->uploadDir)){
$this->info['error'] = '上傳目錄沒有寫入許可權,上傳失敗!!!';
return FALSE;
}
return TRUE;
}
/*
* 上傳文件
*/
private function upload(){
date_default_timezone_set('PRC');
//檢測文件是否自定義名稱
$name = empty($this->newName)?date('Ymd_His'):$this->newName;
foreach($this->uploadFile as $k=>$v){
$upload_path = $this->uploadDir.$name.'_'.($k+1).strrchr(basename($v['name']),'.');
$upload_path = iconv('UTF-8','gbk',$upload_path);
if(is_uploaded_file($v['tmp_name'])){
if(move_uploaded_file($v['tmp_name'], $upload_path)){
if($this->isRead && $this->isWrite){
chmod($upload_path,0777);
}else if($this->isRead && !$this->isWrite){
chmod($upload_path,0444);
}else if(!$this->isRead && $this->isWrite){
chmod($upload_path,0222);
}else{
chmod($upload_path,0000);
}
$this->info['msg']=array('type'=>1,'success'=>'文件上傳成功','path'=>iconv('gbk','UTF-8',$upload_path));
}else{
$this->info['error'] = '文件上傳失敗!!!';
return FALSE;
}
}
}
return TRUE;
}
/*
* 上傳成功的方法
*/
public function success(){
echo $this->info['msg']['success'];
}
/*
* 上傳文件錯誤方法
*/
public function error(){
echo $this->info['error'];
die;
}
這是我寫的PHP類,你可以參考一下。有什麼特殊需要的,你可以告訴我一下,完善一下上傳類。
5. php上傳圖片沒有文件名後綴
$filename = basename($_FILES['image']['name']);
$file_ext = strtolower(substr($filename, strrpos($filename, '.') + 1));
echo $file_ext;
請樓主先試試用這幾句看是否能獲取到後綴名
一般來說,即使系統沒有顯示後綴名,在php上傳中也是可以獲取到後綴名的
還有,就是要檢查一下,move_uploaded_file函數里,目標地址的圖片名稱是否拼接了後綴名
6. php 驗證上傳的文件類型為圖片,並獲得文件的後綴名
以下是我上傳了一個圖片後顯示的 $_FILES['filename']的信息
[filename] => Array
(
[name] => Winter.jpg
[type] => image/jpeg
[tmp_name] => /tmp/php2jw7QX
[error] => 0
[size] => 105542
)
其中type是文件類型的minitype 表示方法,例如普通的HTML的類型是text/html
如果你想用擴展名的方式判斷的話可以用以下代碼:
<?php
#允許的文件擴展名
$allowed_types = array('jpg', 'gif', 'png');
$filename = $_FILES['filename']['name'];
#正則表達式匹配出上傳文件的擴展名
preg_match('|\.(\w+)$|', $filename, $ext);
#print_r($ext);
#轉化成小寫
$ext = strtolower($ext[1]);
#判斷是否在被允許的擴展名里
if(!in_array($ext, $allowed_types)){
die('不被允許的文件類型');
}
?>
7. thinkphp3.2.3文件上傳怎麼配置cofig
$config = array(
'mimes' => array(), //允許上傳的文件MiMe類型
'maxSize' => 0, //上傳的文件大小限制 (0-不做限制)
'exts' => array(), //允許上傳的文件後綴
'autoSub' => true, //自動子目錄保存文件
'subName' => array('date', 'Y-m-d'), //子目錄創建方式,[0]-函數名,[1]-參數,多個參數使用數組
'rootPath' => './Uploads/', //保存根路徑
'savePath' => '', //保存路徑
'saveName' => array('uniqid', ''), //上傳文件命名規則,[0]-函數名,[1]-參數,多個參數使用數組
'saveExt' => '', //文件保存後綴,空則使用原後綴
'replace' => false, //存在同名是否覆蓋
'hash' => true, //是否生成hash編碼
'callback' => false, //檢測文件是否存在回調,如果存在返迴文件信息數組
'driver' => '', // 文件上傳驅動
'driverConfig' => array(), // 上傳驅動配置
);
$upload = new \Think\ Upload($config);