|
|
|
เช็คนามสกุลไฟล์ก่อนอับโหลด ไม่ให้อับโหลดไฟล์นามสกุล .exe ขอตัวอย่างโค้ดด้วยครับ โค้ด ที่check type ของผมอยู่ บรรทัดที่ 47 |
|
|
|
|
|
|
|
Code (PHP)
<?php
session_start();
include "conn.php";
$Mem_ID = $_SESSION['ses_user_id'];
echo '<pre>';
print_r($_FILES);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title><?php echo $title_web; ?></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/style.css" rel="stylesheet">
</head>
<body>
<?php
if(!empty($_FILES))
{
//*************************************Create Folder******************************
//เพื่อป้องกัน file ของ user ชื่อซ้ำกัน ตั้งfile_uploads/ID ของ user นั้น
$folder = "file_uploads/" . $Mem_ID . '/';//เก็บไฟล์ไว้ที่ไหน
if (!file_exists($folder))//ถ้าfloder นี้ไม่มีให้สร้าง folder ใน if
{
mkdir($folder, 0777);//0777 permission
}
//**********************************End Create Folder******************************
$fileTamp = $_FILES['upfile']['tmp_name'];//ต้นทางไฟล์
$fileName = $_FILES['upfile']['name'];//ชื่อไฟล์
$fileSize = $_FILES['upfile']['size'];//ขนาดไฟล์
$type = $_FILES['upfile']['type'];//นามสกุล
//**********************************ที่อยู่ของไฟล์*********************************
for($i=0;$i<count($fileName);$i++)
{
$targetFile[$i] = $folder.$fileName[$i];//เอาชื่อไฟล์กับ folder มาต่อกัน = เป้าหมายไฟล์
}
//**********************************จบ ที่อยู่ของไฟล์*********************************
//************************Check Type**************************************************
for($i=0;$i<count($type);$i++)
{
//strpos ตำแหน่งของ application อยู่ตำแหน่งที่ 0 และในชื่อไฟล์ มีคำว่า.exe อยู่
//ถ้ามีไฟล์ .exe ไฟล์เดียว ก็จะยกเลิกทั้งหมด
if (strpos($type[$i], 'application')===0 && strpos($fileName[$i],'.exe' )>0)
{
echo "<div class='error'> Can't upload " . $fileName[$i] . " because file type .exe</div>";
exit;
}
}
//************************END Check Type**************************************************
//************************Check Size**************************************************
//เช็คว่าใน Mem_storage เหลือเท่าไร
$sql = mysqli_query($conn,"select * from member where Mem_ID = '$Mem_ID' ") or die (mysqli_error());
$result = mysqli_fetch_assoc($sql);
$total = $result['Mem_Storage'];//ผลรวมไฟล์ของสมาชิก แปลงเป็นหน่วย MB มาจาก ข้างล่างแล้ว
//check ไฟล์ที่เพิ่งอับโหลดเข้าไป และ แปลงหน่วยจาก byte เป็น MB
$filetotal = 0;
for($i=0;$i<count($fileSize);$i++)
{
$fileSize[$i] = $fileSize[$i]/1024/1024;// แปลงขนาดไฟล์เป็น mb fileมาเป็นmb/1024kb/1024b
$filetotal += $fileSize[$i];//ผมรวมไฟล์ที่อับโหลดเข้ามา
}
if($total-$filetotal <= 0 )//ถ้าเกินไฟล์นึง ก็จะ ยกเลิกทั้งหมด
{
echo "<div class='error'> File Size Over Limit - Fail</div>";
exit;
}
//************************END Check Size**************************************************
//************************Upload Finnish**************************************************
for($i=0;$i<count($fileName);$i++)
{
//**********************************gen url******************************
$ret_char = "";//ค่าว่าง
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";//0-61ตัว
$num = strlen($chars);//ความยาวstr ได้62ตัว
for($a = 0; $a < 9; $a++)
{
$ret_char.= $chars[rand()%$num];//วนลูบ9รอบนำมาต่อกัน แรนด้อมเลขmodด้วยความยาวstr หารเอาเศษ
}
//**********************************End gen url******************************
if (file_exists($targetFile[$i]))//ถ้ามีชื่อไฟล์อยุ่แล้วไม่ให้อับโหลด
{
echo "<div class='warning'>Upload File " . $fileName[$i] . " already exist! </div>";
}
else if(move_uploaded_file($fileTamp[$i], $targetFile[$i]))//ชื่อไฟล์,ปลายทางที่จะย้ายไฟล์ไฟล์
{
@mysqli_query($conn,"insert file_upload set Fil_File = '".$Mem_ID . '/' . $fileName[$i]."',Fil_Size = '".$fileSize[$i]."',Fil_Link = '$ret_char',Fil_DateCreate = now(), Fil_Expire = DATE_ADD(now(), INTERVAL 30 DAY ) ,Mem_ID = '$_SESSION[ses_user_id]'")or die (mysqli_error());
echo "<div class='success'>Upload File " . $fileName[$i] . " sucess </div>";
$sql = mysqli_query($conn,"select * from member where Mem_ID = '$Mem_ID' ") or die (mysqli_error());
$result = mysqli_fetch_assoc($sql);
$total = $result['Mem_Storage']-$fileSize[$i];
@mysqli_query($conn,"UPDATE member SET Mem_Storage = '$total' WHERE Mem_ID = '$Mem_ID' ") or die (mysqli_error());
}
}
//************************End Upload Finnish**************************************************
echo '<a href="upload.php">click to refresh!</a>';
}
?>
</body>
</html>
Tag : PHP, MySQL, HTML5, Ajax, Appserv, Windows
|
|
|
|
|
|
Date :
2018-01-10 01:11:20 |
By :
lemon29 |
View :
2567 |
Reply :
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมต้องการ ที่จะเขียนให้เป็น
1. ชื่อไฟล์ a.exe ไม่สามารถอับโหลดได้ แม้จะเปลี่ยนชื่อไฟล์ เป้น a.jpg ก็ไม่สามารถอับโหลดได้
2.ตรวจสอบนามสกุลไฟล์ ไม่ให้อับโหลด .exe ได้เช่น a.exe.jpg.txt นามสกุลคือ .txt สามารถอับโหลดได้
แต่ถ้า a.exe ไม่สามารถอับได้
ขอบคุณล่วงหน้าครับ
|
|
|
|
|
Date :
2018-01-10 01:12:34 |
By :
lemon29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถ้าแบบข้อ 2 ก็พอจะเช็คได้
Code (PHP)
if( 'exe' == end(($x=explode('.', $filename))){
die('file type error');
}
//หรือ
if( preg_match('/\.exe$/', $filename)){
die('file type error');
}
แต่ถ้าแบบข้อ 1 คุณต้องรู้เรื่อง format ของไฟล์ แต่ละชนิด
นามสกุล .exe มีรูปแบบอย่างไร ถึงจะสามารถ เช็คได้
นามสกุล .com มีรูปแบบอย่างไร ปวดหัวตาย
|
|
|
|
|
Date :
2018-01-10 01:27:16 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณมากครับ Chaidhanan พอดีผมมือใหม่ครับ
ส่วนของข้อ2 เขียนแบบนี้ได้เหมือนกันไช่มะครับ
Code (PHP)
for($i=0;$i<count($type);$i++)
{
//substr หา 4ตัวท้าย มีคำว่า.exe อยู่
//ถ้ามีไฟล์ .exe ไฟล์เดียว ก็จะยกเลิกทั้งหมด
if (substr($fileName[$i],-4) == ".exe")
{
echo "<div class='error'> Can't upload " . $fileName[$i] . " because file type .exe</div>";
exit;
}
}
ส่วนข้อ 1 ผมลอง ดู
https://stackoverflow.com/questions/8444638/how-to-read-header-of-a-file-uploaded-in-php
อันนนี้เป้นรายชื่อไฟล์
http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
ส่วนของ นามสกุล .exe มี mine type เป็นแบบนี้ึีครับ
application/x-msdownload exe dll com bat msi
แต่ผมยังหาวิทีใช้ยังไม่ได้ครับ พอมีแนวทางไหมครับ
|
|
|
|
|
Date :
2018-01-10 14:47:36 |
By :
lemon29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
การกำหนดใน mimetype เป็นการอนุญาตให้ transfer file ได้
ถ้าไม่อนุญาต ก็ไม่ต้องใส่ ใน mimetype แต่ก็เป็นการเช็คแค่ นามสกุลเท่านั้น
แต่อยากรู้ว่าจะทำอะไรถึงต้องการ security ถึงขนาดนั้น
คือถ้าเราไม่ไปสั่ง execute มันก็เหมือนไฟล์ขยะเท่านั้นเอง
|
|
|
|
|
Date :
2018-01-10 17:40:02 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุนครับ ตอนนี้ผมใช้ is_executable แล้วครับ
|
|
|
|
|
Date :
2018-01-15 18:42:52 |
By :
lemon29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอสอบถามอีกนิดครับ
ระหว่าง ฟั่งก์ชั่น
is_executable กับ FILEINFO_MIME_TYPE มันต่างกันยังไงหรอครับ พอทราบไหมครับ
|
|
|
|
|
Date :
2018-01-24 02:05:38 |
By :
lemon29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมรบกวนขอ E-mail ติดต่อสอบถามหน่อยได้หรือเปล่าครับ พอดีทำโปรเจคจบเรื่องนี้อยู่ครับ ขอบคุณมากครับ
|
|
|
|
|
Date :
2018-01-24 02:16:06 |
By :
lemon29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 04
|