گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

حرف حساب در مورد PHP و Framework ها و Design Pattern ها

نویسنده:
13 اکتبر 17

اگه عنوان براتون نامفهومه خوندن را ادامه بدین چون من عموما علاقه‌ای به ترجمه کلمات علمی به فارسی ندارم! این پست شاید مهم‌ترین پست کل وبلاگ من باشه و چند سال میشه میخواستم بهش بپردازم ولی انقدر جامع و نیاز به بررسی و مرجع دادن بود که وقتش را واقعاً پیدا نمیکردم ! مخصوصاً بعد از بدنیا اومدن فرزندم!

میخوام شما را لینک بدم به مقاله‌ای که حرف‌هایی که میزنه حرف دل منه و به نظرم خیلی مهمه برای هر برنامه نویس PHP که این مقاله را بخونه. پس برای خوندنش عجله کنید و امروز و فردا نکنید :

لینک به مطلب اصلی
دانلود نسخه PDF ی که من برای اولین بار خوندمش برای حفظ سند

حذف کاراکتر های غیر فارسی و انگلیسی و علائم از متن در PHP

نویسنده:
27 ژانویه 16

یکی از سوالاتی که خیلی توی انجمن ها بهش برخورد کردم این هست که کاربر میخواد کاراکتر هایی که مدنظرش نیست را از یک رشته حذف کنه ،‌ در واقع میخواد whitelist یا همون فهرست سفید بگذاره ،‌ از اونجا که عموما دوستان نیاز به حفظ کاراکتر های فارسی و انگلیسی و علامت های پر استفاده در متون هستند من RegExp را برای این کاراکتر ها نوشتم اما شما میتونید کاراکتر های دیگه را با رعایت escape کردن کاراکتر غیر مجاز RegExp اضافه کنید:

$str = "^Ao طp9@ژ~|;_Zcی۸?(-)!";
function sanitize($str){
	echo preg_replace("/[^A-Za-z0-9_\?\-\(\)\! \ا\ب\پ\ت\ث\ج\چ\ح\خ\د\ذ\ر\ز\ژ\س\ش\ص\ض\ط\ظ\ع\غ\ف\ق\ک\گ\ل\م\ن\و\ه\ی\ک\آ\ی\ئ]/", "", $str);
}
echo sanitize($str);

پیدا کردن فایل‌هایی که BOM دارن و طریقه حذف کردنشون

نویسنده:
20 جولای 15

همچنان یکی از چالشی ترین مباحثی که توی انجمن‌های PHP بهش بر میخورم خطای معروف Headers Already Sent هست که توضیحات مختصری توی این پُست در موردش دادم و اگه اون را بخونین متوجه میشین که وجود BOM یا همون Byte Order Mark یکی از مهمترین دلایلی هست که باعث به وجود اومدن این خطا میشه.

البته همیشه BOM باعث این مشکل نیست اما اگه بتونیم بفهمیم آیا فایلی توی پروژه ما هست که آلوده (کلمه درستی نیست اما برای این مطلب کاربردیه !) به BOM باشه خودش خیلیه ! خوب توی لینوکس که اصلاً نیاز به فکر کردن نیست و با یک جستجوی ساده به دستور زیر میرسیم :

grep -rlI $'\xEF\xBB\xBF' . --include \*.php

توجه : فرض بر این هست که دستور را وقتی در پوشه اصلی پروژه هستیم میزنیم (. [نقطه] توی لینوکس یعنی پوشه جاری)

اگه فایلی نبود که قطعاً مشکل از BOM نیست و اگه چند تا فایل بود هم میتونیم یکی یکی بازشون کنیم و دوباره بدون BOM ذخیرشون کنیم ،‌اما اگه تعدادشون زیاد بود خوب میشه نوشت :

find . -type f -name '*.php' -exec sed '1s/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

البته ممکنه این فایل‌ها هم با وجود داشتن BOM دخالتی توی خطای صفحه مربوط نداشته باشن و باید دنبال مشکلات دیگه گشت.

واوو… داشت یادم میرفت ،‌ نمیدونم چرا همیشه فرض میکنم خوانندگان وبلاگ من تا حالا متوجه شدن ویندوز ابزار مناسبی برای توسعه وب نیست و مهاجرت کردن به لینوکس اما خوب چه میشه کرد ،‌ همچنان ممکنه دوستانی ویندوز را ترجیح بدهند !

در مورد ویندوز هم یک برنامه bomremover هست که کارتون را راحت میکنه و به راحتی میتونید فایل‌های php را از BOM پاک کنید :

