وقتی یک پروژه PHP را روی سرور مشتری تحویل میدهید، عملا کل دارایی فکری خودتان را هم تحویل داده اید. هر کسی که به فایل ها دسترسی داشته باشد میتواند کد را بخواند، لایه لایسنس را حذف کند و همان محصول را به دیگری بفروشد. انکد کردن فایل PHP دقیقا برای بستن همین شکاف ساخته شده است: کد اجرا میشود اما خوانده نمیشود. در ادامه میبینیم این کار چطور انجام میشود، چه ابزارهایی دارد و کجا واقعا به آن نیاز دارید.
PHP یک زبان مفسری است و فایل های آن متن ساده اند. سروری که کد شما را اجرا میکند، همان فایلی را میخواند که شما نوشته اید. این ویژگی برای توسعه عالی است اما برای فروش نرم افزار یک ضعف ساختاری محسوب میشود. انکدر این زنجیره را قطع میکند: کد را پیش از تحویل به بایت کد اختصاصی تبدیل میکند و نسخه ای که به دست مشتری میرسد دیگر شبیه هیچ کد قابل خواندنی نیست.
مشخص کنید کدام فایل ها منطق اصلی و ارزش تجاری شما هستند و کدام باید خام بمانند.
بر اساس نسخه PHP هدف، نیاز به لایسنس گذاری و حجم کار، بین انکدرها انتخاب کنید.
با لایسنس اختصاصی یا سرویس آنلاین، خروجی محافظت شده بسازید.
فایل خروجی را روی سروری که لودر دارد اجرا و همه مسیرهای برنامه را بررسی کنید.
نسخه خام را بکاپ بگیرید و مشخصات نسخه انکد شده را مستند کنید.
خروجی انکدر یک فایل با همان پسوند php است که در ابتدای آن یک هدر کوتاه و پس از آن داده باینری قرار دارد. وقتی سرور این فایل را اجرا میکند، لودر آن را در حافظه رمزگشایی میکند و نتیجه را به موتور PHP میدهد. بنابراین سه شرط باید همزمان برقرار باشد: فایل درست انکد شده باشد، لودر روی سرور نصب باشد و نسخه PHP سرور با نسخه هدف انکد سازگار باشد.
این سه اصطلاح مدام جای هم استفاده میشوند و همین باعث انتخاب اشتباه میشود. مینیفای فقط فاصله ها و کامنت ها را حذف میکند؛ کد همچنان کاملا خوانا است و هدفش کاهش حجم است، نه امنیت. ابفاسکیت یک قدم جلوتر میرود و نام متغیرها و توابع را به رشته های بی معنی تبدیل و ساختار را درهم میریزد، اما خروجی همچنان یک فایل PHP معتبر است. یعنی هر کسی با صرف زمان کافی و ابزارهای موجود میتواند بخش زیادی از منطق را بازسازی کند.
انکد از جنس دیگری است. خروجی دیگر کد PHP نیست، بایت کد است و بدون لودر اصلا اجرا نمیشود. تفاوت عملی این است که ابفاسکیت خواندن کد را خسته کننده میکند، اما انکد آن را از نظر اقتصادی بی صرفه میکند. برای محصولی که قرار است فروخته شود، فقط گزینه سوم مدل کسب و کار را حفظ میکند.
سه لایه محافظت از کد و میزان مقاومت هرکدام در برابر بازگردانی
انتظار درست داشتن از انکد نیمی از راه است. انکد از خوانده شدن منطق برنامه، ویرایش غیرمجاز و حذف لایه لایسنس جلوگیری میکند و امکان ارائه نسخه دمو با تاریخ انقضا را فراهم میکند. اما انکد یک لایه امنیتی برای سرور نیست: اگر رمز SSH ضعیف باشد یا مجوز فایل ها اشتباه تنظیم شده باشد، نفوذگر همچنان میتواند دیتابیس را بخواند یا فایل آپلود کند. امنیت زیرساخت و محافظت از کد دو مسئله جدا هستند
نکته دوم اینکه انکد جلوی کپی شدن خود فایل را نمیگیرد. مشتری میتواند پوشه پروژه را روی سرور دیگری کپی کند و اگر آنجا هم لودر نصب باشد برنامه اجرا میشود. چیزی که این حالت را کنترل میکند لایسنس گذاری است؛ یعنی قفل کردن اجرا روی دامنه، آی پی یا بازه زمانی مشخص که ابزارهای حرفه ای در کنار انکد ارائه میدهند.
تحویل پروژه سفارشی به مشتری. رایج ترین حالت است. سیستمی سفارشی مینویسید و آن را روی سرور مشتری مستقر میکنید. بدون انکد، مشتری میتواند همان سیستم را به توسعه دهنده دیگری بدهد تا نسخه های بعدی را ارزان تر بسازد و شما از چرخه پشتیبانی حذف میشوید.
فروش افزونه، قالب یا اسکریپت. وقتی محصول به ده ها یا صدها مشتری فروخته میشود، احتمال انتشار غیرمجاز آن تقریبا صد در صد است. انکد به همراه لایسنس دامنه ای، بازفروش و توزیع رایگان را عملا متوقف میکند.
ارائه نسخه آزمایشی. اگر میخواهید نسخه سی روزه در اختیار مشتری بگذارید، منطق انقضا باید داخل کدی باشد که مشتری نتواند آن را پیدا و حذف کند. با کد خام این کار در چند دقیقه دور زده میشود.
پروژه هایی با الگوریتم اختصاصی. اگر ارزش محصول شما در یک الگوریتم قیمت گذاری، موتور تخصیص یا روش پردازش خاص است، همان چند فایل کلیدی مهم ترین گزینه برای انکد کردن هستند و لازم نیست کل پروژه را درگیر کنید.
بازار ابزار انکد PHP کوچک اما کاملا جاافتاده است. سه نام اصلی و یک دسته ابزار رایگان وجود دارد که تفاوتشان در پشتیبانی از نسخه های جدید PHP، امکانات لایسنس و مدل هزینه است.
مقایسه ابزارهای رایج انکد PHP از نظر پشتیبانی نسخه، لایسنس و هزینه
ionCube پرکاربردترین گزینه است و تقریبا همه هاست های حرفه ای لودر آن را به صورت پیش فرض فعال دارند. همین موضوع مهم ترین مزیتش است: احتمال اینکه فایل انکد شده روی سرور مشتری اجرا نشود بسیار پایین است. امکاناتی مثل قفل دامنه و آی پی، تاریخ انقضا و فایل لایسنس جداگانه را هم پشتیبانی میکند و نسخه های به روز آن با PHP نسخه 8 سازگارند. فهرست کامل نسخه های پشتیبانی شده در مستندات رسمی ionCube منتشر میشود.
SourceGuardian رقیب مستقیم ionCube است، از نسخه های جدید PHP پشتیبانی میکند و امکانات لایسنس گذاری کاملی دارد. تفاوت اصلی در گستردگی نصب لودر است؛ لودر آن به اندازه ionCube روی هاست های ایرانی و خارجی فعال نیست و ممکن است مجبور شوید از مشتری بخواهید آن را نصب کند. اگر مخاطب شما کاربران هاست اشتراکی هستند، این یک ریسک عملی است.
Zend Guard زمانی گزینه محبوبی بود اما توسعه اش عملا متوقف شده و از نسخه های جدید PHP پشتیبانی نمیکند. استفاده از آن برای پروژه های امروزی توصیه نمیشود، چون شما را روی نسخه های قدیمی و ناامن PHP قفل میکند.
ابزارهای رایگانی وجود دارند که با تحلیل درخت نحوی، نام ها را تغییر میدهند و رشته ها را کدگذاری میکنند. اینها برای پایین آوردن خوانایی کد در پروژه های کم اهمیت بد نیستند، اما همان طور که گفتیم خروجی همچنان PHP اجراپذیر است. اگر ارزش محصول شما به کدش وابسته است، این دسته جایگزین انکدر نیستند و حس امنیت کاذب میدهند.
بعد از انتخاب ابزار، سوال بعدی این است که خود فرایند انکد را چطور انجام بدهید. سه مسیر وجود دارد و انتخاب بین آنها بیشتر از آنکه فنی باشد، اقتصادی است.
مسیر استاندارد از مخزن سورس تا تحویل نسخه انکد شده
در این حالت نرم افزار انکدر را روی سیستم خودتان دارید و هر زمان بخواهید بدون محدودیت انکد میکنید. برای تیمی که محصول دائمی دارد و ماهانه چند نسخه منتشر میکند، این تنها گزینه منطقی است. اما دو مانع واقعی وجود دارد: هزینه سالانه که چند صد دلار است و برای تیم های کوچک ایرانی سنگین محسوب میشود، و دشواری پرداخت ارزی و تمدید سالانه لایسنس.
حساب سرانگشتی ساده است: اگر تعداد فایل هایی که در سال انکد میکنید کم است، هزینه هر فایل با لایسنس سالانه بسیار بالاتر از پرداخت موردی درمیآید. نقطه سربه سر معمولا جایی است که انکد به یک کار تکراری و هفتگی تبدیل شود.
گزینه دوم استفاده از سرویسی است که روی لایسنس تجاری معتبر اجرا میشود و شما فقط بابت همان فایل هایی که واقعا انکد میکنید هزینه میدهید. برای فریلنسرها و تیم هایی که چند پروژه در سال تحویل میدهند، این مسیر هم از نظر هزینه و هم از نظر دردسر پرداخت ارزی به شدت ساده تر است. برای این کار میتوانید فایل ها را در سرویس آنلاین انکد فایل های PHP در پی اچ پی گارد آپلود کنید و خروجی سازگار با لودر ionCube را تحویل بگیرید.
اگر تیم شما فرایند انتشار منظمی دارد، انکد را به جای کار دستی به مرحله ای از خط بیلد تبدیل کنید. انکدرها رابط خط فرمان دارند و میتوان آنها را در اسکریپت انتشار صدا زد تا خروجی نهایی همیشه به شکل یکسان ساخته شود:
# نمونه ساختار یک مرحله انتشار git archive --format=tar HEAD | tar -x -C build/ encoder-cli --exclude config/ --exclude views/ build/ -o dist/ tar -czf release-1.4.0.tar.gz dist/
مزیت این روش حذف خطای انسانی است. وقتی انکد دستی انجام میشود، دیر یا زود یک نسخه خام به جای نسخه انکد شده برای مشتری ارسال میشود؛ اتفاقی که بیشتر از آنچه فکر میکنید رخ میدهد.
بیشتر مشکلاتی که بعد از تحویل پروژه پیش میآید ریشه فنی پیچیده ای ندارد و از رعایت نکردن چند نکته ساده میآید.
پنج گام استاندارد پیش از تحویل نسخه انکد شده
فایل هایی که باید خام بمانند. فایل پیکربندی که مشتری باید مقادیر دیتابیس و کلیدها را در آن وارد کند، فایل های قالب و ویو که ممکن است نیاز به شخصی سازی داشته باشند و فایل های استاتیک مثل جاوااسکریپت و سی اس اس. انکد کردن اینها فقط پشتیبانی شما را سخت تر میکند بدون اینکه چیزی به امنیت اضافه کند.
نسخه هدف PHP را از قبل مشخص کنید. خروجی انکدر برای بازه مشخصی از نسخه های PHP ساخته میشود. اگر ندانید سرور مشتری روی چه نسخه ای است، احتمال زیادی دارد فایل روی سرور او اجرا نشود. این را پیش از انکد بپرسید، نه بعد از تحویل.
بکاپ سورس خام غیرقابل مذاکره است. انکد یک مسیر یک طرفه است و راهی برای بازگرداندن فایل به سورس اصلی وجود ندارد. نگهداری کد در یک مخزن گیت خصوصی حداقل کاری است که باید انجام بدهید؛ تیم هایی بوده اند که با پاک شدن سیستم توسعه، عملا محصول خودشان را از دست داده اند.
نسخه ها را مستند کنید. برای هر تحویل ثبت کنید که با کدام ابزار، کدام نسخه انکدر و برای کدام نسخه PHP ساخته شده است. یک سال بعد که مشتری برای ارتقای سرور تماس میگیرد، همین یادداشت کوتاه ساعت ها وقت شما را نجات میدهد.
فایل انکد شده برای اجرا به لودر متناسب با نسخه PHP نیاز دارد. روی بیشتر هاست های اشتراکی حرفه ای این لودر از قبل فعال است و کاری لازم نیست؛ روی سرور اختصاصی یا مجازی معمولا باید یک بار نصب شود. مراحل کامل این کار در راهنمای آموزش نصب ionCube روی سرور توضیح داده شده است.
پاسخ صادقانه این است: هیچ روش محافظت از کد صد در صد نیست، چون کد در نهایت باید روی ماشینی اجرا شود که در اختیار مشتری است. اما فاصله بین «سخت» و «غیرممکن» در عمل تعیین کننده است. برای نسخه های بسیار قدیمی انکدرها ابزارهای بازگردانی منتشر شده بود؛ نسخه های امروزی با ساختار متفاوتی کار میکنند و بازگردانی آنها نیازمند تخصص و زمانی است که در عمل بسیار گران تر از خرید خود محصول تمام میشود.
نتیجه عملی این است که انکد را نه به عنوان یک قفل نفوذناپذیر، بلکه به عنوان ابزاری برای بالا بردن هزینه حمله ببینید. سه کار این هزینه را واقعا بالا میبرد: استفاده از نسخه به روز ابزار انکد، ترکیب انکد با لایسنس سمت سرور به طوری که بخشی از اعتبارسنجی روی سرور خودتان انجام شود، و بستن قرارداد مشخص با مشتری. لایه حقوقی در بازارهای واقعی دست کم به اندازه لایه فنی بازدارنده است.
جمع بندی: انکد کردن فایل PHP تنها راهی است که کد شما را از خوانده شدن و ویرایش نگه میدارد، اما فقط زمانی نتیجه میدهد که هدفمند انجام شود: انتخاب درست فایل ها، هماهنگی نسخه PHP با سرور مقصد، نگهداری بکاپ سورس خام و اطمینان از فعال بودن لودر روی سرور مشتری. اگر تعداد پروژه هایتان کم است سرویس آنلاین از خرید لایسنس سالانه به صرفه تر است و اگر انتشار منظم دارید، انکد را وارد خط بیلد کنید تا خطای انسانی حذف شود.
سورس کد قابل خواندن را به بایت کد اختصاصی تبدیل میکند. فایل خروجی اجرا میشود اما محتوای آن قابل خواندن یا ویرایش نیست و برای اجرا به لودر روی سرور نیاز دارد.
خروجی ابفاسکیت همچنان کد PHP معتبر و با صرف زمان قابل بازگردانی است، اما خروجی انکد بایت کد است و بدون لودر اصلا اجرا نمیشود. برای محصول تجاری فقط انکد کافی است.
در عمل تفاوت محسوسی ایجاد نمیشود. کد از پیش پردازش شده است و لودر مکانیزم کش خودش را دارد؛ در برخی پروژه ها اجرای اندکی سریع تر هم گزارش شده است.
خیر. باید نسخه خام را ویرایش کنید و دوباره انکد بگیرید. به همین دلیل نگهداری سورس اصلی در مخزن خصوصی الزامی است.
بله. ابزارهای حرفه ای امکان قفل کردن اجرا روی دامنه، آی پی یا بازه زمانی مشخص را در کنار انکد ارائه میدهند و همین ویژگی جلوی بازفروش را میگیرد.
در بیشتر هاست های حرفه ای لودر ionCube از قبل فعال است و مشکلی پیش نمیآید. در غیر این صورت باید فعال سازی آن از پشتیبانی هاست درخواست شود.
اگر انکد کردن برای شما کاری موردی و چند بار در سال است، پرداخت به ازای فایل از طریق سرویس آنلاین به مراتب کم هزینه تر است. خرید لایسنس سالانه وقتی توجیه دارد که انکد به یک کار تکراری و مستمر تبدیل شده باشد.
فاماسرور