PDA

View Full Version : سوال: چطور می تونم اسکریپتی که در حال اجرا هست رو توسط کدهای خودش حذف کنم؟



idocsidocs
یک شنبه 21 اسفند 1390, 13:07 عصر
لطفا توضیح بدید.

MostafaEs3
یک شنبه 21 اسفند 1390, 13:40 عصر
منظورت رو واضحتر بگو ... اسکریپت اگه توی سرور درحال اجرا باشه دیگه حتی پاکش هم کنی باهم ادامه میده !! مثلا شما یک حلقه بذار بعد یک کاری کن که همینطوری توی یک فایلی عدد بنویسه ... بعد توابعی که پردازش درون سرور رو فعال میکنه بکار ببر ....
حالا حتی اگه اسکریپت رو پاکش هم کنی میبینی همینطوری حجم فایل میره بالاتر ! اگه مهم محدودیت نذاشته باشی به جز ریست کردن سرور راهی برای متوقف کردن پردازش نیست ! :لبخند:

idocsidocs
یک شنبه 21 اسفند 1390, 13:58 عصر
منظورت رو واضحتر بگو ... اسکریپت اگه توی سرور درحال اجرا باشه دیگه حتی پاکش هم کنی باهم ادامه میده !! مثلا شما یک حلقه بذار بعد یک کاری کن که همینطوری توی یک فایلی عدد بنویسه ... بعد توابعی که پردازش درون سرور رو فعال میکنه بکار ببر ....
من می خوام توی یه اسکریپت کدی بنویسم که فایل خودش رو پاک کنه. یعنی اسکریپت یبار اجرا بشه و خودش خودش رو حذف کنه.

MostafaEs3
یک شنبه 21 اسفند 1390, 14:46 عصر
:لبخند: خب کاری نداره که !


unlink($_SETVER['PHP_SELF']);

یکمی دستکاری میخواد ولی این کدشه

idocsidocs
یک شنبه 21 اسفند 1390, 15:10 عصر
یکمی دستکاری میخواد ولی این کدشه این کد رو قبلا تست کردم ولی اجرا نشد. شما تست کردید؟

MostafaEs3
یک شنبه 21 اسفند 1390, 15:23 عصر
:اشتباه: خب یک کاری کن ... سریع یک فایلی درست کن و کاری کن که خود اسکریپت اجراش کنه ! یکمی پیچیده اس ولی کاری نداره ! روی اون فایل پردازش درون سرور بده که بتونه خودش انجام بده :لبخند:

alonemm
یک شنبه 21 اسفند 1390, 17:08 عصر
باسلام:
بهتره با یک حلقه تکرار اول تمامی فایل ها و پوشه ها رو از روی روت دربیارید و سپس دست به حذف کردن اون ها بزنید.

hamed-php
دوشنبه 22 اسفند 1390, 08:04 صبح
همه اینها به شرطی هست که write-access رو به شما داده باشند
و گرنه به هیچ وجه فایل رو نمیتونی با روش
unlink(__FILE__); یا
rename(__FILE__) حذف یا تغییر نام بدید

narsic
دوشنبه 22 اسفند 1390, 09:06 صبح
با تابع

unlink
میتونی این کار رو انجام بدی فقط باید به فایل دسترسی لازم رو داده باشید (ترجیحا دسترسی رو به ۷۵۵ تغییر بدید)
موفق باشید

MMSHFE
دوشنبه 22 اسفند 1390, 10:05 صبح
دوست عزیز، هر موقع شما تونستین فایلی رو که توی Word باز کردین و الآن باز هست، از توی Explorer پاک کنید، این کار رو هم میتونین انجام بدین. برادر من، فایل در حال استفاده است. نمیشه حذفش کرد. برای این کار، بهتره یک اسکریپت بنام دلخواه (مثلاً unlink.php) بنویسید، به نحوی که نام فایل رو به روش Get بگیره و با unlink حذفش کنه و هرموقع خواستین فایلی رو حذف کنید، کاربر رو اینطوری بهش هدایت کنید:


header('Location: unlink.php?file=test.php');
exit();

توی فایل unlink.php هم اینطوری بنویسید:


if(isset($_GET['file']) && file_exists($_GET['file'])) {
unlink($_GET['file']);
}
header('Location: index.php');
exit();

این کد ریدایرکت آخری لازمه تا کاربر ندونه کدوم فایل داره عمل حذف رو انجام میده. البته باید یکسری کنترلهای امنیتی هم به این روش اضافه کنید تا یک موقع با همچین آدرسی:
unlink.php?file=index.php
سایتتون نپره!
مثلاً اینکه Referer رو چک کنید تا فایل بدون Referer از سایت خودتون اجرا نشده باشه (البته این سطح امنیت کافی نیست). یا اینکه هربار کاربر وارد سایت میشه یک سشن تصادفی خاص براش بگذارین و توی دیتابیس ذخیره کنید و اون رو هم همراه اسم فایل برای فایل unlink.php بفرستین و توی unlink.php هم چک کنید که مقدار ارسال شده با مقدار توی دیتابیس یکی باشه. اینطوری کمی امنیت بالاتر میره و هرکی اسم فایل unlink.php رو فهمید، نمیتونه به راحتی هر فایلی که خواست رو از بین ببره. حتی میشه فقط اجازه حذف فایلهای پوشه خاصی (که خیلی مهم نیست) رو بدین. اما نکته مهم همینه که گفتم: فایلی که در حال استفاده هست رو نمیشه حذف کرد.
موفق باشید.

Unique
دوشنبه 22 اسفند 1390, 17:19 عصر
راستش از اون سوال ها هستش که ... ولی من یکبار یه کار شبیه به این کار میخواستم انجام بدم ! کاری که کردم این بود که وقتی اسکریپت php اجرا میشد یک خروجی javascript تولید میکرد (Meta Tag هم میشه) که با صدا زدن یک اسکریپت دیگه اون اسکریپت اولی را حذف میکرد ! اما اگه VPS دارین میتونین اخر اسکریپتتون یک Cron Job یک دقیقه ای تولید کنید تا اسکریپتتون را پاک کنه ! اما اسکریپتی که داره از طریق apache یا php روش کار میشه را نمیتونین پاک کنین !

narsic
دوشنبه 22 اسفند 1390, 17:26 عصر
فایلی که در حال استفاده هست رو نمیشه حذف کرد.
توی لینوکس اینکار قابل انجامه، و من پیشنهاد میکنم که این کار توسط خود فایل انجام بشه حالا یا اینکه خودش خودش رو حذف کنه و یا اینکه یک Crone Job برای انجام این کار ثبت کنین. اما از انتقال به یک فایل دیگه کاملا خودداری کنید چون هکر میتونه بدون استفاده از مرورگر صفحه شما رو ببینه و فایلی که دارید برای حذف فایل های دیگه ازش استفاده میکنید رو پیدا کنه و... .
موفق باشید

MMSHFE
دوشنبه 22 اسفند 1390, 17:30 عصر
بله توی لینوکس قابل انجامه ولی باید فکر اجرای صحیح اسکریپت رو در همه حالتها و وقتی سرور ویندوز داریم هم بکنیم. ضمناً منطقی نیست که وقتی خودمون توی خونه هستیم، خونه رو خراب کنیم (حذف فایل از درون خود فایل) چون معلوم نیست بعدش چه بلایی سرمون میاد و آیا در همه حالتها، بقیه اسکریپت به درستی اجرا میشه یا نه و کلی مشکلات دیگه. درسته که امنیت حذف غیرمستقیم کمتره ولی میشه با یکسری مکانیزمها که چند موردش رو مثال زدم، امنیت رو بالا ببریم. موفق باشید.

Net So
دوشنبه 22 اسفند 1390, 19:32 عصر
برادر من، فایل در حال استفاده است. نمیشه حذفش کرد.

جهت اطلاع دوستان این کار انجام پذیر هست :

<?PHP

if($_GET['do']=="remove")
{
unlink(getcwd().$_SERVER["SCRIPT_NAME"]);
}
/********************* OR **********************/
$slash="/";

if($_GET['do']=="remove")
{
unlink(getcwd().$slash.$_SERVER["SCRIPT_NAME"]);
}

?>

MostafaEs3
دوشنبه 22 اسفند 1390, 20:02 عصر
مستر این تابع کارش چیه : getcwd() :متفکر:

Net So
دوشنبه 22 اسفند 1390, 20:51 عصر
Google It
ولی خوب حس جستجو نداری بیا : :D

http://php.net/manual/en/function.getcwd.php
آدرس دایرکتوری فعلی رو میده. فرضا تو Cpanel :
/home/NetSo

MMSHFE
دوشنبه 22 اسفند 1390, 23:51 عصر
جهت اطلاع دوستان این کار انجام پذیر هست
روی چه سیستمی تست کردین؟ ویندوز یا لینوکس؟ بهرحال برای اطمینان بیشتر توی چندتا از انجمنهای دیگه مثل stackoverflow و... هم جستجو کردم و دیدم اکثر کسانی که تجربه طولانی مدت کار با PHP دارن، توصیه کردن که فایلها خودشون رو حذف نکنن چون ممکنه در همه شرایط کار نکنه و کلاً این روش رو غیر اصولی دونستن. حالا از ما گفتن. دوستان هر جور که خودشون صلاح میدونن، اسکریپتشون رو مینویسن. ولی اگه یک موقع به مشکل بر خوردین، بعداً نگین نگفتی ها! :چشمک:

Net So
سه شنبه 23 اسفند 1390, 20:03 عصر
روی چه سیستمی تست کردین؟ ویندوز یا لینوکس؟ بهرحال برای اطمینان بیشتر توی چندتا از انجمنهای دیگه مثل stackoverflow و... هم جستجو کردم و دیدم اکثر کسانی که تجربه طولانی مدت کار با PHP دارن، توصیه کردن که فایلها خودشون رو حذف نکنن چون ممکنه در همه شرایط کار نکنه و کلاً این روش رو غیر اصولی دونستن. حالا از ما گفتن. دوستان هر جور که خودشون صلاح میدونن، اسکریپتشون رو مینویسن. ولی اگه یک موقع به مشکل بر خوردین، بعداً نگین نگفتی ها! :چشمک:
والا شما گفتید انجام پزیر نیست من هم گفتم هست. در همین حد :دی
روی لینوکس تست شده. بعید میدونم رو ویندوز مشکلی ایجاد کنه. این روش هم تست شدست نیاز به سوال نبود. چون از عهد عتیق تا الان تمام Shell ها از این متد برای Self Remove استفاده میکردن:لبخند:

MMSHFE
سه شنبه 23 اسفند 1390, 22:55 عصر
نه من نگفتم تست نکردین. پرسیدم روی چه سیستمی تست کردین. من خودم با ویندوز تست کردم جواب نداد. بخصوص اگه به این نکته دقت کنیم که تابع unlink اگه نتونه فایل رو حذف کنه، در برخی موارد اسکریپت رو هنگ میکنه، باید سعی کنیم از روشی استفاده کنیم که همیشه جواب میده. موفق باشید.

Net So
چهارشنبه 24 اسفند 1390, 12:53 عصر
رو ویندوز هم تست کردم جواب داد. شاید رو هاست ویندوز استفاده کردید که Getcwd رو بسته باشن ( 2 تا هاستینگ معروف میشناسم که بستن ).
--
اگر بخوایم برخی موارد رو درنظر بگیریم که برنامه نویسی میشه مصیبت دوست عزیز . ممکنه Backlog سرور پر بشه ، Process PHP Engine متوقف بشه یا ... پس باید هر دفعه بیایم PHP رو هم چک کنیم ؟ یا امثالهم ...
اگر unlink نتونه فایلی روحذف کنه مشکل کد شما نیست ! مشکل از سرور هست که ممکنه n تا دلیل هم داشته باشه. از Read Only شدن فایل گرفته تا ...
موفق باشید

idocsidocs
چهارشنبه 24 اسفند 1390, 17:12 عصر
رو ویندوز هم تست کردم جواب داد. شاید رو هاست ویندوز استفاده کردید که Getcwd رو بسته باشن ( 2 تا هاستینگ معروف میشناسم که بستن ).
بدون Getcwd نمی شه چنین کاری کرد؟

Net So
چهارشنبه 24 اسفند 1390, 18:01 عصر
بستگی به Config سرور داره.