bomremover.exe D:\www\myWebsite *.php

به طور کلی هر برنامه‌ای که بتونه محتویات فایل‌ها را بررسی کنه و بتونید بهش مقدار HEX بدین باهاش میشه BOM ها را جستجو و حذف کرد. مقدار BOM برای UTF-8 هم EF BB BF هستش و نرم افزاری که میدونم این قابلیت را داره Total Commander هستش.

توضیحات مختصر و مفید در مورد خطای Headers Already Sent در PHP

نویسنده:
25 ژوئن 15

یکی از متداول ترین پرسش های برنامه نویسان در انجمن‌های PHP در مورد خطای Headers Already Sent هست.PHP به صورت عادی اطلاعات را Buffer نمیکنه ، یعنی خروجی ها را در لحظه ارسال میکنه ، خیلی ساده اگه بخوام بگم ، ارسال ها را به دو دسته تقسیم میکنیم یکی Header ها و دیگری Content یا همون محتوا ،‌Header ها قبل از محتوا ارسال میشن و این یک قرارداد بر اساس HTTP Protocol هست.

headers already sent

PHP وقتی شما اولین مقدار حالا بایت یا کاراکتر یا هر چی را ارسال میکنید ابتدا Header های استاندارد و اونهایی که شما با تابع ()header ارسال کردین را میفرسته و بعدش شروع به ارسال محتوا میکنه. حالا اگه شما بعد از ارسال محتوا تابع ()header را صدا بزنین خیلی طبیعیه که PHP بگه Header ها را ارسال کردم و نمیشه شما Header دیگری بفرستی !

این محتوا بعضی مواقع میتونه یک Space هم باشه یا کاراکتری که به چشم نمیاد مثل BOM که ادیتور ها برای فایل های یونیکد اضافه میکنن یا خطایی که PHP داره در موردش توی خروجی توضیح میده یا ممکنه خود شما بدون اینکه متوجه باشین دارین یک مقداری را با echo یا print ارسال میکنید.
در زمانی که این خطا را میبینید PHP در انتهای توضیح با Output Started At اشاره میکنه که اولین خروجی در چه فایلی و کجاش ارسال شده که میشه با بررسی اون فایل متوجه مشکل شد و اون را رفع کرد. راه دیگه این هست که با یک درخواست Http از یک نرم افزار مثل wget توی لینوکس یا هر چیز متشابه دیگه توی ویندوز بیایم و خروجی را بررسی کنیم و ببینیم داره چی ارسال میشه و بعدش اون مقدار را توی فایل هامون جستجو و مرتفع کنیم.

اگه بخوایم این حالت را نداشته باشیم و رفتاری شبیه به ASP .NET داشته باشیم باید به PHP بگیم خروجی را در لحظه ارسال نکنه و اون را Buffer کنه و در آخر همه را با هم اعم از Header و خروجی ارسال کنه. برای این کار از Output Buffering استفاده میکنیم. برای این کار قبل از شروع کد ها تابع ()ob_start را صدا میزنیم و در آخر هم ()ob_end_flush باعث ارسال اطلاعات به مرورگر کاربر میشه.

به طور کلی Output Buffering را فقط زمانی توصیه میکنم که واقعاً قصد دخل و تصرف در محتوا قبل از ارسال به کاربر را داشته باشین و در غیر این صورت روش معمول کفایت میکنه و بهتره با کمی صبر و بررسی مشکل ارسال Header را بررسی کنید.

وقتی مایکروسافت ویرایشگر اسکریپت نویسی رایگان تولید میکنه !

نویسنده:
9 می 15

امروز در حال وبگردی بودم که به یک مورد جالب برخورد کردم. حتماً میدونید که چند وقت پیش مایکروسافت از مستقل از سکو شدن محصولاتش گفته بود و اینکه در آینده Net Framework. و بسیاری از محصولاتش روی سیستم عامل های غیر ویندوزی مثل لینوکس ارائه خواهند شد.

95

اما ارائه یک نرم‌افزار ویرایشگر کد توسط مایکروسافت به نام Microsoft Visual Studio Code و نمایش دموی اون روی سیستم عامل اوبونتو توسط تیم ارائه کننده در کنفرانس مربوطه به تاریخ ۲۵ آوریل ۲۰۱۵ موضوع قابل توجهی هستش که حس کنجکاوی را واقعاً قلقلک میده.

