PDA

View Full Version : آموزش: Include/ضمیمه کردن فایل بصورت صحیح و ایمن



Yousha
یک شنبه 01 اسفند 1389, 14:01 عصر
معمولاً اولین فایلی که قراره Include بشه Config. هستش(فایل پیکربندی نه تنظیمات):

راه های فوق العاده اشتباه و خطرناک:


require_once('./config.php');
require_once('config.php');
require_once('\www\root\config.php'); # !
require_once('www/public_html/config.php');
...


راه صحیح و ایمن:


require_once(addslashes(dirname(__file__)) . '/test-directory/' . '_config.php');

----------------------------------------------

نکته: DOCUMENT_ROOT که در متغیر $_SERVER قرار داره روی اکثر سیستمهای ویندوز Set نشده و یا مشکل / و \ رو داره.
پس اینو در اول خط و اولین فایل(مثلاً index) قرار میدید(حتی قبل از config).


# Windows
if(!isset($_SERVER['DOCUMENT_ROOT']) && isset($_SERVER['SCRIPT_FILENAME']))
{
$_SERVER['DOCUMENT_ROOT']= str_replace('\\', '/', substr(&$_SERVER['SCRIPT_FILENAME'], 0, (0 - strlen(&$_SERVER['PHP_SELF']))));
}

# Windows
if(!isset($_SERVER['DOCUMENT_ROOT']) && isset($_SERVER['PATH_TRANSLATED']))
{
$_SERVER['DOCUMENT_ROOT']= str_replace('\\', '/', substr(str_replace('\\\\', '\\', &$_SERVER['PATH_TRANSLATED']), 0, (0 - strlen(&$_SERVER['PHP_SELF']))));
}

حالا برای تعریف متغیر/ثابت های مسیر اینطوری در فایل config عمل می کنید:


if(!defined('ROOT_PATH'))
{
define('ROOT_PATH', $_SERVER['DOCUMENT_ROOT'] . '/');
}

if(!defined('SoftwareName_PATH'))
{
define('SoftwareName_PATH', ROOT_PATH . 'SoftwareFolderName' . '/');
}

به این . نقطه ها دقت کنید. اینکار اجازه خواندن/اجرای فایل رو از خارج از نرم افزار به خرابکار نمیده.
ROOT_PATH مسیر ریشه هاست/فضای شماست. مثل:
/usr/www/public_html/
یا c:\\www\\root\\MyUserName

SoftwareName_PATH مسیر جاری نرم افزارتون هست که داخل هاست/فضا تونه. مثل:
/usr/www/public_html/Wordpress/
یا c:\\www\\root\\MyUserName\\Wordpress

حالا هم برای Include کردن فایل های بعدی(مثل توابع، کلاسها و زبان و...) اینطوری عمل میکنید:


require_once(SoftwareName_PATH . 'functions/' . 'global.php');
require_once(SoftwareName_PATH . 'languages/' . 'english.php');
require_once(SoftwareName_PATH . 'classes/system/' . 'plugin.php');


در پایان اینطوری باید عمل کنید:
محتویات فايل index.php


# Windows
if(!isset($_SERVER['DOCUMENT_ROOT']) && isset($_SERVER['SCRIPT_FILENAME']))
{
$_SERVER['DOCUMENT_ROOT']= str_replace('\\', '/', substr(&$_SERVER['SCRIPT_FILENAME'], 0, (0 - strlen(&$_SERVER['PHP_SELF']))));
}

# Windows
if(!isset($_SERVER['DOCUMENT_ROOT']) && isset($_SERVER['PATH_TRANSLATED']))
{
$_SERVER['DOCUMENT_ROOT']= str_replace('\\', '/', substr(str_replace('\\\\', '\\', &$_SERVER['PATH_TRANSLATED']), 0, (0 - strlen(&$_SERVER['PHP_SELF']))));
}

