آموزش: جلوگيري از اجراي مستقيم فايل ضميمه شده

نظر شما درباره اين تكه كد؟

  • خوب

    رای: 0 0.0%
  • متوسط

    رای: 0 0.0%
  • ضعيف

    رای: 0 0.0%
  • بد

    رای: 0 0.0%

  • مجموع رای دهندگان
    1

MMSHFE

Active Member
با سلام، دوستان عزيز شايد خيلي وقتها براتون پيش اومده باشه كه يك فايل اسكريپت رو توي يك فايل ديگه با دستوراتي مثل include يا require ضميمه كنيد (بخصوص در مواقعي كه از يك فايل تنظيمات مثل config.php استفاده ميكنيد). خوب شايد در اين مواقع، اين نگراني پيش بياد كه نكنه اين فايل رو مستقيماً فراخواني كنند (مثلاً توي قسمت آدرس مرورگر، مسير فايل رو بنويسند). در اين حالت، تكه كد كوتاه زير، ميتونه به شما كمك كنه كه فايلتون مستقيماً اجرا نشه و حتماً ضميمه بشه. كافيه اين كدها رو در ابتداي فايلهايي كه ميخواين حتماً ضميمه بشن، بنويسيد. حتي ميتونيد اين كدها رو توي يك فايل (مثل indirect.php) بنويسيد و توي هر فايلي كه ميخواين اجازه دسترسي مستقيم بهش رو بگيرين، اين فايل رو include يا require (اگه دوست داشتين با پسوند once_) كنيد :
PHP:
$script = pathinfo($_SERVER['SCRIPT_FILENAME']);
$script = $script['dirname'].'/'.$script['basename'];
$file = pathinfo(__file__);
$file = $file['dirname'].'/'.$file['basename'];
if($script == $file)
{
    header('location: http://www.ncis.ir/index.php');
    exit();
}
و به جاي http://www.ncis.ir از آدرس سايت خودتون استفاده كنيد.
موفق باشيد.
 

MMSHFE

Active Member
دوستان عزیز، درمورد این تکه کد نظری ندارین؟ خوشحال میشم اگه راه بهتری به نظرتون میرسه، با هم تبادل ایده داشته باشیم.
 

phpweb

Active Member
با سلام، دوستان عزيز شايد خيلي وقتها براتون پيش اومده باشه كه يك فايل اسكريپت رو توي يك فايل ديگه با دستوراتي مثل include يا require ضميمه كنيد (بخصوص در مواقعي كه از يك فايل تنظيمات مثل config.php استفاده ميكنيد). خوب شايد در اين مواقع، اين نگراني پيش بياد كه نكنه اين فايل رو مستقيماً فراخواني كنند (مثلاً توي قسمت آدرس مرورگر، مسير فايل رو بنويسند). در اين حالت، تكه كد كوتاه زير، ميتونه به شما كمك كنه كه فايلتون مستقيماً اجرا نشه و حتماً ضميمه بشه. كافيه اين كدها رو در ابتداي فايلهايي كه ميخواين حتماً ضميمه بشن، بنويسيد. حتي ميتونيد اين كدها رو توي يك فايل (مثل indirect.php) بنويسيد و توي هر فايلي كه ميخواين اجازه دسترسي مستقيم بهش رو بگيرين، اين فايل رو include يا require (اگه دوست داشتين با پسوند once_) كنيد :
PHP:
$script = pathinfo($_server['script_filename']);
$script = $script['dirname'].'/'.$script['basename'];
$file = pathinfo(__file__);
$file = $file['dirname'].'/'.$file['basename'];
if($script == $file)
{
    header('location: Http://www.ncis.ir/index.php');
    exit();
}
و به جاي http://www.ncis.ir از آدرس سايت خودتون استفاده كنيد.
موفق باشيد.
چرا از تعریف ثابت استفاده نمی کنید. با اینکار فقط کافیه چک کنید که آیا ثابت وجود داره یا نه، اگر ثابت وجود داشت، اجازه اجرا می دید.

می شه بگید چرا بجای استفاده از این روش ساده، تعداد زیادی کد نوشتید؟ آیا روش شما امنیت بیشتری برقرار می کنه؟
 

MMSHFE

Active Member
حقیقتش من شخصاً این روش رو بیشتر میپسندم چون باید در روش تعریف ثابت، همیشه اسم ثابت تو ذهنمون باشه و ممکنه از این کد بخوایم توی سایتهای دیگه هم استفاده کنیم و اونجا از ثابت دیگه ای استفاده کرده باشیم و یکسری مشکلات ریز دیگه. بعلاوه، این که تعداد زیادی کد نیست! دو خط اول، نام فایل اسکریپتی رو به دست میارن که توی آدرس بار نوشته شده و دو خط دوم، نام فایلی که کدمون رو توش نوشتیم و میخوایم ضمیمه اش کنیم. حالا اگه این دو تا با هم برابر بودن، معنیش اینه که فایل ضمیمه رو مستقیماً فراخوانی کردیم و کاربر به صفحه اصلی سایت هدایت میشه.
 

Cyletech

Member
اینطوری که من متوجه شدم ، شما میخواید نذارید که فایل هاتون رو کاربران بعلاوه خودتون در آدرس بار مرورگر باز کنن. خب من کد شما رو امتحان نکردم ولی من راه بهتری رو سراغ دارم. چرا از apache استفاده نکنیم؟ یک فایل htaccess بساز در هر پوشه (اگر پوشه تو در تو دارید در اولین پوشه باشه کفایت می کنه). در این فایل خط زیر رو بنویسید:
کد:
RewriteEngine On