خیلی علاقه‌مند هستم که نصب و امتحانش کنم و به شما هم توصیه میکنم حداقل این تلاش سورس باز جدید مایکروسافت را بهش شانس بدین ، باشد که مقبول اُفتد.

پی نوشت : توی سایتشون یک کلیپ ویدئویی خوب هست که امکاناتش را نشون میده.

رقابت Nginx و Apache در چند سال اخیر و اقبال بیشتر Nginx

نویسنده:
19 فوریه 15

اگر تا به حال مدیریت یک سایت را بر روی یک Server اختصاصی حالا چه Dedicated یا VPS تجربه کرده باشین میدونین که انتخاب یک سرویس دهنده و تنظیمات درستش یکی از مهمترین چالش های مدیریت Server هست.

مقایسه سرویس دهنده ها ۱

اولین نامی که در ذهن برای سرویس دهنده وب متبادر میشه قطعاً Apache هستش. آپاچی از سال ۱۹۹۵ تا کنون مقام اول در سرویس دهی به میلیون‌ها وب سایت را بر عهده داشته ، کاربران بسیاری داره ، ماژول های زیادی در راستای بهبود و توسعه امکاناتش براش نوشته شده و در جامعه سورس باز هم جایگاه تعریف شده و مهمی داره. اما چه دلیلی باعث میشه که با این تفاسیر بخواهیم به سرویس دهنده های دیگه فکر کنیم ؟

آپاچی وقتی با ترافیک بالا روبرو میشه کند میشه و این موضوع دلیلی نداره جز افزایش Process ها که قاتل Memory هستند و علاوه بر اون این Process ها با ایجاد Thread ها بر جنگ دسترسی به منابع Memory و CPU دامن میزنن. حتی با وجود MPM هایی مثل worker و event علاوه بر pre_fork باز هم Apache با مشکلات Process ها و Thread هاش دست به گریبان هست و زمانی که ترافیک افزایش پیدا میکنه با کندی مواجه میشه و گاهی اوقات با توجه به تنظیماتش کلاً مانع از دسترسی کاربران به سایت میشه.

در مقابل Apache انتخاب های دیگه ای هم وجود داره که Nginx در بینشون اقبال بیشتری داشته اما چرا ؟ بر خلاف Apache که با ایجاد Process ها و Thread های جدید درخواست های کاربر را پاسخ میده ، Nginx به صورت Event Driven و Asynchronous با توجه به تنظیمات مدیر سیستم که تعداد Worker Process ها را تعین میکنه و هر Process فقط یک Thread داره و میتونه هزاران کاربر را پاسخگو باشه کار میکنه.این تفاوت عملکرد تأثیر خیلی زیادی داره و Nginx را Stable تر و سریعتر میکنه. همین افزایش سرعت باعث میشه بسیاری از مدیران سیستم به سمت Nginx تمایل پیدا کنند و محبوب بشه.

مقایسه سرویس دهنده ها ۲

یکی از ایراد هایی که به Nginx گرفته میشه این هست که برای کار با محتوای دینامیک بر خلاف Apache که با ماژول هایی نظیر mod_php و mod_python و mod_rails و mod_rack میتونه مانع از اجرای هر بار Interpreter اون زبان بشه عمل میکنه و در این زمینه کند خواهد بود.

اخیراً دو تا پروژه وب سایت روی Server اختصاصی VPS را شروع کردم و با توجه به مطالبی که در مورد Nginx خونده بودم میخواستم امتحانش کنم و ببینم چقدر از Apache بهتر عمل میکنه. البته من با استفاده از php-fpm روی Nginx اصلاً مشکل سرعت برای php که در پاراگراف بالا اشاره کردم را احساس نکردم و در کل به نظرم خیلی بهتر از Apache جواب میده.مشکل بزرگی که داشتم عدم پشتیبانی از htaccess. برای همون بحث سرعت بود که تونستم به روش Nginx مشکلاتش را حل کنم.

شما هم میتونین روی سیستم Local خودتون Nginx را امتحان کنید و از سرعت بالاش در پروژه های بعدی بهره ببرید.

ایجاد Cron Job (کرون جاب) به صورت دینامیک با PHP

نویسنده:
23 دسامبر 14

به طور کلی هر وقت بخواهیم یکسری عملیات را به صورت تکراری در بازه های زمانی مشخص انجام بدیم از Cron Job استفاده میکنیم. Cron یک سرویس برای زمانبندی انجام کار ها در لینوکس هست که با دستور crontab میشه اون را مدیریت کرد. معمولاً ما از طریق cPanel میتونیم Cron Job های مورد نظرمون را تعریف و به کار بگیریم. اما اگه بخواهیم Cron Job ها را به صورت دینامیک ایجاد کنیم چی ؟

