السلام عليكم
الحمد لله والصلاة والسلام على محمد رسول الله وعلى أله وصحبه ومن والاه
أما بعد :
الحمد لله والصلاة والسلام على محمد رسول الله وعلى أله وصحبه ومن والاه
أما بعد :
كيف الحال شباب أتمنى تكونو بخير
قمت ولله الحمد ببرمجة كلاس رائع جدا لرفع الملفات وقد ركزت في الكلاس على التحقق من الملف او الصورة المرفوعة . هل هذا الملف المرفوع في الأصل شل أو ليس بشكل
لأنه في الآونة الأخير ظهرت تغرة قوية لإختراق المواقع من خلال مراكز الرفع هذه التغرة تعتمد على رفع شل بصيغة صورة أو ملف
وهذه التغرة تعتمد على خاصية في موزيلا إسمها tamper data لتحويل إمتداد الصور إلى إمتداد php وبالتالي يتم رفع الشل بصيغة php وتتحكم في الموقع بشكل كامل .
لهذا قمت ببرمجة كلاس محمي لرفع الملفات ، وأي ملف تم رفعه يتم التحقق منه هل هو محمي أو لا فإذا كان محمي يتم رفعه ، وإن لم يكن كذلك يتوقف الرفع . ففي مجموعة من مراكز الرفع البسيطة الموجودة في المنتدىيات وخاصة في النسخة العادية مثل ديهوك وعالم الرياضة وبعض السكريبتات يمكن رفع شل من خلال مراكز الرفع الموجودة في هذه السكريبتات .
المهم كل من يريد عمل مركز رفع في موقعه فله خياران لا ثالث لهما :
- إذا كان عنده مركز رفع عادي يجعله متاح فقط لمن يثق فيه . لا أنصحه بأن يجعله للعوام ، كل من هب وذب يقوم بالرفع
- وإذا كان ضروري إتاحة مركز الرفع فلابد من إستعمال الكلاس الذي سأضع في الشرح .
مع هذا الكلاس تكون في راحة تامة بأن مركز الرفع لن يرفع بواسطته إلا الملفات المسموح بها
طريقة إستعمال الكلاس مشروحة في ملف الكلاس
أنصح بإستعمال الكلاس في مراكز الرفع الخاصة بمواقعكم
أولا الكلاس
<?php
# تمت برمجة كلاس المعجزة في رفع الملفات بواسطة يوسف شهيري
# يمنع إستخدام الكلاس فيما يخالف تعاليم الدين الإسلامي وما عليه أهل السنة والجماعة
# name : Class Xmiracle Upload Files v : 0.1
# author : Youssef Chahiri
# email : MrYoucha@gmail.com
# date : 25 - 09 - 2012 17:17
# site : www.MrYoucha.com or www.Dev-Arb.com
class XmUpFiles {
public $Fname = false;
public $FnameNew = false;
public $Ftype = false;
public $Fsize = false;
public $Ftemp = false;
public $F_Msize = false;
public $F_Tmp = array();
public $F_Dir = false;
public $Img_H = false;
public $Img_V = false;
public $Create_Img = false; // url image print . # ضروري يكون الرابط png
public function __construct($field="file",$F_Dir=false,$F_Msize=false,$F_Tmp=array('image/png','image/gif','image/jpeg'),$Create_Img=false){
if(!isset($_SESSION)){
session_start();
}
session_start();
$info = $_FILES[$field] ;
$this->Fname = $info['name'];
$this->FnameNew = $this->FnameNew ;
$this->Ftype = $info['type'] ;
$this->Ftemp = $info['tmp_name'] ;
$this->Fsize = $info['size'] ;
$this->F_Dir = $F_Dir ;
$this->F_Msize = $F_Msize ;
$this->F_Tmp = $F_Tmp ;
$this->Create_Img = $Create_Img ;
$this->F_Tmp ($F_Tmp) ;
}
public function FnameNew(){
#$time = rand(1,1000);
$time = time();
$md5 = md5(sha1(md5($time))) ;
$result = $md5.$this->Fname;
return $result ;
}
public function F_url(){
$result = $this->F_Dir.$this->FnameNew();
return $result ;
}
public function F_Tmp($F_Tmp=false){
IF(count($F_Tmp) > 0):
$result = $this->F_Tmp ;
ELSE:
$result = array('image/png','image/gif','image/jpeg') ;
ENDIF;
return $result ;
}
public function Ckeck_Type(){
IF(!in_array($this->Ftype,$this->F_Tmp() )):
$result = false ;
ELSE:
$result = true ;
ENDIF;
return $result ;
}
public function IsType(){
foreach($this->F_Tmp() as $f){
$typefile = strrchr($f,'/') ;
$typefile = str_replace("/","",$typefile);
echo '--> '. $typefile .'<br >' ;
}
}
public function Up_Img($createimg="flase"){
if($this->Ckeck_Type() == true){
if($this->Check_Safe($this->Ftemp) == true and $this->Check_Shell($this->Ftype, $this->Ftemp) == true){
/*if ($_SESSION['Up_'.$this->Fname.$this->Fsize] > time() - 60*60*24*31 ){
$msg = 'تم رفع الملف '.$this->Fname.' من قبل ';
echo $msg.'<br />' ;
return false ;
} */
if(@move_uploaded_file($this->Ftemp,$this->F_url())){
if($createimg== "true") $this->Create_Img() ; # echo '<img src="'.$this->Create_Img().'" img/><br />' ;
$_SESSION['Up_'.$this->Fname.$this->Fsize] = time() ;
return true ;
}else{
$msg = 'تعليمات : لم يتم رفع الملف <span style="font-weight: bold;">'.$this->Fname.'</span> لخطأ حدث في الدالة <span style="font-weight: bold;">move_uploader_file</span>';
echo $msg.'<br />' ;
return false ;
}
}else{
$msg = 'تعليمات : إكتشف نظامنا أن الملف <span style="font-weight: bold;">'.$this->Fname.'</span> غير آمن ويحتوي على أكواد خبيثه .. !!!';
echo $msg.'<br />' ;
return false ;
}
}else{
$msg = 'إمتداد الملف <span style="font-weight: bold;">'.$this->Fname.'</span> الذي تريد رفعه غير مسموح به';
echo $msg.'<br />' ;
return false ;
}
}
#----------> دالة للتحقق من توفر هذه الإمتدادات في صيغة أو محتوى الملف المرفوع
public function Check_Safe ($filename=false) {
$not_allowed = array('php', 'php3' ,'php5', 'php4', 'asp' ,'shtml' , 'html' ,'htm' ,'xhtml' ,'phtml', 'pl', 'htaccess', 'cgi', 'ini');
$tmp = explode(".", $filename);
$before_last_ext = $tmp[sizeof($tmp)-2];
if (in_array(strtolower($before_last_ext), $not_allowed)) return false;
else return true;
}
#----------> دالة للتحقق من أن الملف المرفوع ليس بشل تم تغيير صيغته
public function Check_Shell ($mime=false, $file_path=false){
$return = false;
$s_items = @explode(':', 'image:png:jpg:tif:tga:targa');
foreach($s_items as $r){
if(strpos($mime, $r) !== false){
$return = true;
break;
}
}
#-------> التحقق من توفر كود مخالف في الملف
$not_allowed = $this->Check_Safe($file_path) ;
if (ereg($not_allowed, @file_get_contents($file_path))) {
$return = false;
}
#-------> التحقق من توفر كود مخالف في الملف بطريقة أخرى
if($return == true) {
if(@filesize($file_path) > 4*(1000*1024)) return true;
$maybe_bad_codes_are = array('<script', 'zend', '<?php', 'function', 'base64_decode' ,'iframe', ' ', 'ioncube', 'loader', 'style', 'link', 'quot');
if(!($data = @file_get_contents($file_path))) return true;
foreach($maybe_bad_codes_are as $i) {
if(strpos(strtolower($data), $i) !== false) {
$return = false;
break;
}
}
}
return $return;
}
public function Create_Img ($CreateImg=false) {
#IF($CreateImg == "true")
$img= $this->Make_Img();
$im2 = $this->Img_Print();
#--> القيم التالية 210,150,0,0 تعني مكان ظهور الصورة التي المستعملة في الختم على الصورة المرفوعة
imageCopyMerge($img, $im2,210,150,0,0,(imageSX($im2)),(imageSy($im2)),100);
#--------> تخزين الصورة في الداكرة
ob_start();
Imagejpeg($img,'',100);
$Image = ob_get_contents();
ob_end_clean();
#--------> الكتابة على الصورة المخزنة في الذاكرة
$name3= $this->F_url() ;
$fd = fopen ($name3, "w");
fwrite ($fd, $Image);
fclose ($fd);
return $name3 ;
#ENDIF ;
}
public function Make_Img(){
switch(strtolower($this->Ftype)){
case 'image/jpeg': $img = imagecreatefromjpeg($this->F_url() );break;
case 'image/jpg': $img = imagecreatefromjpeg($this->F_url() );break;
case 'image/gif': $img = imagecreatefromgif( $this->F_url() );break;
case 'image/png': $img = imagecreatefrompng( $this->F_url() );break;
case 'image/bmp': $img = imagecreatefromwbmp($this->F_url() );break;
}
return $img ;
}
public function Img_Print(){
/*switch(strtolower($this->Create_Img)){
case 'image/jpeg': return imagecreatefromjpeg($this->Create_Img );break;
case 'image/jpg': return imagecreatefromjpeg($this->Create_Img );break;
case 'image/gif': return imagecreatefromgif( $this->Create_Img );break;
case 'image/png': return imagecreatefrompng( $this->Create_Img );break;
}*/
return imagecreatefrompng($this->Create_Img) ;
}
public function Get_WH_Photo(){
$dimension = getimagesize($this->Ftemp);
$large_width = $dimension[0]; // GET PHOTO WIDTH
$large_height = $dimension[1]; //GET PHOTO HEIGHT
}
}
?>
تشغيل الكلاس الكل مشروح في التعليقات
لا تنسى تعمل مجلد لرفع الملفات يكون بإسم
upload
$Up = new XmUpFiles(
'file', // إسم الحقل الخاص برفع الملفات
'upload/', // مجلد رفع الملفات
10240000, // حجم الملفات المرفوعة -> كل 1024 يساوي 1 كيلو بايت
array('image/png','image/gif','image/jpeg','image/bmp'), // الملفات المسموحة برفعها
'logo.png' // إسم الصورة التي يختم بها على الصورة المرفوعة . طبعا في حالة تشغيل خاصية الحتم على الصور
) ;
الصورة
logo.png
هي التي تظهر على الصور المرفوعة في حالة تشغيل خاصية الختم على الصور
تنبيه : ضروري إمتداد الصورة يكون png
ثالثا فورم رفع الملفات
<meta charset="utf-8" /> <form action="class.XmUpload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="Uplaoder"/> <input type="hidden" name="do" value="upload"/> </form>
رابعا التحققات الخاصة بالملف المرفوع
if(isset($_POST['do']) && $_POST['do'] == "upload"){
if($Up->Fname == ""){
echo 'إختر ملفا';
}
else if ($Up->Fsize > $Up->F_Msize){
echo 'الحجم المسموح به هو '.$Up->F_Msize.' بايت' ;
}
else if ($Up->Ckeck_Type() == false){
echo 'يسمح فقط بالإمتدادات أعلاه '.$Up->IsType().' <br />' ;
}
else if ($Up->Check_Safe($Up->Ftemp) == false){
echo 'تعليمات : إكتشف نظامنا أن الملف <span style="font-weight: bold;">'.$Up->Fname.'</span> غير آمن ويحتوي على أكواد خبيثه .. !!!';
}
else if ($Up->Check_Shell($Up->Ftype, $Up->Ftemp) == false){
echo 'تعليمات : إكتشف نظامنا أن الملف <span style="font-weight: bold;">'.$Up->Fname.'</span> غير آمن ويحتوي على أكواد خبيثه .. !!!';
}
else if ($_SESSION['11Up_'.$Up->Fname.$Up->Fsize] > time() - 60*60*24*31 ){
echo'تم رفع الملف '.$Up->Fname.' من قبل ';
}
else{
$_SESSION['Up_'.$Up->Fname.$Up->Fsize] = time() ;
if($Up->Up_Img("true")){ // في حالة لا تريد تشغيل الختم على الصور أزل القيمة true
echo '<img src="'.$Up->F_url().'" width="250" img/><br />' ;
echo '<a href="'.$Up->F_url().'">'.$Up->Fname.'</a>' ;
}
}
في حالة لا تريد تشغيل خاصية الختم على الصور أزل القيمة true من الدالة
Up_Img
لتصبح النتيجة في التحقق الأخير
else{
$_SESSION['Up_'.$Up->Fname.$Up->Fsize] = time() ;
if($Up->Up_Img()){
echo '<img src="'.$Up->F_url().'" width="250" img/><br />' ;
echo '<a href="'.$Up->F_url().'">'.$Up->Fname.'</a>' ;
}
}
أي شيئ غامض المرجوا طرحه في الموضوع لنناقشه
لا ترد قبل أن تجرب
تحياتي للجميع

1 comments:
السلام عليكم ورحمه الله وبركاته ،،
تعليقأشرك على المشآركة بـ ملف البرمجي وجآري بإذن الله قراءة والإستفادة من الأكواد
جعله الله في ميزآن حسناتك ^^
تحياتي لكـ ، مهند الريسي
إرسال تعليق