PDA

View Full Version : سوال: این روش برای جلوگیری از نمایش فایلهای پی اچ پی مناسب هست؟



idocsidocs
چهارشنبه 22 تیر 1390, 00:25 صبح
من برای اینکه جلوی نمایش بعضی از فایلهای پی اچ پی رو بگیرم، از کد زیر استفاده می کنم. آیا این روش درست هست؟

<?php if($user != 'yes') { exit();}
else
{
//نمایش کدها
}?>
همونطور که مشخص هست، اگر متغیر user برابر با yes نباشه دستور اکزیت اجرا می شه و اجرای اسکریپت متوقف می شه و محتویات فایل نمایش داده نمی شه.

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

Keramatifar
چهارشنبه 22 تیر 1390, 01:05 صبح
دقیقا هدفتون از این کار چیه؟

idocsidocs
چهارشنبه 22 تیر 1390, 11:18 صبح
دقیقا هدفتون از این کار چیه؟
مثلا وقتی یه فایل رو اینکلود می کنم، اگر کاربر آدرس فایل رو مستقیما وارد کنه کدها اجرا می شن. من می خوام جلوی دسترسی به فایل رو بگیرم.

البته بدون استفاده از htaccess می خوام این کار رو بکنم.

alismith
چهارشنبه 22 تیر 1390, 13:53 عصر
سلام

دوست عزیز من دقیق متوجه نشدم ، اما مثلا می تونید از die() هم استفاده کنید مطمئن هستش


موفق باشید

Keramatifar
چهارشنبه 22 تیر 1390, 13:59 عصر
بجای exit از فانکشن die استفاده کنید و برای تشخیص هم Session کاربر رو چک کنید

eshpilen
چهارشنبه 22 تیر 1390, 18:18 عصر
exit و die در اصل یکی هستن. از هرکدومش که بخواید میتونید استفاده کنید.
از منوال PHP


die

(PHP 3, PHP 4, PHP 5)
die -- Equivalent to exit()
Description

This language construct is equivalent to exit().

binyaft
چهارشنبه 22 تیر 1390, 22:55 عصر
کاری که کردی درست هست ، فقط مقدار $user رو تو صفحه ای که فایل ها include میشن yes کن .

idocsidocs
چهارشنبه 22 تیر 1390, 23:43 عصر
کاری که کردی درست هست ، فقط مقدار $user رو تو صفحه ای که فایل ها include میشن yes کن .
من از همین روش استفاده می کنم.

آیا این روش یه روش استاندارد هست یا نه؟

امکان داره که کسی بتونه این روش رو دور بزنه؟

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

eshpilen
پنج شنبه 23 تیر 1390, 09:03 صبح
آیا این روش یه روش استاندارد هست یا نه؟

بنده هم از روش مشابهی استفاده میکنم.
ولی معمولا بجای متغییرهای معمولی از ثابتهایی که با define تعریف میشن استفاده میکنن.

کدهای بنده به این شکل هستن:

if(!isset($parent_page)) exit("<center><h3>Error: Direct access denied!</h3></center>");
و به این شکل در صفحه های اصلی قبل از اینکلود کردن عمل میکنم:

$parent_page=true;


امکان داره که کسی بتونه این روش رو دور بزنه؟
بنظرم درصورت روشن بودن رجیستر گلوبالز میشه! بطور مثال درمورد روش شما اگر رجیستر گلوبالز روشن باشه به این راحتی میشه دورش زد (همین الان تست کردم):

http://localhost/include/inc.php?user=yes


البته روش استفاده از ثابت
بنظرتون برای امنیت بیشتر استفاده از ثابتها بهتر نیست؟
با توجه به حفرهء بالا فکر میکنم همینطور باشه. چون اون روش روی ثابتها کار نمیکنه!

البته بخاطر اینکه رجیستر گلوبالز بطور کلی چیز مزخرف و خطرناکی هست و بنده ازش نفرت دارم (بنظر بنده این یکی از بزرگترین ناشیگری‌های تاریخ طراحی زبانهای برنامه نویسی است!) در ابتدای هر اسکریپت این کد رو هم قرار میدم:

if(ini_get('register_globals')) exit("<center><h3>Error: Turn that damned register globals off!</h3></center>");
این کد باعث میشه که برنامه های بنده در برابر رجیستر گلوبالز ایمن باشن و بتونم از روش متغییرهای معمولی هم استفاده کنم.

از جهات دیگر هم احتمالا استفاده از ثابت بعضی مزایایی رو داره. ولی مهمترین چیز واضحی که بنظرم رسید همین یک مورد بود. بنده خودم از الان تصمیم گرفتم از این به بعد از ثابت استفاده کنم!

eshpilen
پنج شنبه 23 تیر 1390, 09:22 صبح
یه مثال از روش ثابت:
فایل اصلی (اینکلود کننده):