برای ایجاد Cron Job به صورت دینامیک سه تا سناریو داریم :
– از یک هاست اختصاصی حالا VPS یا Dedicated استفاده میکنیم و به دستور crontab از طریق PHP دسترسی داریم. در این حالت با تابع exec و دستور crontab به راحتی میتونیم cronjob ها را مدیریت کنیم.

– از یک هاست Shared استفاده میکنیم که از cPanel نسخه ۱۱.۳۲ به بالا استفاده میکنه ، در این حالت cPanel API2 – Cron را در اختیار داریم و براحتی با cPanel از طریق PHP میتونیم cronjob ها را مدیریت کنیم. اینجا توی پاسخ تأیید شده میتونید مثال‌های کاربردی را ببنید.

– از یک هاست Shared استفاد میکنیم که cPanel قدیمی داره و از cPanel API2 پشتیبانی نمیکنه ولی از SSH پشتیبانی میکنه و دسترسی های مورد نیاز هم از این طریق به ما میده. میتونید یکبار از طریق یک نرم‌افزار مثل putty کامل چک کنید و مطمئن بشین میتونید Cron Job ها را مدیریت کنید. حالا از طریق PHP libssh2 میتونید Cron Job ها را مدیریت کنید. اینجا یک آموزش کامل لاتین در این مورد هست.

– از یک هاست Shared استفاد میکنیم که cPanel قدیمی داره و از cPanel API2 و SSH (من جای شما بودم هاستم را عوض میکردم) پشتیبانی نمیکنه. در این حالت باید از سرویس های Cronjob دیگه که امکان مدیریت از طریق وب سرویس را فراهم میکنند استفاده کنیم. یکی از این سایت‌ها setcronjob.com هست که خودم زیاد ازش استفاده کرده‌ام و توصیه و تاییدش میکنم (نه اینکه هاست های من از دو روش بالا پشتیبانی نمیکنند بلکه کلاً روی سرویس های shared ترجیح میدم از سرویس های آنلاین استفاده کنم که گزارش گیری داره و از یک جا میتونم Cron Job های همه سایت‌ها را مدیریت کنم).

ارسال ایمیل از طریق حساب کاربری Gmail با PHP (پی اچ پی) از طریق SMTP

نویسنده:
2 دسامبر 14

توی خیلی از انجمن‌های برنامه نویسی به این سؤال برخوردم که چطور باید با PHP از حساب کاربری Gmail ایمیل ارسال کنیم. عده‌ای هم که میدونستند چطور باید این کار را بکنند اکثر ناموفق بودند. تصمیم گرفتم این مطلب را بنویسم تا مشکل خیلی از دوستان حل بشه.

برای ارسال ایمیل از Gmail برخلاف حالتی که از طریق وب سرور و یک MTA مثل Sendmail ایمیل ارسال میکنیم ، باید از SMTP استفاده کنیم. لازم هم نیست خیلی در مورد SMTP بدونیم و کلاس PHPMailer به خوبی SMTP را پشتیبانی میکنه. پس اولین کار اینه که PHPMailer را دانلود کنیم و بسته به مسیری که قرار دادیمش توی فایل ارسال ایمیل صداش کنیم. حواستون باشه که توی Package ی که دانلود میکنید یک فایل smtp.php هم هست که باید اون را هم در کنار فایل phpmailer.php قرار بدین.

دو نکته مهم :

۱ – اولین نکته مهمی که در رابطه با Gmail وجود داره این هست که Gmail از SSL/TLS استفاده میکنه.TLS روی پورت ۵۸۷ هست و توی کد بایستی به درستی تنظیم بشه.

