منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
[سؤال] تغيير الكود ليتوافق مع تفعيل خاصية safe mode - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (https://vb4arb.com/vb)
+-- قسم : قسم برمجة وتطوير المواقع (https://vb4arb.com/vb/forumdisplay.php?fid=51)
+--- قسم : قسم PHP (https://vb4arb.com/vb/forumdisplay.php?fid=58)
+---- قسم : قسم اسئلة PHP (https://vb4arb.com/vb/forumdisplay.php?fid=59)
+---- الموضوع : [سؤال] تغيير الكود ليتوافق مع تفعيل خاصية safe mode (/showthread.php?tid=56213)

الصفحات: 1 2


تغيير الكود ليتوافق مع تفعيل خاصية safe mode - nnnjk - 04-04-26

السلام عليكم ورحمة الله وبركاته
هذا الكود كان يعمل بدون مشاكل يختم الصور من الرابط او المرفقات
ولاكن عندما انتقلت الى استضافة تعمل على السيف مود وتجعل الرفع عن طريق مجلد مؤقت tmp فليت احد الاخوه
 يعدل الكود ليتوافق مع خاصية الحماية الفائقه للسيرفر
هذا الكود
PHP كود :
<?php
// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);
@
header('Content-type: text/html;charset=windows-1256');
//ini_set('default_charset','windows-1256');
// #################### DEFINE IMPORTANT CONSTANTS #######################
define('NO_REGISTER_GLOBALS'1);
define('THIS_SCRIPT''watermark');
$MDIR dirname(__FILE__);
define("MDIR"$MDIR);

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array();

// get special data templates from the datastore
$specialtemplates = array();

// pre-cache templates used by all actions
$globaltemplates = array();

// pre-cache templates used by specific actions
$actiontemplates = array();


// ######################### REQUIRE BACK-END ############################
require_once('./global.php');

// #######################################################################
// ######################## START MAIN SCRIPT ############################
// #######################################################################

$image $_GET['src'];
$minwidth $vbulletin->options[watermarkwidthdef];
$fontsize $vbulletin->options[watermarkfontsize];
$bandheight $vbulletin->options[watermarkbandheight];
$fontname $vbulletin->options[watermarkfontname];
$wmrkimage $vbulletin->options[watermarkimage];

$imagetype getimagesize($image);
            switch ($imagetype['mime']) {
    case "image/gif":
        $im = @imagecreatefromgif($image);
        break;
    case "image/jpeg":
        $im imagecreatefromjpeg($image);
        break;
    case "image/png":
        $im imagecreatefrompng($image);
        break;
     case "image/bmp":
        $im imagecreatefrombmp($image);
        break;
case 
"image/webp":
        $im imagecreatefromwebp($image);
        break;
    }
    
if(!empty(
$wmrkimage)){
$wmrkimagetype getimagesize($wmrkimage);
            switch ($wmrkimagetype['mime']) {
    case "image/gif":
        $stamp = @imagecreatefromgif($wmrkimage);
        break;
    case "image/jpeg":
        $stamp imagecreatefromjpeg($wmrkimage);
        break;
    case "image/png":
        $stamp imagecreatefrompng($wmrkimage);
        break;
    case "image/bmp":
        $stamp imagecreatefrombmp($wmrkimage);
        break;
    case "image/webp":
        $stamp imagecreatefromwebp($wmrkimage);
        break;
    }
}

$imagewidth imagesx($im);

if(empty(
$vbulletin->options[watermarktext])){
$watermarktext $vbulletin->options[bbtitle];
}
    else {
        
$watermarktext $vbulletin->options[watermarktext];
    }

if(
$imagewidth <= $minwidth){
  switch ($imagetype['mime']) {
    case "image/gif":
        header ("Content-type: image/gif");
    
readfile($image); 
        break;
    default:
        header ("Content-type: image/png");
        imagegif($im); 
    
imagedestroy($im);
        break;
    }
}
else {

if(empty(
$wmrkimage)){
//require_once('./I18N/Arabic.php');
//$Arabic = new I18N_Arabic('Glyphs');
 //$text = 'بسم الله الرحمن الرحيم';
$watermarktext "الشعافينمنحرب";
//$watermarktext = $Arabic->utf8Glyphs('$watermarktext');
$stamp imagecreatetruecolor($imagewidth$bandheight);
$ypoint $fontsize+round(($bandheight $fontsize)/2);
$ffontname MDIR."/includes/fonts/".$fontname;
ImageTTFText($stamp$fontsize015$ypoint0xFFFFFF$ffontname$watermarktext);
}
$marge_right 0;
$marge_bottom 0;
$sx imagesx($stamp);
$sy imagesy($stamp);
imagecopymerge($im$stampimagesx($im) - $sx $marge_rightimagesy($im) - $sy $marge_bottom00imagesx($stamp), imagesy($stamp), 50);

header ("Content-type: image/png"); 
imagepng($im);
imagedestroy($im);
 }
?>



RE: تغيير الكود ليتوافق مع تفعيل خاصية safe mode - Amir_Alzubidy - 04-04-26

عليكم السلام 
بالمناسبة حل مشكلة safe mode من خلال الاستضافة
و بمراجعة الدعم الفني بشكل مباشر

لكن هذا تعديل اتمنى ان يكون حل على الاقل مشكلة  المسارات الخارجية

PHP كود :
<?php
// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);
@
header('Content-type: text/html;charset=windows-1256');

define('NO_REGISTER_GLOBALS'1);
define('THIS_SCRIPT''watermark');
$MDIR dirname(__FILE__);
define("MDIR"$MDIR);

$phrasegroups = array();
$specialtemplates = array();
$globaltemplates = array();
$actiontemplates = array();

require_once(
'./global.php');

// ========================
// دالة مساعدة: تحميل الصورة بأمان عبر tmp
// ========================
function loadImageSafe($imagePath) {
    // إذا كان رابط URL خارجي
    if (filter_var($imagePathFILTER_VALIDATE_URL)) {
        $tmpFile tempnam(sys_get_temp_dir(), 'wmark_');
        
        
// استخدام cURL بدل file_get_contents (أكثر توافقاً مع Safe Mode)
        if (function_exists('curl_init')) {
            $ch curl_init($imagePath);
            curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
            curl_setopt($chCURLOPT_TIMEOUT15);
            curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
            $data curl_exec($ch);
            curl_close($ch);
            if ($data === false) return false;
            file_put_contents($tmpFile$data);
        } elseif (ini_get('allow_url_fopen')) {
            $data = @file_get_contents($imagePath);
            if ($data === false) return false;
            file_put_contents($tmpFile$data);
        } else {
            return false;
        }
        return $tmpFile;
    }

    // إذا كان مسار محلي
    $localPath realpath($imagePath);
    if ($localPath && file_exists($localPath)) {
        // نسخ إلى tmp لتجاوز قيود Safe Mode
        $tmpFile tempnam(sys_get_temp_dir(), 'wmark_');
        if (@copy($localPath$tmpFile)) {
            return $tmpFile;
        }
        // إذا فشل copy نحاول قراءة مباشرة
        return $localPath;
    }

    return false;
}

// دالة إنشاء GD image من ملف مؤقت
function createImageFromFile($filePath) {
    $info = @getimagesize($filePath);
    if (!$info) return false;

    switch ($info['mime']) {
        case 'image/gif':  return @imagecreatefromgif($filePath);
        case 'image/jpeg': return @imagecreatefromjpeg($filePath);
        case 'image/png':  return @imagecreatefrompng($filePath);
        case 'image/bmp':  return @imagecreatefrombmp($filePath);
        case 'image/webp': return @imagecreatefromwebp($filePath);
        default:           return false;
    }
}

// ========================
// بداية المنطق الرئيسي
// ========================
$imageSrc     $_GET['src'];
$minwidth     $vbulletin->options['watermarkwidthdef'];
$fontsize     $vbulletin->options['watermarkfontsize'];
$bandheight   $vbulletin->options['watermarkbandheight'];
$fontname     $vbulletin->options['watermarkfontname'];
$wmrkimage    $vbulletin->options['watermarkimage'];

// تحميل الصورة الأصلية عبر tmp
$tmpMain loadImageSafe($imageSrc);
if (!
$tmpMain) {
    header('HTTP/1.0 404 Not Found');
    exit('Image not found');
}

$imagetype = @getimagesize($tmpMain);
$im        createImageFromFile($tmpMain);

// تنظيف الملف المؤقت بعد الاستخدام
if ($tmpMain !== $imageSrc && $tmpMain !== realpath($imageSrc)) {
    @unlink($tmpMain);
}

if (!
$im) {
    header('HTTP/1.0 500 Internal Server Error');
    exit('Cannot process image');
}

// تحميل صورة الووترمارك إن وُجدت
$stamp null;
if (!empty(
$wmrkimage)) {
    $tmpStamp loadImageSafe($wmrkimage);
    if ($tmpStamp) {
        $stamp createImageFromFile($tmpStamp);
        if ($tmpStamp !== $wmrkimage && $tmpStamp !== realpath($wmrkimage)) {
            @unlink($tmpStamp);
        }
    }
}

// نص الووترمارك
if (empty($vbulletin->options['watermarktext'])) {
    $watermarktext $vbulletin->options['bbtitle'];
} else {
    $watermarktext $vbulletin->options['watermarktext'];
}

$imagewidth imagesx($im);

// إذا كانت الصورة أصغر من الحد الأدنى → أرسلها بدون ووترمارك
if ($imagewidth <= $minwidth) {
    switch ($imagetype['mime']) {
        case 'image/gif':
            header('Content-type: image/gif');
            readfile($imageSrc);
            break;
        default:
            header('Content-type: image/png');
            imagepng($im);
            imagedestroy($im);
            break;
    }
    exit;
}

// إنشاء شريط الووترمارك نصياً إن لم توجد صورة
if (empty($stamp)) {
    $stamp   imagecreatetruecolor($imagewidth$bandheight);
    $ypoint  $fontsize round(($bandheight $fontsize) / 2);
    $ffontname MDIR "/includes/fonts/" $fontname;
    ImageTTFText($stamp$fontsize015$ypoint0xFFFFFF$ffontname$watermarktext);
}

// دمج الووترمارك على الصورة
$marge_right  0;
$marge_bottom 0;
$sx imagesx($stamp);
$sy imagesy($stamp);

imagecopymerge(
    $im$stamp,
    imagesx($im) - $sx $marge_right,
    imagesy($im) - $sy $marge_bottom,
    00,
    $sx$sy,
    50
);

header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

إذا استمرت المشكلة 
PHP كود :
// أضف هذا مؤقتاً للتشخيص
var_dump(sys_get_temp_dir());
var_dump(is_writable(sys_get_temp_dir()));
var_dump(function_exists('curl_init')); 

إذا كان السيرفر يستخدم PHP 7+ فالمشكلة على الأرجح open_basedir وليس Safe Mode


RE: تغيير الكود ليتوافق مع تفعيل خاصية safe mode - nnnjk - 04-04-26

يعطيك العافيه
الكود الاول لم يعمل والكود الثاني مافهمت مكانه
شغلت الهاك اختفت الصور علامة ×
نسخة php هو 5.6

انشئت مجلد جديد بااسم wmark_ في المجلد الرئيسي وفي مجلد المنتدى واعطيته التصريح 0777
لاكن لازالت المشكله قائمه


RE: تغيير الكود ليتوافق مع تفعيل خاصية safe mode - Amir_Alzubidy - 05-04-26

PHP كود :
<?php
error_reporting
(E_ALL & ~E_NOTICE);
header('Content-Type: image/png');

define("MDIR"dirname(__FILE__));

// ================== إعدادات ==================
$watermark_text "الشعافينمنحرب"// نص الختم
$font MDIR "/includes/fonts/arial.ttf"// الخط
$font_size 18;
$band_height 35;

$save_dir MDIR "/wmark_/";

// ================== دالة تحميل الصورة ==================
function downloadImage($url$save_path) {
    // محاولة file_get_contents
    $data = @file_get_contents($url);

    if ($data !== false) {
        file_put_contents($save_path$data);
        return true;
    }

    // إذا فشل نستخدم cURL
    if (function_exists('curl_init')) {
        $ch curl_init($url);
        $fp fopen($save_path'wb');

        curl_setopt($chCURLOPT_FILE$fp);
        curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
        curl_setopt($chCURLOPT_TIMEOUT20);

        curl_exec($ch);
        curl_close($ch);
        fclose($fp);

        return file_exists($save_path);
    }

    return false;
}

// ================== جلب الصورة ==================
if (!isset($_GET['src'])) {
    die('No image');
}

$src trim($_GET['src']);
$filename md5($src) . ".img";
$local_image $save_dir $filename;

// تحميل الصورة إذا غير موجودة
if (!file_exists($local_image)) {
    if (!downloadImage($src$local_image)) {
        die('فشل تحميل الصورة');
    }
}

// ================== تحديد نوع الصورة ==================
$info getimagesize($local_image);
if (!
$info) {
    die('Invalid image');
}

switch (
$info['mime']) {
    case 'image/jpeg':
        $im imagecreatefromjpeg($local_image);
        break;
    case 'image/png':
        $im imagecreatefrompng($local_image);
        break;
    case 'image/gif':
        $im imagecreatefromgif($local_image);
        break;
    case 'image/webp':
        $im imagecreatefromwebp($local_image);
        break;
    case 'image/bmp':
        $im imagecreatefrombmp($local_image);
        break;
    default:
        die('نوع صورة غير مدعوم');
}

// ================== إنشاء طبقة الختم ==================
$width imagesx($im);
$stamp imagecreatetruecolor($width$band_height);

// خلفية سوداء شفافة
$black imagecolorallocatealpha($stamp00060);
imagefilledrectangle($stamp00$width$band_height$black);

// لون النص
$white imagecolorallocate($stamp255255255);

// كتابة النص
$y $font_size 5;
imagettftext($stamp$font_size010$y$white$font$watermark_text);

// ================== دمج الختم ==================
$stamp_w imagesx($stamp);
$stamp_h imagesy($stamp);

imagecopymerge(
    $im,
    $stamp,
    imagesx($im) - $stamp_w,
    imagesy($im) - $stamp_h,
    0,
    0,
    $stamp_w,
    $stamp_h,
    60
);

// ================== إخراج الصورة ==================
imagepng($im);

// تنظيف
imagedestroy($im);
imagedestroy($stamp);
?>
طريقة الاستخدام : 
PHP كود :
watermark.php?src=https://example.com/image.jpg 
ملاحظة : تأكد من وجود الخط: /includes/fonts/arial.ttf
إذا لم يكن موجود، سيفشل الكتابة على الصورة.


RE: تغيير الكود ليتوافق مع تفعيل خاصية safe mode - nnnjk - 05-04-26

يعطيك العافيه
اشتغل الكود فقط في الروابط في المواضيع والمشاركات
لاكن لم يختم صور المرفقات كما كان سابقا
لان المرفقات ضروري اختمها


RE: تغيير الكود ليتوافق مع تفعيل خاصية safe mode - Amir_Alzubidy - 05-04-26

(05-04-26, 03:02 PM)nnnjk كتب : يعطيك العافيه
اشتغل الكود فقط في الروابط في المواضيع والمشاركات
لاكن لم يختم صور المرفقات كما كان سابقا
لان المرفقات ضروري اختمها

PHP كود :
<?php
error_reporting
(E_ALL & ~E_NOTICE);
header('Content-Type: image/png');
define("MDIR"dirname(__FILE__));
// ================== إعدادات ==================
$watermark_text "الشعافينمنحرب"// نص الختم
$font_size 5// خطوط PHP الافتراضية 1-5
$band_height 25;
$save_dir MDIR "/wmark_/";
// ================== دالة تحميل الصورة ==================
function downloadImage($url$save_path) {
    // محاولة file_get_contents
    $data = @file_get_contents($url);
    if ($data !== false) {
        file_put_contents($save_path$data);
        return true;
    }
    // fallback إلى cURL
    if (function_exists('curl_init')) {
        $ch curl_init($url);
        $fp fopen($save_path'wb');
        curl_setopt($chCURLOPT_FILE$fp);
        curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
        curl_setopt($chCURLOPT_TIMEOUT20);
        curl_exec($ch);
        curl_close($ch);
        fclose($fp);
        return file_exists($save_path);
    }
    return false;
}
// ================== جلب الصورة ==================
if (!isset($_GET['src'])) {
    die('No image');
}
$src trim($_GET['src']);
$filename md5($src) . ".img";
$local_image $save_dir $filename;
if (
filter_var($srcFILTER_VALIDATE_URL)) {
    // إذا كان رابط خارجي
    if (!file_exists($local_image)) {
        if (!downloadImage($src$local_image)) {
            die('فشل تحميل الصورة');
        }
    }
} else {
    // إذا كان مسار محلي (مرفق)
    $local_image MDIR '/' ltrim($src'/');
    if (!file_exists($local_image)) {
        die('الصورة غير موجودة');
    }
}
// ================== تحديد نوع الصورة ==================
$info getimagesize($local_image);
if (!
$info) {
    die('Invalid image');
}
switch (
$info['mime']) {
    case 'image/jpeg':
        $im imagecreatefromjpeg($local_image);
        break;
    case 'image/png':
        $im imagecreatefrompng($local_image);
        break;
    case 'image/gif':
        $im imagecreatefromgif($local_image);
        break;
    case 'image/webp':
        $im imagecreatefromwebp($local_image);
        break;
    case 'image/bmp':
        $im imagecreatefrombmp($local_image);
        break;
    default:
        die('نوع صورة غير مدعوم');
}
// ================== إنشاء طبقة الختم ==================
$width imagesx($im);
$stamp imagecreatetruecolor($width$band_height);
// خلفية سوداء
$black imagecolorallocate($stamp000);
imagefilledrectangle($stamp00$width$band_height$black);
// لون النص
$white imagecolorallocate($stamp255255255);
// كتابة النص (بدون خطوط خارجية)
imagestring($stamp$font_size105$watermark_text$white);
// ================== دمج الختم ==================
$stamp_w imagesx($stamp);
$stamp_h imagesy($stamp);
imagecopymerge(
    $im,
    $stamp,
    imagesx($im) - $stamp_w,
    imagesy($im) - $stamp_h,
    0,
    0,
    $stamp_w,
    $stamp_h,
    60
);
// ================== إخراج الصورة ==================
imagepng($im);
// تنظيف
imagedestroy($im);
imagedestroy($stamp);
?>

طريقة الاستخدام 
للرابط الخارجي : 
PHP كود :
watermark.php?src=https://example.com/image.jpg 

للمرفق المحلي : 
PHP كود :
watermark.php?src=uploads/abc.jpg 



RE: تغيير الكود ليتوافق مع تفعيل خاصية safe mode - nnnjk - 05-04-26

يعطيك العافيه
حبذا لو كان ختم المرفقات بدون الدخول الى رابط الملف الخاص  بالهاك
كما في الكود الذي ارفقت في مشاركتي الاولى


RE: تغيير الكود ليتوافق مع تفعيل خاصية safe mode - nnnjk - 05-04-26

الاخ Amir_Alzubidy السلام عليكم
ارجوا الرد


RE: تغيير الكود ليتوافق مع تفعيل خاصية safe mode - Amir_Alzubidy - 05-04-26

(05-04-26, 04:11 PM)nnnjk كتب : يعطيك العافيه
حبذا لو كان ختم المرفقات بدون الدخول الى رابط الملف الخاص  بالهاك
كما في الكود الذي ارفقت في مشاركتي الاولى

قم بتعديل هذا الجزء فقط : 
PHP كود :
$src trim($_GET['src']);
$filename md5($src) . ".img";
$local_image $save_dir $filename;

if (
filter_var($srcFILTER_VALIDATE_URL)) {
    // إذا كان رابط خارجي
    if (!file_exists($local_image)) {
        if (!downloadImage($src$local_image)) {
            die('فشل تحميل الصورة');
        }
    }
} else {
    // إذا كان مسار مرفق محلي على السيرفر
    // ? التعديل: نقراه مباشرة بدون المرور برابط الهاك
    $local_image MDIR '/' ltrim($src'/'); 
    if (!file_exists($local_image)) {
        die('الصورة غير موجودة');
    }




RE: تغيير الكود ليتوافق مع تفعيل خاصية safe mode - nnnjk - 05-04-26

تسلم
بعد التعديل الاخير
ظهر خطا عند فتح المرفق
Parse error: syntax error, unexpected 'مرفقة' (T_STRING), expecting ']' in /home/xxx/domains/alshafeen.site/public_html/vb/watermark.php on line 52