IndexIgnore *
اینم اضافه کنم که اجازه ندادن برای دانلود فایل ها به کاربران امنیت نرم افزار رو بالا می بره.
 

MMSHFE

Active Member
با سلام، بله دوست گرامی با کمک htaccess میشه اما از اونجا که همیشه امکان استفاده از htaccess نیست و کارکردن با اون هم نیاز به تجربه داره، این راه میتونه در کنار استفاده از htaccess کمک مناسبی باشه تا اگه به هر دلیلی، امکان استفاده از htaccess نبود یا درست کار نکرد، خود فایل اجازه نده مستقیماً ازش استفاده کنیم.
موفق باشید.
 

hidensoft

Member
PHP:
$script = pathinfo($_server['script_filename']);
؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
آخرالزمان شده
تا اونجا که یادم میاد تمام key های موجود در این آرایه حروف بزرگ هستند.

بعد من هرچی امتحان می کنم هیچ اتفاق خاصی نمیوفته تقریبا کار خاصی انجام نمی ده
 

MMSHFE

Active Member
با سلام، دوست عزيز، اين مشكل توي نقل قول پيش مياد وگرنه توي كد اصلي كه گذاشتم، اگه دقت كنيد، SCRIPT_FILENAME با حروف بزرگ نوشته شده. اين كد رو توي يك فايل قرار بدين و همون فايل رو مستقيماً ازطريق آدرس فراخواني كنيد (نه اينكه include يا require كنيد). خواهيد ديد كه به صفحه موردنظر redirect خواهيد شد.
موفق باشيد.
 

hidensoft

Member
والا من این کارو انجام دادم .. ریدایرکت نکرد .. البته رو ویندوز تست کردم فرصت نشد برم رو لینوکس
 

MMSHFE

Active Member
با سلام، حقیقتش من خودم هم روی لینوکس و هم روی ویندوز تست کردم. شما قبل از شرط if متغیرهای file$ و script$ رو با echo نمایش بدین ببینیم چی چاپ میشه؟
 

MMSHFE

Active Member
گفتم یه جای کار مشکل داره. اینا که نباید آرایه باشن. کدی که استفاده کردین رو میشه بگذارین؟
 

hidensoft

Member
PHP:
<?php 
$script = pathinfo($_SERVER['SCRIPT_FILENAME']);
$script = $script['dirname'].'/'.$script['basename'];
$file = pathinfo(__file__);
$file = $file['dirname'].'/'.$file['basename'];
if($script == $file)
{
    header('location: http://www.ncis.ir/index.php');
    exit();
}  
print_r(array('file'=>$file,'script'=>$script));

?>
کاری که خودت گفتی رو انجام دادم دوست عزیز .. این مشکل در تمامی سیستم عامل های ویندوز هست ;)
 
آخرین ویرایش:

MMSHFE

Active Member
دوست عزیز، این کد رو امتحان کنید:
PHP:
<?php 
$script = pathinfo($_SERVER['SCRIPT_FILENAME']);
$script = preg_replace('#\\#','/',$script['dirname']).'/'.$script['basename'];
$file = pathinfo(__file__);
$file = preg_replace('#\\#','/',$file['dirname']).'/'.$file['basename'];
if($script == $file)
{
    header('location: http://www.ncis.ir/index.php');
    exit();
}
?>
مشکل از اینه که یکی از اونها با \ و یکی دیگه با / پوشه ها رو از هم تفکیک کردن. امان از دست ویندوز ! توی یک نسخه یکجور عمل میکنه، توی نسخه دیگه یه جور دیگه. تازه بستگی به تنظیمات Localization هم داره. الآن تست کردم روی یک سیستم جواب داد، روی یکی دیگه نداد. همونطور که گفتم، با تابع preg_replace هرچی \ هست رو به / تبدیل کنید. اینطوری با لینوکس هم سازگار میشه.
موفق باشید.
 

hidensoft

Member
بله کار می کنه :) فقط دیگه فکر می کنم از لحاظ سرعتی و بار حافظه خیلی بیشتر از ثابت شد
 

MMSHFE

Active Member
این چطور؟ این هم سنگینه؟
PHP:
<?php 
$script = pathinfo($_SERVER['SCRIPT_FILENAME']);
$script = $script['basename'];
$file = pathinfo(__file__);
$file = $file['basename'];
if($script == $file)
{
    header('location: http://www.ncis.ir/index.php');
    exit();
}
?>
 

MMSHFE

Active Member
حقيقتش ميخواستم از str_replace استفاده كنم كه سرعتش بيشتره ولي از قرار معلوم DEPRECATED شده ! بخاطر همين، طبق توصيه سايت PHP از preg_replace استفاده كردم.
موفق باشيد.
 

P.H.P

Member
سلام دوست عزیز

به نظر شما بهتره نیست از define و defined استفاده بشه؟

کد:
http://php.net/manual/en/function.define.php
کد:
http://php.net/manual/en/function.defined.php

موفق
 

MMSHFE

Active Member
حقیقتش تعریف ثابت هم یک راهه که بنا به دلایلی که در پاسخ شماره 4 همین بحث ذکر کردم، استفاده از روش خودم رو بیشتر میپسندم ولی استفاده از ثابت هم روش خوبی هست.
 

جدیدترین ارسال ها

بالا