# Includeing config.php
require_once(addslashes(dirname(__file__)) . '/config.php');
# Including misc.
require_once(SoftwareName_PATH . 'functions/' . 'global.php');
require_once(SoftwareName_PATH . 'languages/' . 'english.php');
require_once(SoftwareName_PATH . 'classes/system/' . 'plugin.php');


محتویات فايل config.php


if(!defined('ROOT_PATH'))
{
define('ROOT_PATH', $_SERVER['DOCUMENT_ROOT'] . '/');
}

if(!defined('SoftwareName_PATH'))
{
define('SoftwareName_PATH', ROOT_PATH . 'SoftwareFolderName' . '/');
}

# ...

موفق باشید :)

binyaft
یک شنبه 01 اسفند 1389, 14:35 عصر
require_once('./config.php');
require_once('config.php');


چرا دو تا راه بالا خطرناک هستند!؟؟؟

Yousha
یک شنبه 01 اسفند 1389, 15:23 عصر
مگه نخوندیش؟

به این . نقطه ها دقت کنید. اینکار اجازه خواندن/اجرای فایل رو از خارج از نرم افزار به خرابکار نمیده.

eshpilen
یک شنبه 01 اسفند 1389, 16:08 عصر
فقط نگو باید اینطور و نباید اونطور.
یا براش سند معتبر بیار و یا با مثال و استدلال روشن نشون بده چطور روشهایی که میگی خطرناک و اشتباه هستن، مورد سوء استفاده قرار میگیرن.

amir001
یک شنبه 01 اسفند 1389, 16:50 عصر
مگه نخوندیش؟

به این . نقطه ها دقت کنید. اینکار اجازه خواندن/اجرای فایل رو از خارج از نرم افزار به خرابکار نمیده.


میشه لطف کنید یک نمونه مثال بزنید و بگید دقیقا چه خطری داره؟؟
آیا قبلا باگی برای این ثبت شده؟؟


دوست عزیز فکر میکنم شما یک اشتباه کوچیک مرتکب شدید.
روشی که مشکل داره استفاده از متغیرها در دستور Include هست که در بعضی مواقع باعث ایجاد باگهای RFI میشه و ربطی به نقطه ها نداره.
ایمن ترین روش این هست که از رشته ثابت و یا ثابت ها استفاده بشه که روش اولی که شما گفتید مشکل داره هم از رشته های ثابت داره استفاده میکنه.

Yousha
یک شنبه 01 اسفند 1389, 17:03 عصر
فقط منظورم RFI/LFI نیست.


روشی که مشکل داره استفاده از متغیرها در دستور Include هست که در بعضی مواقع باعث ایجاد باگهای RFI میشه و ربطی به نقطه ها نداره.
شما می تونید با وجود '/test-directory/' . '_config.php' یک فایل از سرور رو بخونید/اجرا کنید؟؟
نمونه نشون بدید. و به ما هم یاد بدید!.

شاید بتونید پسوند فایل رو Null کنید ولی نمی تونید مسیر قبلشو تغییر بدید. حتی با /..

eshpilen
یک شنبه 01 اسفند 1389, 19:15 عصر
میشه دقیقا نشون بدید چطور از دستور require_once('config.php'); سوء استفاده میشه؟

Yousha
یک شنبه 01 اسفند 1389, 20:02 عصر
میشه دقیقا نشون بدید چطور از دستور require_once('config.php'); سوء استفاده میشه؟
که سر بقیه بیاری؟

