پروژه سیستم رجیستر و لاگین (GPL)

لینک دانلود برنامه

این پروژه در github هم وارد شد: https://github.com/ferchang/reg8log

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

===================

این پروژه تحت مجوز نرم افزار آزاد GPL نسخهء 2 یا بالاتر ارائه میشود.

===================

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

===================

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

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

*: اینکه گفتم این پروژه برای سایتهای کوچک طراحی شده به این معنی نیست که روی یک هاست درپیت ارزان با فضای کم هم مناسب باشه (اول میخواستم بر روی ارزانترین هاستها هم کاملا قابل استفاده باشه، ولی بعد متوجه شدم یک برنامهء حرفه ای با امکانات و امنیت بالا رو نمیشه با چنین شرایطی طراحی کرد یا رسیدن به این هدف میتونه خیلی دشوار باشه که ارزش هزینش رو نداره و بهتره بجاش هاست قوی تری تهیه بشه). دیتابیس این برنامه میتونه حجم قابل توجهی داشته باشه و اگر فضای هاست خیلی کم باشه (مثلا 50 مگابایت) احتمالا با تعداد چند هزار کاربر تمام فضای آزاد هاست میتونه پر بشه، یا ممکنه هکرها از این ضعف برای حملهء خاصی سوء استفاده کرده و با پر کردن فضای هاست (مثلا با تعداد زیادی ثبت نام جدید) موجب مشکل بشن.

===================

طریقهء نصب برنامه:

- یک دیتابیس بنام reg8log رو خودتون باید شخصا ایجاد کنید.
- نام کاربری و پسورد اتصال به MySQL رو در فایل info_dbms.php وارد و سیو کنید.
- بعد وقتی صفحات برنامه رو باز کنید خودش تشخیص میده که جدولها ایجاد نشدن و لینک صفحهء نصب رو در اختیارتون قرار میده.
- وارد صفحهء نصب که شدید اول باید یک عدد رندوم رو که تولید شده از اونجا کپی کرده و در فایل setup.txt واقع در پوشهء setup درج و سیو کنید. این مرحله بخاطر اینه تا ثابت بشه شما مالک حقیقی سایت هستید و به هاست دسترسی دارید. البته این روش رو بچه ها در فروم iranphp.org مطرح کردن که ظاهرا یک برنامهء شناخته شده ای از این روش برای احراز هویت مالک سایت استفاده میکنه.
- در مرحلهء بعد باید پسورد و ایمیل اکانت ادمین رو تعیین کنید.
- اکانت ادمین برای کارهای مدیریتی این برنامه استفاده میشه. کارهایی مثل تایید یا حذف اکانت های معلق، Ban کردن و Unban کردن.
نام کاربری ادمین ثابته (Admin) و ادمین با استفاده از نام کاربریش شناسایی میشه.
- بعد از سابمیت فرم مشخصات ادمین، برنامهء نصب تمام جدولها رو با خوندن از فایلهای sql موجود در پوشهء sql (واقع در پوشهء setup) بصورت خودکار ایجاد میکنه و یکسری متغییرهای اولیهء سایت رو هم تولید و در جدول های مربوطه درج میکنه و دست آخر اکانت ادمین رو هم به دیتابیس سیستم اضافه میکنه.

===================

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

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

احتمالا باید کدهای این برنامه رو ترکیبی از روش شیء گرا، فانکشنال، و غیره دونست چون درش هم از کلاس و اشیاء و هم از تابع و غیره استفاده شده.

===================

اگر خواستید از جدول اکانتهای کاربری این برنامه نسخهء پشتیبان تهیه کنید، باید توجه کنید که هش پسورد کاربران که در دیتابیس برنامه ذخیره شده، به اطلاعات جدول site_vars و نیز مقدار متغییر pepper در فایل کانفیگ info_crypto.php هم بستگی داره. بنابراین باید حداقل از این دو مورد هم نسخهء پشتیبان تهیه و درصورت لزوم برگردان کنید تا بعد از برگردان کردن اطلاعات، کاربران بتونن به اکانتهای خودشون لاگین کنن.

===================

این برنامه در این محیط توسعه داده و تست شده:

سیستم عامل: ویندوز XP SP3

مرورگر: FF 10 و IE 7

EasyPHP 5.3.1.0 که شامل MySQL 5.1.43 و PHP 5.3.2 و Apache 2.2.14 میشه.

این برنامه روی PHP 4 کار نمیکنه، و حتی روی نسخه های بیش از حد پایین سری 5 هم کار نمیکنه، اما فکر میکنم نسخه هایی از سری 5 که الان روی بیشتر هاستها نصب هستن برای اجرای برنامه کافی باشه.

ضمنا خواستم این پروژه رو در محیط GNU/Linux هم تست کنم، اما خودم یک نسخهء خیلی قدیمی از لینوکس رو دارم (فدورا 5) که برنامه روش درست کار نکرد. سرفرصت اگر تونستم یک نسخهء جدیدتر لینوکس رو تهیه و نصب میکنم تا بتونم سازگاری این برنامه رو در محیط لینوکس هم تست و اگر اشکالی داشت درستش کنم.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>