راه حل پنجم : امنیت بعلاوه رفع Bug ، فرایند توسعه ی هر برنامه!
امنیت اصلا چیز بدی نیست! اما گاهی اوقات دست و پا گیر می شود! ممکن است برنامه مورد نظر ما نتواند برخی عملیات های حیاتی را انجام دهد.خوب در نگاه اول به نظر می رسد در این کد هایی که ما نوشته ایم،هیچ نکته دست و پا گیری نبود که «شاید» مشکل امنیتی ایجاد کند! اما در کدهای راه حل های قبل یک نکته مهم وجود دارد که ممکن است مشکل ساز شود.یعنی ایجاد، حذف و تغییر فایل dir.txt! در واقع کاربری که اقدام به اجرای برنامه راه حل های قبل می کند،باید اجازه تغییر در پوشه عملیات را داشته باشد زیرا باید کاربر بتواند (اجازه داشته باشد) فایلی بسازد،تغییر دهد و حذف کند.حالا اگر کاربر مورد نظر این اجازه را نداشته باشد،برنامه با خطا مواجه خواهد شد.پس یک نکته مهم برای هدف بعدی برنامه داریم «تغییر برنامه به شکلی که بدون دردسر امنیتی از عهده ساخت،ویرایش و حذف فایل Dir.txt برآید».
اما در برنامه یک باگ مهم هر موجود بود،اگر یک فضای خالی در نام عکس ها یا پوشه عملیات یا میسر پوشه ی عملیات باشد،مشکل به وجود آمده و برنامه کار نمی کند.در نتیجه یک هدف دیگر نیز خواهیم داشت «رفع باگی که از وجود فضای خالی در نام یا مسیر فایل عکس ایجاد می شود».
و اما مبحث توسعه نوع دریافت نام فایل های عکس هم بسیار مهم است.در واقع تا اینجا،برنامه فقط می توانست تصاویر موجود در پوشه عملیات را نشان دهد،در نتیجه برای ایجاد یک گلچین از تصاویر باید حتما تمام آنها را در پوشه عملیات کپی کنیم که این خود ،هدر دادن فضای Hard Disk است! پس یک هدف دیگر نیز در تصحیح خود وارد می کنیم «تغییر برنامه تا بتواند اطلاعات را از یک فایل بخواند.نوع اطلاعات این فایل به این شکل است که که نوع فایل متنی بوده و در هر خط فایل آدرس کامل یک تصویر موجود است.همچنین نام (یا آدرس کامل) این فایل ،خود به عنوان پارامتر به برنامه ارسال می شود»
در نتیجه چکیده این اهداف به این شرح است:1) تغییر برنامه به شکلی که بدون مشکلات دسترسی کاربری، از عهده ساخت،ویرایش و حذف فایل Dir.txt برآید
2) رفع باگی که از وجود فضای خالی در نام یا مسیر فایل عکس ایجاد می شود
3) تغییر برنامه تا بتواند اطلاعات را از یک فایل بخواند.نوع اطلاعات این فایل به این شکل است که که نوع فایل متنی بوده و در هر خط فایل آدرس کامل یک تصویر موجود است.همچنین نام (یا آدرس کامل) این فایل ،خود به عنوان پارامتر به برنامه ارسال می شود
روش اول : کپی عکس ها در مسیر برنامه:
1) ابتدا يک عکس غير Bitmap را به عنوان Wallpaper انتخاب کنيد يا روي فايل reg.reg (در فايل فشرده شده اولين پست)،Double click کنيد(دليل آن را در پاسخ سئوال دوم بخش مقدمه آورده ام).
2) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.نام پوشه می تواند شامل فضای خالی هم باشد.
3) فايلهای MyCW4.bat و MyCW4.vbs و CI.exe را (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
4) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند را انتخاب کنيد و در پوشه عمليات کپي کنيد.توجه کنید که فرمت تصاویر مهم نیست.
5) عکس هاي مرحله قبل (تصاویر کپي شده در پوشه عمليات را که از اين به بعد فقط 'عکس' خطاب مي کنيم) را طوری نام گذاری کنید که پسوند آن jpg باشد.توجه کنید که نام فایل و فرمت نام مهم نیست (هر چه می خواهید قرار دهید)،فقط پسوند فایل را به jpg تغییر دهید،حتی اگر تصاویر شما دارای فرمت دیگری به غیر از نوع JPEG است.نام ها می تواند شامل فضای خالی هم باشد.
6) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
8) از فايل MyCW4.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل MyCW4.bat اجرا شود.
9) دو بار پشت سر هم ،Log off يا Restart کنيد (توجه کنید که دو بار باید این کار را انجام دهید)!
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart (از اين به بعد) تغيير خواهد کرد.
روش دوم: استفاده از یک فهرست از تصاویر:
1) ابتدا يک عکس غير Bitmap را به عنوان Wallpaper انتخاب کنيد يا روي فايل reg.reg (در فايل فشرده شده اولين پست)،Double click کنيد(دليل آن را در پاسخ سئوال دوم بخش مقدمه آورده ام).
2) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.نام پوشه می تواند شامل فضای خالی هم باشد.
3) فايلهای MyCW4.bat و MyCW4.vbs و CI.exe را (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
4) در پوشه عملیات یک فایل متنی ایجاد و یک نام دلخواه (مثلا List.txt) برای آن انتخاب کنید.از این به بعد از این فایل به نام 'فایل فهرست' نام می بریم.
5) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند را انتخاب کنيد و مسیر کامل آنها را در فایل فهرست کپی کنید مثلا:
کد:
کد PHP:
C:\MY Pictue\3d\1.jpg
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\wallpaper\Best1.png
C:\MY Pictue2\wallpaper\Best1.png
توجه کنید که مسیر کامل را نوشته و مسیر می تواند شامل فضای خالی نیز باشد.
6) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
7) از فايل MyCW4.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل MyCW4.bat اجرا شود.
8) روی Short cut ساخته شده در مرحله قبل Right Click کنید و گزینه Properties را انتخاب و در زبانه Shortcut در مقابل گزینه Target می توانید آدرس کامل فایل MyCW4.bat را ببینید.به انتهای این آدرس یک فضای خالی اضافه کرده و نام فایل فهرست (در مثال ما List.txt) را تایپ کنید (توجه کنید که باید این تغییرات را اضافه کنید نه جانشین).چنان نام فایل فهرست شما دارای فضای خالیست،حتما آن ار در یک جفت کوتیشن ("") قرار دهید.
9) دو بار پشت سر هم ،Log off يا Restart کنيد (توجه کنید که دو بار باید این کار را انجام دهید)!
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart (از اين به بعد) تغيير خواهد کرد.
اما قبل از توضیح کد برنامه،بگذارید دو نکته که در نوشتن کد باید استفاده شود را حل کنیم.اولین نکته،هدف اول است یعنی «مکانی از Hard Disk که مشکل دسترسی برای ساخت،ویرایش و حذف فایل Dir.txt نداشته باشیم».دوستان برنامه نویس می دانند که بهترین مکان برای این مورد پوشه TEMP کاربر می باشد (اکثر نرم افزار های دیگر هم از همین روش استفاده می کنند).پس برنامه باید فایل Dir.txt را در پوشه TEMP کاربر بسازد.برای دسترسی به آدرس پوشه TEMP کافیست از متغیر محیطی %temp% استفاده کنید.همچنین برای دسترسی به این آدرس در VB Script می توان از دستور:
کد:
کد PHP:
Set fso = CreateObject("Scripting.FileSystemObject")
Const TemporaryFolder = 2
Set tfolder = fso.GetSpecialFolder(TemporaryFolder)
استفاده کنید که در این صورت tfolder آدرس کامل پوشه TEMP را در خود خواهد داشت.
نکته بعد در مورد رفع باگ فضای خالیست.همانطور که در جواب سئوال 3 راه حل دوم گفته شد،حل این مشکل با استفاده از یک جفت کوتیشن ("") است.به همین منظور کافیست در هنگام ارسال پارامتر حاوی نام فایل عکس ،پارامتر را در یک جفت کوتیشن قرار دهید یعنی عبارت:
کد:
کد PHP:
call :Section2 %%i
را به
کد:
کد PHP:
call :Section2 "%%i"
تغییر دهید.
اما در مورد استفاده از فایل فهرست،شاید در نگاه اول تهیه Dir.txt از روی فایل فهرست سخت به نظر آید ولی در واقع کاربر با ایجاد فایل فهرست،مرحله تولید فایل Dir.txt را دستی انجام می دهد.پس کافیست یک کپی از فایل فهرست با عنوان Dir.txt ایجاد کنیم و کار تمام است!
خوب حالا باید کمی در مورد کد برنامه صحبت کنیم.به دلیل سادگی از کد MyCW4.vbs شروع می کنیم.این کد،دقیقا همان کاری را انجام می دهد که کد MyCW2.vbs انجام می داد (با همان توضیحات).با این تفاوت که بجای خواندن Dir.txt از مسیر جاری،آن را از پوشه TEMP بخواند.البته با توجه به اینکه باز کردن این فایل چند بار انجام می شود،یک تابع به نام OpenListFile نوشته شده است که وظیفه یافتن و باز کردن فایل Dir.txt در پوشه TEMP را بر عهده دارد.ورودی این تابع مشخص می کند که آیا فایل را باید برای خواندن باز کند یا برای رو نویسی.دیگر خطوط کد همان است که در MyCW2.vbs توضیح داده شد.
در مورد کلیات کد MyCW4.bat هم به مانند MyCW3.bat است.این کد را می توان در سه بخش تقسیم نمود:
بخش اول: برای ایجاد فایل Dir.txt که کد زیر می باشد:
کد:
کد PHP:
if EXIST %1 goto CopyFile
dir *.jpg /b | SORT > %temp%\Dir.txt
goto DirReady
:CopyFile
copy %1 %temp%\Dir.txt > nul
goto DirReady
در خط اول اگر چنانچه به برنامه پارامتری پاس داده شده باشد،برنامه از وجود چنین فایلی (همان فایل فهرست) اطمینان حاصل کرده و سپس با پرش به قسمت CopyFile،فایل فهرست را به عنوان فایل Dir.txt کپی می کند.و به قسمت بعد می رود.اما چنانچه پارامتری به برنامه ارسال نشده بود و یا پارامتر نا معتبر بود،برنامه به دنبال تصاویر در پوشه جاری گشته و تمام تصاویر jpg ار فهرست و در Dir.txt فهرست کرده و به گام بعد می رود.
بخش دوم: در این بخش با کد:
کد:
کد PHP:
:DirReady
MyCW4.vbs
FOR /F "delims=?" %%i in (%temp%\Dir.txt) do call :Section2 "%%i"
del %temp%\Dir.txt
goto :EOF
برنامه با فراخوانی MyCW4.vbs ،نام فایل منتخب را یافته (یادآوری می شود که خروجی MyCW4.vbs،همان فایل Dir.txt است با یک خط که شامل آدرس کامل فایل منتخب است) و به بخش بعدی (Section2) ارسال می کند.در این فرایند دو نکته حائز اهمیت است که هر دو مربوط به هدف دوم (رفع باگ ناشی از وجود فضای خالی در نام) است:
1) استفاده از جفت کوتیشن در طرفین %%i برای ارسال یک پارامتر واحد که ممکن است شامل فضای خالی نیز باشد
2) استفاده از عبارت
کد:
در For.در واقع اگر به توضیحات For مراجعه کرده باشید،متوجه خواهید شد که سوئیچ F/ برای خواندن اطلاعات ترتیبی از یک فایل به کار می رود و برای جدا سازی این اطلاعات از هم دو ملاک وجود دارد،یکی فضای خالی (SPACE) و یکی کاراکتر خط بعد(r\n\ یا CrLf).در واقع دومی هدف ماست ولی اولی (فضای خالی) مشکل ساز می شود.به همین دلیل کافیست روش جدا سازی را عوض کنیم و به جای حالت پیشفرض (یعنی فضای خالی و خط جدید) از یک جدا کننده دیگر (در اینجا ? استفاده شده است).توجه کنید که چون فایل دارای فقط یک داده است،این روش مشکلی ایجاد نمی کند و تمام اطلاعات (آدرس کامل فایل تصویر منتخب) به شکل یکجا خوانده می شود.
بخش سوم: این بخش که حاوی کد:
کد:
کد PHP:
:Section2
CI %1 "%USERPROFILE%\Local Settings\Application Data\Microsoft\Wallpaper1.bmp" > nul
goto :EOF
با استفاده برنامه CI اقدام به تبدیل تصویر منتخب به Bitmap کرده و در ضمن در جای مناسب هم کپی می کند.
سئوال: در این برنامه شانس انتخاب شدن هر عکس با عکس دیگر برابر است.ولی من می خواهم شانس انتخاب شدن یک تصویر خاص، دو برابر دیگر تصاویر باشد! آیا این امکان پذیر است؟
جواب: بله، به راحتی امکان پذیر است.برای این منظور شما باید از روش فایل فهرست استفاده کنید و در این فایل هر چه بخواهید نام فایل مورد نظر خود را تکرار کنید.مثلا اگر فهرست اصلی به شکل:
کد:
کد PHP:
C:\MY Pictue\3d\1.jpg
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\wallpaper\Best1.png
C:\MY Pictue2\wallpaper\Best1.png
است و شما می خواهید تصویر My Pic.gif از شانس سه برابری برای انتخاب نسبت به دیگر فایل ها،برخوردار باشد،کافیست این فایل را به این شکل تغییر دهید:
کد:
کد PHP:
C:\MY Pictue\3d\1.jpg
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\wallpaper\Best1.png
C:\MY Pictue2\wallpaper\Best1.png
علاقه مندی ها (Bookmarks)