eshpilen
یک شنبه 01 اسفند 1389, 20:57 عصر
عجب!
کاربر محترم اینجا جای همینطور ادعا کردن و ثابت نکردن و طفره رفتن نیست.
ضمنا اینطور چیزها اونقدرها هم فکر نمیکنم ناشناخته و سطح بالا باشن که بخواید از دیگران پنهان کنید.
بحث و ادعای فنی باید مستند و مستدل باشه و روش و صحتش روشن بشه و بهترین پیشگیری کلی و دقیق رو وقتی میشه انجام داد که دقیقا به مکانیزم عمل پی برد.
لطفا اصول و وظیفهء خودتون رو رعایت کنید. وگرنه همینطوری ادعایی رو کردن که درست نیست. هرکس میتونه بیاد هر ادعایی بکنه و بگه فلان چیز نباید اینطور باشه و باید اونطور باشه. این که نشد کار مفید! تازه خیلی وقتا هم بنده دیدم که طرفها خودشون درست بلد نیستن و اشتباه یا ناقص یا افراطی مطلبی رو بیان میکنن. خلاصه هیچ گریزی جز اثبات نیست در این مسائل! وگرنه تمام حرفهای شما بی اعتبار تلقی میشن. بنده هم میتونم ادعا کنم روش شما اشتباه هست و برای اینکه ازش سوء استفاده نشه نمیگم چرا. یا مثلا بگم علتش همون نقطه هاست :قهقهه:

alasht
یک شنبه 01 اسفند 1389, 21:15 عصر
راه های فوق العاده اشتباه و خطرناک:خیلی دوست دارم بدونم خطر این روش چیه :متفکر:
اگه میشه ثابت کنید که خطرناکه تا ما هم دیگه از این روش استفاده نکنیم


که سر بقیه بیاری؟ پاسختون اصلا منطقی نیست شما میگید خطرناکه و باید با دلیل ثابت کنید

UnnamE
یک شنبه 01 اسفند 1389, 21:21 عصر
دادگاه وقت تنفس ميدهد!!!!
بابا بزاريد الان برميگرده جواب ميده ديگه!!!
من هم سوال واسم پيش اومد چرا فوق العاده اشتباه، چون تو بيشتر سيستم ها همين شكل هست!!!
فعلا بريم تنفس!

eshpilen
یک شنبه 01 اسفند 1389, 21:47 عصر
بابا هرکی میاد یه حرفی میزنه! و کمتر کسی سند و استدلال و مثال دقیق و واضح ارائه میکنه و طرز عمل رو نشون میده.
تمام وقت و انرژی مردم رو تلف میکنن. چقدر هم لجبازی و طفره رفتن و برخورد شخصی میکنن با طرفی که ازشون سند و دلیل و مثال دقیق میخواد.
یه سری هم اصلا حرف اشتباه میزنن.
بطور مثال مدتی قبل توی یه سایت PHP که اسمش رو نمیبرم بعنوان چند نکتهء مهم طراحی وب که در لیست صفحهء اول مقالات سایت هم درج کرده بودن نوشته بودن از تصاویر PNG استفاده نکنید! بعد که جویا شدم و پرسیدم علتش چیه (طبق معمول علتش رو ننوشته بودن یا دقیق ذکر نکرده بودن)، معلوم شد اینه که IE6 با تصاویر PNG دارای شفافیت مشکل داره (بخشهای شفاف رو سفید نشون میده). حالا بعد از این جویا شدن و بیرون کشیدن حرف ازشون تازه معلوم میشد که این حرفشون درست نیست، چون استفاده از تصاویر PNG فقط بخاطر شفافیت نیست و خیلی جاها نیاز به شفافیت نداریم و در تمام وب بصورت گسترده هم داره استفاده میشه، ولی اونا عملا گفته بودن بطور کلی ازش استفاده نکنیم. حالا هرکس هم میخوند و دنبال علت و صحت این ادعا نمیرفت میتونست کورکورانه پیروی کنه؛ اصلا من نمیدونم اون حرف رو از کجا درآورده بودن و توی صفحهء اول سایت و مقالهء خودشون زده بودن. شاید همینطوری میشه یه چیزی گنده میشه و بدون پایه و اشتباها بسط پیدا میکنه و نهایتا سر از یه جای دیگه درمیاره. یکی یه چیزی رو کامل درک نکرده درست و غلط غاطی یه چیزایی میگه و دلیل و سند روشن و دقیق و کامل ارائه نمیکنه، و بقیه هم همینطور این زنجیره رو ادامه میدن. تازه مشکل IE6 با تصاویر PNG هم توسط یک روش مناسب کاملا حل میشه تاجایی که میدونم.

