گیک فارسی

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

فقط برای تفریح ،‌ داستان یک انقلاب اتفاقی

نویسنده:
۵ شهریور ۹۳

من زیاد اهل مطالعه کتاب نیستم ، شاید اگه مطالب فنی که توی ebook ها و اینترنت خوندم و همینطور وبلاگ ها را جمع کنیم یک کتابخانه چند قفسه بزرگ بشود و یا حتی شمارش فیلم‌هایی که دیدم از دستم در رفته باشد ولی کتاب‌هایی که خواندم به زور به ۳ یا ۴ عنوان میرسد.

50

چند روز پیش بود که داشتم وبلاگ دوست خوبم جادی (ما به صورت اجتماعی و رو در رو با هم ملاقات نداشته‌ایم و من تنها یک ایمیل برای رفع یک مشکل فنی در سایت مبین نت برایش نوشتم اما میدانم که در صورت ملاقات با هم دوست خواهیم شد ;)) را میخواندم که باز هم یک حرکت ارزشمند در دنیای سورس باز یا همون باز متن انجام داده و کتابی که در مورد چگونگی حیات لینوکس و زندگی شخصی و عقاید خالقش یعنی لینوس توروالدز هست را ترجمه کرده و به صورت رایگان منتشر کرده.

من به دو دلیل این کتاب را خوندم ! اول اینکه بالاخره خودم یک جورایی گیک هستم و به شدت لینوکس را دوست دارم و میخواستم در مورد چگونگی حیاتش و همینطور خالقش بیشتر بدونم. و دوم اینکه جادی نثر خوبی داره و قطعاً موضوعات با‌ ارزشی توی کتاب بوده که ترجمش کرده.

منی که ۳ یا ۴ عنوان بیشتر کتاب نخوندم و اون ها هم رمان و تاریخی بوده این کتاب را توی ۳ روز تمومش کردم ، البته کتاب بزرگی نیست و فقط ۱۷۳ صفحه هستش ولی خوب برای من رکورد خوبیه ! من به شدت خوندن کتاب را به برنامه نویس ها و علاقه‌مندان جامعه سورس باز پیشنهاد میکنم و درخواست میکنم اگه کتاب را خوندین و خوشتون اومد حتماً از طریق سایت کتابش donate کنین تا فرهنگ این کار در جامعه شکوفا بشه.

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

نویسنده:
۲۸ مرداد ۹۳

گاهی پیش میاد که ممکنه بخوایم چک کنیم آیا هاست یک سایت به قول معروف 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 ها امن هستند و میتوان از آن‌ها با خیال راحت استفاده کرد ؟

نویسنده:
۲۳ مرداد ۹۳

من با این سؤال خیلی جا ها روبرو شدم و حتی خوندم که بعضی از همکاران به دوستان برنامه نویس تازه کار میگویند 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 ها هسش تا اگه هم لو رفتند قابل استفاده نباشن.

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

نصب SQLite3 برای استفاده در PHP

نویسنده:
۱۲ مرداد ۹۳

از اونجا که شاید خواننده‌ای داشته باشیم که از SQLite چیزی ندونه و من برنامه نویسهای زیادی را دیدم که اطلاعاتی نداشتند توضیح میدم که SQLite یک پایگاه داده مبتنی بر فایل هست که همه تنظیمات و اطلاعات مربوط به پایگاه داده توی یک فایل ذخیره میشه و قابلیت جابجایی داره بدون نیاز به نصب سرویس دهنده. دقیقاً شبیه به MS Access شرکت مایکروسافت البته با قدرت بسیار بیشتر و در ضمن سورس باز بودن.

برای یک پروژه تصمیم به استفاده از SQLite گرفتم و پس از بررسی PHPINFO متوجه شدم که نصب نیست و باید نصبش کنم. جالب اینجا بود که خیلی از سایت‌ها و منابع توی اینترنت فقط گفته بودند که باید بسته php5-sqlite را نصب کنیم و آپاچی را ریست کنیم. اما پس از انجام کار متوجه شدم که PHPINFO همچنان نشانه ای از sqlite نداره. پس از بررسی های بیشتر متوجه شدم باید به شکل زیر نصب بشه :

sudo apt-get install libsqlite3-0 libsqlite3-dev php5-sqlite
sudo service apache2 restart

مشکل من بسته libsqlite3-dev بود که بعد از نصب و راه اندازی مجدد apache مشکل رفع شد.
این هم یک نمونه کد که کمی در مورد کلاس و روش استفاده آگاهی ابتدایی بده :

$db = new SQLite3('my_database') or die('Unable to open database');
$query = <<<EOD
  CREATE TABLE IF NOT EXISTS users (
    username STRING PRIMARY KEY,
    password STRING)
EOD;
$db->exec($query) or die('Create db failed');
$user = sanitize($_POST['username']);
$pass = sanitize($_POST['password']);
$query = <<<EOD
  INSERT INTO users VALUES ( '$user', '$pass' )
EOD;
$db->exec($query) or die("Unable to add user $user");
$result = $db->query('SELECT * FROM users') or die('Query failed');
while ($row = $result->fetchArray())
{
  echo "User: {$row['username']}\nPasswd: {$row['password']}\n";
}