۲ – دومین نکته مهمی که وجود داره بحث امنیت بالای خود Gmail هست. Gmail به شدت روی IP درخواست های ورود (در حالت SMTP هم شما مثل وب Login میکنید) حساس هست و مثلاً اگه شما از حساب Gmail خودتون توی ایران استفاده میکنید و سعی کنید با SMTP یک ایمیل از سرر خودون که مثلاً در انگلستان هست ارسال کنید. ۹۹ درصد Gmail مانع از Authentication پرتوکل SMTP میشه و خطای Authentication خواهید گرفت. یک ایمیل هم با افتخار از Gmail براتون ارسال میشه که شخص دیگری با پسورد صحیح شما از یک جای دیگه سعی کرده وارد بشه و ما جلوش را گرفتیم !!! :(. این موضوع دو تا راه حل داره :

راه حل اول : حساب کاربری Gmail را روی سرور خودتون بسازین و همیشه هم از همون سرور و IP درخواست SMTP بدین.

راه حل دوم : توی تنظیمات حساب کاربری گوگل در بخش Security → Account Permissions آیتم Access for less secure apps را Enabled کنین (این تغییر تا زمان نوشته شدن این مطلب وجود داشت و ممکنه بعد از مدتی مکانش یا حالتش عوض بشه یا حتی gmail بخواد که شما IP های معتبر مد نظرتون را تعیین کنین).

و اما کد :

 error_reporting(E_ALL);
 ini_set('display_errors','1');

 require("phpmailer.php");
 
 $mailObj = new phpmailer();
 $mailObj->IsSmtp();
 $mailObj->SMTPSecure = "tls";
 $mailObj->Host = "smtp.gmail.com";
 $mailObj->Port = "587";
 $mailObj->SMTPAuth = true;
 $mailObj->Username = "username@gmail.com";
 $mailObj->Password = "password";
 $mailObj->SMTPDebug = true; 
 $mailObj->CharSet = "utf-8";
 $mailObj->FromName = "Fullname";
 $mailObj->From = "username@gmail.com";
 $mailObj->AddAddress("recipient@domain.com",""); 
 $mailObj->Subject = "=?UTF-8?B?".base64_encode("عنوان فارسی نامه")."?=";
 $mailObj->Body = "متن نامه";
 $mailObj->Send();
 
 if ($mailObj->ErrorInfo != "")
 throw new Exception($mailObj->ErrorInfo);
 else 
 echo "Mail sent.";
 
 unset($mailObj);

پی نوشت : با وجود بررسی و دقتی که من در چگونگی حل مشکل ارسال از طریق Gmail SMTP داشتم باز هم یکی از دوستان مشکل داشتند که پس از بررسی متوجه ۲ نکته شدم ، توجه داشته باشید که فقط زمانی این دو نکته را اعمال کنید که خطای Authentication Failure بگیرین یا توی برگشتی Debug جمله Please log in via your web browser بگیرین و در ضمن اگه نکته ۱ مشکل را حل کرد نیاز به اعمال نکته ۲ نیست :

نکته ۱ : پس از ورود به حساب gmail روی این لینک https://www.google.com/accounts/DisplayUnlockCaptcha کلیک کنید و Accept کنید.
نکته ۲ : گذرواژه خودتون را عوض کنید و گذرواژه‌ای شامل حروف کوچک و بزرگ ، اعداد و علایم با طول حداقل ۸ کاراکتر انتخاب کنید.

Ping (پینگ) کردن سایت از طریق PHP

نویسنده:
19 آگوست 14

گاهی پیش میاد که ممکنه بخوایم چک کنیم آیا هاست یک سایت به قول معروف Up یا حاضر هست یا اینکه Down یا قطع شده ، خوب من برای این کار از تابع زیر استفاده میکنم :

function pingDomain($domain){
    $starttime = microtime(true);
    $file      = fsockopen ($domain, 80, $errno, $errstr, 10);
    $stoptime  = microtime(true);
    $status    = 0;

    if (!$file) $status = -1;  // Site is down
    else {
        fclose($file);
        $status = ($stoptime - $starttime) * 1000;
        $status = floor($status);
    }
    return $status;
}

آیا session ها امن هستند و میتوان از آن‌ها با خیال راحت استفاده کرد ؟

نویسنده:
14 آگوست 14

من با این سؤال خیلی جا ها روبرو شدم و حتی خوندم که بعضی از همکاران به دوستان برنامه نویس تازه کار میگویند session ها امن نیستند و نباید از آن‌ها استفاده کرد. خوب اینجاست که مغز آدم سوت میکشه که چرا هر کسی میاد هر حرفی را دوست داشت اونم به یک تازه کار میزنه ؟ من سعی میکنم هر چی در مورد session ها میدونم توضیح بدم تا شاید دوستان من ازش استفاده کنند.

به طور کلی ما برای بازیابی ، پروسس و انجام محاسبات مرتبط با فرد یا افرادی که در حال بازدید از سایت ما هستند از session ها استفاده میکنیم. یکی از مهمترین استفاده هاش هم در زمان پیاده سازی Login و کلاً Authentication هست. امنیت session ها را باید در سمت client و server بررسی کنیم.

برای اینکه کاربرای تازه کار که شاید متأسفانه از بحث‌های امنیتی لذت نبرند هم این مطلب کمکشون کنه توصیه میکنم به آخر مطلب بروند و قسمت راه حل را بخونند. اما توضیحات فنی تر :

در سمت client تنها اثری که از session وجود داره فایل کوکی هست که مشخص کننده session برای سمت سرور هستش. پس در‌ واقع اگه کسی بتونه محتوای این cookie را بدست بیاره در‌ واقع session hijacking انجام داده و میتونه خودش را جای قربانی جا بزنه ! این کار به سه روش معمول انجام میشه ،‌ روش اول session fixation هست که در‌ واقع هکر میاد و با ارسال یک لینک به قربانی از طریق POST یا GET (بعضی زبان‌ها هم از GET و هم POST برای ست کردن session استفاده میکنند) session مورد نظرش را برای قربانی ست میکنه و به حساب شخص دسترسی پیدا میکنه. روش دوم که بهش میگن session sidejacking در‌ واقع همون packet sniffing هست و در‌واقع با بررسی packet های رد و بدل شده cookie مورد نظر و در نهایت session لو میره. در روش سوم هم از طریق Cross Site Scripting یا همون XSS هکر میتونه به session ها دسترسی پیدا کنه.

اما در سمت server هم مشکلات امنیتی در زمان استفاده از session وجود داره. این مشکلات مربوط به هاست های اشتراکی میشه و در‌ واقع همسایه های ما میتونند برامون دردسر ساز بشوند. مثلاً من متوجه میشم قربانی از کجا هاست میگیره و با گرفتن هاست از اون شرکت شروع به سوء‌ استفاده میکنم.

در‌ واقع به صورت پیش‌ فرض همه session ها توی پوشه tmp/ ذخیره می‌شوند و این فایل‌ها متعلق به کاربری هست که web server داره تحتش اجرا میشه ، از اونجا که همه سایت‌ها با همین کاربر به این پوشه و فایل‌ها دسترسی دارند پس میتونند هر بلایی سر این فایل‌ها بیارند و کلاً امنیت سایت شما در مورد session ها از بین میره. راه حل‌های متفاوتی برای مقابله هست که بهترینش استفاده از FastCGI یا suPHP به منظور اختصاص یک کاربر برای هر سایت هستش که در این حالت دیگه کاربر ها نمیتونند به فایل‌های session هم دیگه دسترسی داشته باشند.

راه حل : برای جلوگیری از session hijacking در گام اول باید مانع از ست شدن session از طریق GET و POST بشین.
توجه : به صورت پیش‌فرض یک HOST خوب مانع از این کار شده ولی برای اطمینان دو خط زیر را در فایل htaccess. توی root قرار بدین :

php_flag session.use_trans_sid off
php_flag session.use_only_cookies on

در گام دوم باید هر زمانی که نوع دسترسی کاربر تغییر میکنه ما هم session id جدید ایجاد کنیم. مثلاً بعد از login کاربر session id جدید ایجاد کنیم تا اگه session fixation اتفاق افتاده بی اثر بشه.

در گام سوم برای جلوگیری از session sniffing تنها راه استفاده از SSL هستش.

در مورد مشکل امنیتی server باید بگم بهتره از هاست های معتبر استفاده کنین که براتون از این نظر مشکلی وجود نداشته باشه ولی اگه مطمئن نیستین من سه تا راه را پیشنهاد میکنم که به الویت اینها هستند :

– PHP به شما این امکان را میده که کنترل کنین session چطوری handle بشه. در‌واقع شما میتونید به جای اینکه خود PHP بیاد و session های شما را مدیریت کنه با استفاده از session_set_save_handler مدیریت session ها را بدست بگیرین و به جای استفاده از فایل سیستم اونها را توی database یا حافظه (از طریق Memcache) ذخیره و بازیابی کنید.

– PHP به شما این امکان را میده که از طریق session_save_path مسیر مربوط به ذخیره فایل‌های session را تغییر بدین و امنیت پوشه مربوط مربوط به شما و در اختیار شما خواهد بود.

– کار دیگه ای که میتونید انجام بدین encrypt کردن محتوای session ها هسش تا اگه هم لو رفتند قابل استفاده نباشن.

توجه : تمام مطالب بالا تجربیات و مطالعات شخصی خود من هستش و من هیچ مسئولیتی در صورت بروز هر مشکلی به خاطر استفاده از اونها به عهده ندارم و با مسئولیت خودتون ازش استفاده کنین.