در اینطور بحثها و ادعاها باید حتما دلیل دقیقا ذکر بشه و ترجیحا با مثال عملی. اگر سند داره باید منبع و سندش درج بشه تا بشه پیگیری کرد و دید آیا اون منبع خودش اعتبار کافی داره یا نه.
هرچیزی که مکانیزم اون دقیقا مشخص بشه خوبی دیگرش هم اینه که دیگران هم میتونن روش بحث و تحلیل و آزمایش بیشتری انجام بدن و موارد و جزییات بیشتر و راهکارهای دیگری ارائه بشه و توش از درست و غلط هرچیزی هست احتمال زیادی داره که مشخص بشه.

من دیگه ناامید شدم از جو برنامه نویسی این مملکت. آخر ضایع هست. اصلا وضع PHP هم انگار از همه ضایع تر؛ فکر کنم نیست که کار باهاش ساده هست، هرکس زود میره توش و ادعا میکنه و میخواد هر پروژه ای رو با عجله و وصله و پینه سرهم کنه. بابا آخه اصولی داره هرچیزی. مطالعه و یادگیری کامل و دقیق میخواد. بازی که نیست! شما باید بدونی اول باید خودت مطلب رو دقیق و کامل درک کنی و مطلب و ادعایی ارائه میدی باید مستند و مستدل باشه و با دلیل به دیگران نشونش بدی تا واقعا یاد بگیرن؛ نه اینکه انتظار داشته باشی کورکورانه تقلید کنن باوجود اینهمه اشتباه و ضعفی که افراد مختلف دارن.

اصلا کسی که این کار رو نمیکنه، یعنی سند و دلیل و شرح مکانیزم نمیده برای ادعایی که میکنه و یک روشی رو زیر سوال میبره و روش دیگری رو پیشنهاد میکنه، بنظر بنده از همون اول اساسا مشکل داره و نمیشه بهش اعتماد کافی کرد. چون اینا جزو اصول اولیه و ضروری هستن، و هرکس که اینا رو نادیده میگیره، حتما یه مشکلی داره! وگرنه ارائهء مطلب به شکلی که اعتباری نداره و ضمنا طفره رفتن از بحث و اثبات، کار آدم عاقل نیست چون آدم عاقل کار بیهوده نمیکنه و سعی میکنه کار رو به شکل اصولی و بهینه و کامل انجام بده.
عادت کردیم برنامه نویسی رو همینطوری پشمکی یاد بگیریم و پشمکی یاد بدیم. بخاطر همین رفتارمون اینطوری هست دیگه! غیر از اینه؟ با وصله و پینه و تقلید و جسته و گریخته و خورده خورده از اینور و اونور یاد گرفتن بجای یاد گرفتن و روش اصولی، و لابد در همین حین پروژهء جدی و کار هم انجام دادن!!

mtchabok
یک شنبه 01 اسفند 1389, 23:42 عصر
منم با eshpilen موافقم ... بعضیها یه مسئله ای رو طرح میکنن که بیخودی وقت و کل منابع سیستمی رو درگیر خودش میکنه ...
حالا از این بگذریم ..
مواردی که من خودم برای اینکلود کردن فوق العاده رعایت میکنم این موارد هس :
- کنترل اجرای هر صفحه توسط صفحات دیگه اجرا شده
- کنترل درخواست درست و صحیح کاربر
- استفاده از ثابتها و آدرس کامل برای وارد کردن اسکریپت .

در ضمن برای این دوستمون که گفتن از نقطه و یا به صورت محلی آدرس ندین فک کنم به خاطر مورد اولی هس که گفتم . یعنی اجرای یه اسکریپت توسط اسکریپت دیگه .