<?php

define('inc_safe', true);

include 'inc.php';

?>
فایل اینکلود شونده:

<?php

if(!defined('inc_safe')) exit('Nokey!');

echo 'ok.';

?>


بنظرتون خوبه؟

idocsidocs
پنج شنبه 23 تیر 1390, 11:11 صبح
یه مثال از روش ثابت:
فایل اصلی (اینکلود کننده):

<?php

define('inc_safe', true);

include 'inc.php';

?>
فایل اینکلود شونده:

<?php

if(!defined('inc_safe')) exit('Nokey!');

echo 'ok.';

?>


بنظرتون خوبه؟
مسئله اول اینه که ثابتها باید با حروف بزرگ نوشته بشن.
من معمولا از این روش استفاده می کنم، لطفا بگید که این روش بهتره یا استفاده از defined ؟

if(INC_SAFE != 'yes'){exit;}

eshpilen
پنج شنبه 23 تیر 1390, 17:08 عصر
defined بهتره.
الان مال شما رو یکی مستقیما فراخوانی بکنه، یه همچین پیام خطایی میده:
Notice: Use of undefined constant INC_SAFE - assumed 'INC_SAFE' in C:\Program Files\EasyPHP-5.3.2\www\test2.php on line 2

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

idocsidocs
پنج شنبه 23 تیر 1390, 17:47 عصر
defined بهتره.
الان مال شما رو یکی مستقیما فراخوانی بکنه، یه همچین پیام خطایی میده:
Notice: Use of undefined constant INC_SAFE - assumed 'INC_SAFE' in C:\Program Files\EasyPHP-5.3.2\www\test2.php on line 2

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

if(!defined('inc_safe') || inc_safe !='yes'){exit;}

eshpilen
پنج شنبه 23 تیر 1390, 19:09 عصر
تصمیم که درسته.
اما اولا که بقول خودت باید ثابتها رو با حروف بزرگ بنویسیم.
دوما وقتی یه ثابت مخصوص این کار ایجاد میکنی که اسمش تابلو هست و وجودش رو چک میکنی دیگه چه نیازی هست مقدارش رو چک کنی که yes باشه؟ همون !defined('inc_safe') مگه کافی نیست؟

idocsidocs
پنج شنبه 23 تیر 1390, 20:04 عصر
تصمیم که درسته.
اما اولا که بقول خودت باید ثابتها رو با حروف بزرگ بنویسیم.
دوما وقتی یه ثابت مخصوص این کار ایجاد میکنی که اسمش تابلو هست و وجودش رو چک میکنی دیگه چه نیازی هست مقدارش رو چک کنی که yes باشه؟ همون !defined('inc_safe') مگه کافی نیست؟
کدهای خودت رو کپی کردم به همین دلیل حروفش کوچیک هستن!

توی کد زیر مقدار ثابت true هست یا اینکه فقط تعیین می شه که ثابت تعریف شده و دیگه امکان مقدار دهی نداره؟

define('inc_safe', true);

eshpilen
پنج شنبه 23 تیر 1390, 21:05 عصر
تابع define تعریف ثابت بدون مقدار رو قبول نمیکرد منم بهش یه مقدار دادم. true گذاشتم چون فکر کردم هم خوانایی منطقی داره و هم اینکه نوع Boolean فضای کمتری اشغال میکنه (البته در عمل اهمیت خاصی نداره!!).

idocsidocs
یک شنبه 26 تیر 1390, 15:13 عصر
کدهای خودت رو کپی کردم به همین دلیل حروفش کوچیک هستن!

توی کد زیر مقدار ثابت true هست یا اینکه فقط تعیین می شه که ثابت تعریف شده و دیگه امکان مقدار دهی نداره؟

define('inc_safe', true);
وقتی تابع defined بدون ' استفاده می شه، جواب نمی ده و حتما باید از سینگل کوتیشن استفاده کرد. می شه بگید چرا این مشکل وجود داره؟

رضا قربانی
دوشنبه 27 تیر 1390, 12:20 عصر
ببینم من آخر منظور شما رو نفهمیدم : شما می خوایید صفحه باز نشه و برگشت داده بشه یا بسته بشه (عنوان تاپیک رو جلوگیری از نمایش فایل گذاشتی)

خب برای این کار می تونید از die() استفاده کنید و داخل پرانتز می تونی هر چیزی بذاری (مثلا صفحه رفرش بشه یا بسته بشه یا یه جای دیگه لینک بشه)

مثلا به این صورت می تونی لینکش کنی :


die('<a href="'.$_SERVER['HTTP_REFERER'].'"><center><h2>برگشت </h2></center></a>');

حالا ما بقی چیزا بستگی به برنامه نویسی شما داره


اگه درست متوجه شده باشم