جلوگیری از حملات gif shell

امروز آقای الله پرست از من پرسید که چطوری می شه یه حمله gift shell رو خنثی کرد. من در ابتدا به همه شما توصیه می کنم که از suphp استفاده کنید تا امنیت بیشتری داشته باشید. یه چند تا نکته جالب داره این نوع حملات اینکه فایل شل باید اسمی شبیه به shell.php.gif داشته باشه تا بتونه روی سرور آپلود بشه. راه های زیادی برای جلوگیری از این نوع حملات وجود داره. از جمله کانفیگ کردن آپاچی طوری که چنین فایل هایی رو اسطلاحا execute نکنه. به عنوان مثال php.gif.* نباید execute بشه. اما خب شاید با نام های مختلفی این کار صورت بگیره. یه راه دیگه اینه که شما فایل های موجود در دایرکتوری آپلود رو با استفاده از یک فایل htaccess. غیر قابل execute کنید و یا اینکه محتویات فایل رو بخونید و مطمئن بشید که هیچ shell در این فایل موجود نیست.
اما بهترین راه برای اینکه خیال خودتون رو راحت کنید اینه که فایل رو تغییر نام بدید. به عنوان مثال زمانی که shell.php.gif رو می خواهند رو سرور آپلود کنند کافیه فقط فایل رو به shellphp.gif تبدیل و تمام. حالا دیگه امکان execute کردن فایل موجود نیست مگر اینکه بتونند یه فایل htaccess. رو آپلود کنند که به فایل های gif اجازه execute شدن بده. در این صورت به سادگی می تونند هاست یا سرور شما رو مورد حمله قرار بدهند که البته شما نباید اجازه بدید فایل htaccess. آپلود بشه وگر نه خیلی کار های دیگه هم می شه انجام داد :)
بنا بر این تغییر نام فایل رو هنگام آپلود فراموش نکنید و اجازه ندید یک فایل از ۲ پسوند استفاده کنه. کافیه که “.” های ابتدایی رو scape کنید و فقط آخرین “.” رو برای پسوند نگه دارید.

کانفیگ hesk با swiftmailer

یکی از دوستانم واسه سیستم پشتیبانی یا تیکتینگ از hesk استفاده کرد. این نرم افزار خیلی ساده متاسفانه یه مشکل داره اونم اینکه برای ارسال ایمیل از خود تابع mail استفاده می کنه. برای همین من swiftmailer رو به این اسکریپت اضافه کردم و خوشبختانه کار هم می کنه. ایمیلی رو برای مدیران hesk فرستادم و امیدوارم توجه کنند و از یک کلاس mailer استفاده کنند.

در ابتدا من با استفاده از دستور زیر یه جستجویی کردم ببینم چند بار و توی چه فایل هایی از تابع میل استفاده کرده.

dan@dan-VPCF13WFX:~/public_html/hesk-test$ find  -exec grep -Hn ‘@mail’ {} \;
./reply_ticket.php:179:    @mail($email,$hesklang['new_reply_ticket'],$msg,$headers);
./submit_ticket.php:300:@mail($tmpvar['email'],$hesklang['ticket_received'],$msg,$headers);
./submit_ticket.php:334:    @mail($email,$hesklang['new_ticket_submitted'],$msg,$headers);
./index.php:980:@mail($email,$hesklang['tid_email_subject'],$msg,$headers);
./admin/mail.php:355:            @mail($pm_recipient['email'],$hesklang['m_pmnes'],$msg,$headers);
./admin/move_category.php:126:    @mail($email,$hesklang['ntmc'],$msg,$headers);
./admin/admin_reply_ticket.php:188:@mail($ticket['email'],$hesklang['new_reply_staff'],$msg,$headers);
./admin/admin_submit_ticket.php:295:    @mail($tmpvar['email'],$hesklang['ticket_received'],$msg,$headers);
./admin/admin_submit_ticket.php:318:        @mail($email,$hesklang['ticket_assigned_to_you'],$msg,$headers);
./admin/admin_submit_ticket.php:355:        @mail($email,$hesklang['new_ticket_submitted'],$msg,$headers);
./admin/assign_owner.php:145:        @mail($email,$hesklang['ticket_assigned_to_you'],$msg,$headers);

اگر به فایل های hesk نگاه کنید متوجه می شید که این سیستم ۲ فایل اصلی داره

hesk_settings.inc.php

common.inc.php

فایل اول کانفیگ های سیستم رو نگهداری می کنه و هر بار باز نویسی می شه . فایل دوم هم نگهدارنده فانکشن های اصلی سیستم هستند. پس من به فایل common.inc.php این کد ها رو اضافه می کنم.

function InitMailer(&$mailer = NULL){

global $hesk_settings;

if (!class_exists(‘Swift_Mailer’)) require_once $hesk_settings['server_path'].$hesk_settings['mailer_path'];

$transport = Swift_SmtpTransport::newInstance($hesk_settings['mailer_smtp_host'], $hesk_settings['mailer_smtp_port'], $hesk_settings['mailer_use_protocol']);

if ($hesk_settings['mailer_smtp_user'] != NULL && $hesk_settings['mailer_smtp_password'] != NULL){

$transport->setUsername($hesk_settings['mailer_smtp_user']);

$transport->setPassword($hesk_settings['mailer_smtp_password']);

}

$mailer = Swift_Mailer::newInstance($transport);

return $mailer;

} // END InitMailer()

function sendByMailer($to,$subject,$message,$additional_headers = false,$additional_parameters = false){

global $hesk_settings;

if ($hesk_settings['enable_mailer']){

if (!class_exists(‘Swift_Mailer’)) require_once $hesk_settings['mailer_path'];

$mailer = InitMailer();

$to = explode(‘,’, $to);

$message = Swift_Message::newInstance($subject)

->setFrom($hesk_settings['noreply_mail'])

->setTo($to)

->setBody($message)

;

$result = $mailer->send($message);

}else{

@mail($to,$subject,$message,$additional_headers,$additional_parameters );

}

}// END sendByMailer()

تابع اول InitMailer کارش اینه که SmtpTransport رو می سازه برای اتصال به SMTP و return می ده . تابع sendByMailer تابع مشابه mail هست که قراره با توابع mail در سیستم replace بشه. همونطور که می بینید این تابع اگر توی کانفیگ mailer فعال نباشه با استفاده از خود تابع mail ارسال ایمیل رو انجام می ده و در در غیر این صورت با اجرا کردن تابع InitMailer از swiftmailer استفاده می کنه.

خب قدم بعدی replace کردن تابع mail با sendByMailer هست. بالاتر گفتم که چطوری می شه فهمید توی چه فایل هایی از این فانکشن استفاده شده اما این دستور مربوط به ترمینال لینوکس هست حالا اگر از ویندوز استفاده می کنید می تونید با هرنرم افزاری که دم دستتون هست این کار رو انجام بدید.

خب حالا نوبت به اضافه کردن یه سری فیلد به قسمت setting سیستم هست.برای این کار یه سر به  فایل admin_settings.php می زنیم. این کد ها رو از خط ۷۲۸ اضافه می کنیم

 

 

<!– Mailer settings –>
<span>&raquo; <?php echo $hesklang['mailer']; ?></span>
<table width=”100%” border=”0″ cellspacing=”0″ cellpadding=”0″>
<tr>
<td width=”7″ height=”7″><img src=”../img/roundcornerslt.jpg” width=”7″ height=”7″ alt=”" /></td>
<td></td>
<td><img src=”../img/roundcornersrt.jpg” width=”7″ height=”7″ alt=”" /></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>

<table border=”0″>
<tr>
<td style=”text-align:right” width=”200″><?php echo $hesklang['enable_mailer']; ?>: [<a href="Javascript:void(0)" onclick="Javascript:hesk_window('../help_files/settings.html#32','400','500')"><b>?</b></a>]</td>
<td><?php
$on  = ($hesk_settings['enable_mailer'] == true ) ? ‘checked=”checked”‘ : ”;
$off = ($hesk_settings['enable_mailer'] == false) ? ‘checked=”checked”‘ : ”;
echo ‘
<label><input type=”radio” name=”s_enable_mailer” value=”0″ ‘.$off.’ /> ‘.$hesklang['no'].’</label> |

<label><input type=”radio” name=”s_enable_mailer” value=”1″ ‘.$on.’ /> ‘.$hesklang['yes'].’</label>’;
?></td>
</tr>
<tr>
<td style=”text-align:right” width=”200″><?php echo $hesklang['mailer_use_smtp']; ?>: [<a href="Javascript:void(0)" onclick="Javascript:hesk_window('../help_files/settings.html#34','400','500')"><b>?</b></a>]</td>
<td><?php
$on  = ($hesk_settings['mailer_use_smtp'] == true ) ? ‘checked=”checked”‘ : ”;
$off = ($hesk_settings['mailer_use_smtp'] == false) ? ‘checked=”checked”‘ : ”;
echo ‘
<label><input type=”radio” name=”s_mailer_use_smtp” value=”0″ ‘.$off.’ /> ‘.$hesklang['no'].’</label> |
<label><input type=”radio” name=”s_mailer_use_smtp” value=”1″ ‘.$on.’ /> ‘.$hesklang['yes'].’</label>’;
?></td>
</tr>
<tr>
<td style=”text-align:right” width=”200″><?php echo $hesklang['mailer_path']; ?>: [<a href="Javascript:void(0)" onclick="Javascript:hesk_window('../help_files/settings.html#33','400','500')"><b>?</b></a>]</td>
<td><input type=”text” name=”s_mailer_path” size=”30″ maxlength=”255″ value=”<?php echo $hesk_settings['mailer_path']; ?>” /></td>
</tr>

<tr>
<td style=”text-align:right” width=”200″><?php echo $hesklang['mailer_smtp_host']; ?>: [<a href="Javascript:void(0)" onclick="Javascript:hesk_window('../help_files/settings.html#35','400','500')"><b>?</b></a>]</td>
<td><input type=”text” name=”s_mailer_smtp_host” size=”30″ maxlength=”255″ value=”<?php echo $hesk_settings['mailer_smtp_host']; ?>” /></td>
</tr>
<tr>
<td style=”text-align:right” width=”200″><?php echo $hesklang['mailer_smtp_port']; ?>: [<a href="Javascript:void(0)" onclick="Javascript:hesk_window('../help_files/settings.html#36','400','500')"><b>?</b></a>]</td>
<td><input type=”text” name=”s_mailer_smtp_port” size=”30″ maxlength=”255″ value=”<?php echo $hesk_settings['mailer_smtp_port']; ?>” /></td>
</tr>
<td style=”text-align:right” width=”200″><?php echo $hesklang['mailer_use_protocol']; ?>: [<a href="Javascript:void(0)" onclick="Javascript:hesk_window('../help_files/settings.html#36','400','500')"><b>?</b></a>]</td>
<td><?php
$on  = ($hesk_settings['mailer_use_protocol'] == ‘ssl’) ? ‘checked=”checked”‘ : ”;
$off = ($hesk_settings['mailer_use_protocol'] == ”   ) ? ‘checked=”checked”‘ : ”;
echo ‘
<label><input type=”radio” name=”s_mailer_use_protocol” value=”0″ ‘.$off.’ /> ‘.$hesklang['no'].’</label> |
<label><input type=”radio” name=”s_mailer_use_protocol” value=”1″ ‘.$on.’ /> ‘.$hesklang['yes'].’</label>’;
?></td>
</tr>
<tr>
<td style=”text-align:right” width=”200″><?php echo $hesklang['mailer_smtp_user']; ?>: [<a href="Javascript:void(0)" onclick="Javascript:hesk_window('../help_files/settings.html#36','400','500')"><b>?</b></a>]</td>
<td><input type=”text” name=”s_mailer_smtp_user” size=”30″ maxlength=”255″ value=”<?php echo $hesk_settings['mailer_smtp_user']; ?>” /></td>
</tr>
<tr>
<td style=”text-align:right” width=”200″><?php echo $hesklang['mailer_smtp_password']; ?>: [<a href="Javascript:void(0)" onclick="Javascript:hesk_window('../help_files/settings.html#36','400','500')"><b>?</b></a>]</td>
<td><input type=”password” name=”s_mailer_smtp_password” size=”30″ maxlength=”255″ value=”<?php echo $hesk_settings['mailer_smtp_password']; ?>” /></td>
</tr>
</table>

</td>
<td>&nbsp;</td>
</tr>
<tr>
<td><img src=”../img/roundcornerslb.jpg” width=”7″ height=”7″ alt=”" /></td>
<td></td>
<td width=”7″ height=”7″><img src=”../img/roundcornersrb.jpg” width=”7″ height=”7″ alt=”" /></td>
</tr>
</table>

<br />

همونطور که متوجه شدید این فایل فقط سازنده فرم قسمت setting هست. پس فایل admin_settings_save.php در پوشه admin رو باز می کنیم. بعد از خط ۱۵۲ این کد ها رو اضافه می کنیم

/* Mailer settings  */
$set['enable_mailer'] = hesk_mailer_is_on($_POST['s_enable_mailer']);
$set['mailer_path']= hesk_input($_POST['s_mailer_path']);
$set['mailer_use_smtp']=hesk_mailer_is_on($_POST['s_mailer_use_smtp']);
$set['mailer_smtp_host']=hesk_input($_POST['s_mailer_smtp_host']);
$set['mailer_smtp_port']=hesk_isNumber($_POST['s_mailer_smtp_port']);
$set['mailer_use_protocol']= hesk_mailer_is_ssl($_POST['s_mailer_use_protocol']);
$set['mailer_smtp_user']= hesk_validateEmail($_POST['s_mailer_smtp_user']);
$set['mailer_smtp_password']= hesk_input($_POST['s_mailer_smtp_password']);

همونطور که می بینید برای validate کردن اطلاعات من ۲ تابع استفاده کردم که قبلا نبوده. hesk_mailer_is_ssl و hesk_mailer_is_on . البته می شد بدون این ۲ فانکشن هم کار رو انجام داد اما خب من خواستم یکم کد تمیز باشه :دی

خب این ۲ تابع رو هم به فایل common.inc.php که محل قرار گیری توابع هست اضافه می کنیم.

function hesk_mailer_is_on($in){
if ($in == 1) return ‘true’;
else return ‘false’;
} // END hesk_mailer_is_on()

function hesk_mailer_is_ssl($in){
if ($in == 1) return ‘ssl’;
else return ”;
} // END hesk_mailer_is_ssl()

حالا به فایل admin_settings_save.php بر می گردیم. این فایل بعد از validate کردن اطلاعات اون ها رو درون متغیر  settings_file_content$ می ریزه و توی فایل hesk_settings.inc.php چاپ می کنه. خب حالا نوبت اینه که ما هم اطلاعات خودمون رو به این فایل کانفیگ اضافه کنیم. بعد از خط ۲۷۳ این کد ها رو اضافه می کنیم

/* Mailer Setup */
$hesk_settings[\'enable_mailer\']=’ . $set['enable_mailer'] . ‘;
$hesk_settings[\'mailer_path\']= \” . $set['mailer_path'] . ‘\’;
$hesk_settings[\'mailer_use_smtp\']=’ . $set['mailer_use_smtp'] . ‘;
$hesk_settings[\'mailer_smtp_host\']=\” . $set['mailer_smtp_host'] . ‘\’;
$hesk_settings[\'mailer_smtp_port\']=\” . $set['mailer_smtp_port'] . ‘\’;
$hesk_settings[\'mailer_use_protocol\']= \” . $set['mailer_use_protocol'] . ‘\’;
$hesk_settings[\'mailer_smtp_user\']= \” . $set['mailer_smtp_user'] . ‘\’;
$hesk_settings[\'mailer_smtp_password\']= \” . $set['mailer_smtp_password'] . ‘\’;

خب بعد از اینکه این کار هارو انجام دادید به قسمت settings در محیط مدیریت برید. یه بلاک اضافه شده که اون mailer هست. حالا کافیه اطالعات لازم رو بدید .. فعال یا غیر فعال کنید. فقط توجه داشته باشید که مسیر Mailer  Path باید از پوشه inc داده بشه. به عنوان مثال در تصویر پایین همونطور که می بینیدMailer Path مساوی هست با Swift-4.1.1/lib/swift_required.php. یعنی swiftmailer در پوشه inc وجود داره.

خب یه مرحله دیگه باقی می مونه اونم اینکه کمرتو رو صاف کنید اینقدر کج و کوله نشنید پشت کامپیتور :دی

موفق باشید.

شروع تازه

سلام

چند ماهی هست که این وبلاگ رو بالا آوردم اما مطلب زیادی نتونستم بنویسم.

متاسفانه از اواخر آذر ماه ۸۹ موج بزرگی از بدشانسی ها و مشکلات خانوادگی و … سراغ من اومدن. از اون تاریخ تا به امروز داشتم با این مشکلات که روز به روز بیشتر می شدن سر و کله می زدم. تقریبا امیدم رو از دست داده بودم. کاملا وا داده بودم. مثل شخصیت کارتونی گرگ رود رانر شده بودم که وسط یه جنگ ایستاده و یک سطل ماست دستشه و از تمام جهت بمب بارون موشکی داره می شه و تمام هم غمش اینه که این سطل که اسمش خانوادست نیوفته و همه چیز از بین نره. خوشبختانه همه چیز به حالت اول برگشت. همه چیز درست شد و من برگشتم سر کارم. اما خب لطمه بزرگی به زندگیم خورد و اونم از بین رافتن کامل اعتبارم بین دوستانم بود. همینطور از دست دادن چند تا دوست خیلی برام سنگین بود هرچند که می دونم به شدت از بدقولی های من ناراحت هستند اما خیلی دوست داشتم که یه طوری بتونم جبران کنم. ولی خب فکر نمی کنم که دیگه بشه.

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

یه چیز خیلی مهم یادگرفتم. اونم این بود که هیچ وقت هیچ چیزی توی زندگی ۱۰۰% نیست. همه چیزای خوب می تونن توی یه لحظه تبدیل به بدترین چیزایی بشن که تاحالا دیدید. مثل ریختن یه لیوان آب. که تا وقتی آب درونش نریخته محکم و مطمئن توی لیوان قرار داره. اما وقتی که با یه اشاره می ریزه دیگه اثری از اون یکپارچگی و استقامت نیست.

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

 

امید وارم هیچ موقع همچین اتفاقی توی زندگی هیچ کدوم یک از آدم ها نیوفته.

موفق و پیروز باشید.

فریم ورک چیست و چگونه فریم ورک مناسب را انتخاب کنیم ؟

خیلی وقته که چیزی ننوشتم .. بیشتر بخاطر درگیری و فشار زیاد کاری بود. به هر حال .. می رم سر اصل مطلب

فریم ورک چیست ؟

در نگاه اول فریم ورک به هر کتابخانه ای گفته می شود که نوشته شده باشد. اما فریم ورک چیزی بیش از یک کتابخانه است. به عنوان مثال یک شرکت سازنده خودرو در نظر بگیرید. آیا این شرکت ها هر بار برای ساختن خودرو جدید تمام نقشه ها را از از اول طراحی می کنند ؟ مطمئنا جواب منفی هست. فریم ورک ها در برنامه نویسی چنین معنی دارند. اصولا فریم ورک ها بر اساس ساختار برنامه نویسی شی گرایی تحت عنوان Model , View , Controller به اختصار MVC ساخته می شوند. اما نمی توان گفت کتابخانه هایی که بر اساس شی گرایی ساخته نشده اند فریم ورک نیستند. عموما پرتال ها و سیستم های مدیریت محتوا مثل جوملا ، مامبو ، نیوک ، وردپرس و … در نهایت تبدیل به یک کتابخانه یا فریم ورک می شوند.

چرا باید از فریم ورک استفاده کنیم ؟

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

چه زمانی باید شروع به نوشتن فریم ورک کرد ؟

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

کدام فریم  ورک را انتخاب کنیم ؟

من با فریم ورک های Codeigniter , Cakephp , ZendFramework , Symfony آشنایی دارم. عموما برنامه نویس ها از CodeIgniter و Cakephp استفاده می کنند در ایران. به نظر من اگر شما یک پروژه خیلی ساده و کوچک دارید Codeigniter انتخاب خوبی خواهد. چرا که از سرعت بالا و سادگی بالایی برخوردار است. Cakephp فریم ورک قوی با ساختار مناسب برای کار های حرفه ای می تونه باشه . اما خب من ضعف هایی در Cakephp دیدم ولی یکی از بهترین قسمت های این فریم ورک لایه Model و ORM هست و در این مورد می توان گفت بسیار خوب عمل کرده اند طوری که کار با دیتابیس برای  برنامه نویس بسیار راحت شده. ZendFramework یکی از بهترین فریم ورک هاست . بخاطر اینکه مثل یک کتابخانه معمولی در کنار پروژه شما قرار می گیرد و شما قادر هستید که از تمامی قسمت ها هر طور که مایل هستید استفاده کنید و یا تغییرات لازم را بدهید. دقیقا مانند یک کتابخانه قوی و مستحکم. در نهایت به نظر بنده symfony قدرت مطلق فقط و فقط برای پروژه های حرفه ای و عظیم ساخته شده . البته این گفته تا نسخه ۱٫۴ درسته و در نسخه ۲ و تغییراتی که داده شده سرعت اینقدر بالا هست که شما در پروژه های کوچک هم می توانید به سادگی از این فریم ورک استفاده کنید. نهایتا انتخاب فریم ورک باید خیلی دقیق باشه . معمولا برنامه نویس ها نمی تونن با چندین فریم ورک هم زمان کار کنند. پس سعی کنید فریم ورکی را انتخاب کنید که بتونید همیشه استفاده کنید و کمتر دچار مشکل بشوید.

آیا فریم ورک سرعت اسکریپت را پایین می آورد ؟

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

 

symfony-project.ir

مدت زیادی بود که من روی یه سایت برای پشتیبانی پارسی از سیمفونی فکر می کردم. متاسفانه تا امروز هم هیچ کس دست به همچین کاری نزده. خیلی وقت بود که من به دنبال ۲ دامنه symfony-project.ir و symfony.ir بودم . این دامنه ها ثبت بود و من کم کم داشتم به دامنه های دیگه یه جورایی ربط داشتن به این موضوع فکر می کردم. تا اینکه یه روز وقتی دامنه symfony-project.ir رو whois کردم و دیدم که باز شده :D از خوشحالی یه سر وصدایی راه انداختم تو شرکت که در نوع خودش خیلی آبرو ریزی بود :D به هر حال این دامنه رو ثبت کردم اما کار زیاد در شرکت مانع از این که من بتونم این پروژه رو جلو ببرم می شد.

خود من به هیچ عنوان با انجمن موافق نیستم  و با دوستام در مورد انجمن با دوستام مشورت کردم . نظر های مختلفی بود اما هیچ کدوم از نظر های مثبت دلیل قانع کننده ای برای من نداشت که یه انجمن نصب کنم. چیزی که مد نظرم بوده و هست اینه که یه wiki در کنار یه سیستم پرسش و پاسخ باشه. به نظر من اینطوری بهتر هست تا اینکه یه انجمن رو با هزار یک بدبختی و بی مدیری بیارم بالا :)

با همین سیستم ورد پرس هم من رابطه خوبی ندارم و فقط چون وقت برای نوشتن یه سیستم وبلاگ رو نداشتم نصبش کردم. این پروژه یعنی وب سایت رسمی پشتیبانی از سیمفونی به زبان پارسی در بد ترین شرایط و اگر شده با wikimedia یا doku یا هرچیز دیگه بالا میاد. من خودم مقداری از کتاب آموزشی سیمفونی نسخه ۱٫۴ رو ترجمه کردم. امیدوارم دوستان دیگه هم کمک کنن تا بشه یه داکیومنت خوب جمع آوری کرد. خودم خیلی دوست دارم که بتونم یه سی ام اس رو بنویسم که حالت های مورد نیاز رو بصورت دستی ایجاد کنم و دیگه از wikimedia استفاده نکنم اما خب .. اگر وقتم جواب نده مجبورم از سی ام اس های آزاد مربوط استفاده کنم.

۱۰ قدم تا برنامه نویسی حرفه ای در PHP

دیگه چند سالی هست که برنامه نویس های حرفه ای زیاد شدن اما دیگه مثل قدیم نیست که به سایرین یاد بدن که اون ها هم چطوری حرفه ای بشن .. منم تصمیم گرفتم تا مقاله ای در این رابطه بنویسم تا راز موفقیت این برنامه نویس های حرفه ای برملا بشه و همه یاد بگیرند که چطور یک برنامه نویس حرفه ای بشوند.

قدم اول: نصب php

در ابتدا به انجمن هایی که با ر علمی خیلی بالایی دارند مثل مجید آنلاین یا برنامه نویس برید و ثبت نام کنید. در روز های اولیه سعی کنید که یه جوری به یه ورشی php نصب کنید و بتونید تابع phpinfo اجرا کنید و خروجی بگیرید. ( اصلا مهم نیست که تابع یا فانکشن یعنی چی .. اصلا فکر خودتون رو مشغول نکنید .. در ادامه توضیح می دم که این چیزا چقدر بی خودی وقت شما رو می گیرند) توجه داشته باشید که به هیچ عنوان نیاز نیست که خودتون php,apache,mysql رو نصب کنید. از این نرم افزار هایی که خودشون نصب می کنند استفاده کنید. مثل easy php و از این قبیل

قدم دوم: شناخت کامل php

حالا شما می بایست یه سری اطلاعات در مورد php داشته باشید . نا سلامتی برنامه نویس php هستید و باید بتونید ۴ کلام در مورد php صحبت کنید . البته این مورد هم زیاد مهم نیست و اگر فقط بتونید php تلفظ کنید کفایت می کنه. ببینید php یک زبان برنامه نویسی open source هست. یعنی شما هر کدی که هرجا دیدید رو می تونید ویرایش کنید. تغییرات بدید. نسخه جدید با اسم خودتون بدید بیرون. قسمت powered by رو حتما باید حذف کنید. این یکی از مهم ترین عواملی هست که به شما کمک می کنه یک برنامه نویس php حرفه ای بشید.

قدم سوم: مشهور شدن

خب حتما براتون این سوال پیش میاد که چطوری مشهور بشیم؟ جواب این سوال زیاد سخت نیست. در انجمن هایی که قبلا ذکر کردم و یا مثل اون ها مراجعه کنید. سعی کنید به سوالات دیگران هر طور که شده پاسخ بدید. اصلا نگران نباشید کافیه سوال های دیگران رو در انجمن های دیگه بپرسید و جواب سوالشون رو بطور کامل و با کلی پیاز داغ بگید. توجه کنید که از یک نام کاربری استفاده نکنید چون احتمال داره لو برید و نتونید پله های موفقیت رو بالا برید. حتی می تونید سوالات رو در اینترنت جستجو کنید و جوابشون رو بدید. این کار رو اینقدر ادامه بدید تا جزو کاربران قدیمی و کهنه کار بشید. هر موقع دیدید که اوضاع انجمن یکم بی ریخت شد سریعا تاپیک بزنید این چه وضع مدیریته .. از اوضاع بی ریخت انجمن کمال استفاده رو کنید و سعی کنید مدیر قسمت php بشید. بعد از این کار شما راحت خواهد شد. هر جا که هرچی بنویسید چه درست و چه غلط ۲۰ نفر حداقل کلید تشکر رو می زنن و کم کم تعداد تشکر هایی که از شما می شه چندید برابر تاپیک هایی هست که ایجاد کردید.

قدم چهارم : شروع برنامه نویسی

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

قدم پنجم : شروع یک پروژه

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

قدم ششم : بکار بردن کلمات کلیدی در صحبت ها

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

قدم هفتم : استفاده از کد های آماده

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

قدم هشتم : تصفیه حساب

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

قدم نهم : سرخورده کردن تازه کار ها

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

قدم دهم : استایل پیشکسوتی

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

تبریک می گم .. حالا شما یک برنامه نویس حرفه ای php هستید. دنیایه متن باز منتظر موفقیت های شماست.

به امید روزی که هیچ کدام از ماها برنامه نویس php حرفه ای نباشیم

۵ ماه انتظار برای سیمفونی ۲

امروز یه سری به وبسایت سیمفونی زدم و مثل همیشه یه سری هم به وب سایت سیمفونی ۲ زدم که متوجه خبر جالبی شدم. گروه توسعه سیمفونی ۲ تاریخ انتشار اولین نسخه پایدار رو March 2011 و با استفاده از PHP 5.3.2 تعیین کردن. تقریبا ۵ ماه دیگه می تونیم اولین نسخه پایدار سیمفونی ۲ رو داشته باشیم. خود من که خیلی وقته روز شماری می کنم برای این نسخه. امکاناتی که در این نسخه بیان شده باعث می شه که دیگه هیچ فریم ورکی نتونه به پایداری و قدرت سیمفونی برسه. این نسخه از سیمفونی که به جرات می تونم بگم یکی از بهترین فریم ورک های php ساخت بشر می تونه باشه از سرعت بسیار بالایی برخور دار هست و امکانات زیادی برای راحتی کار برنامه نویس در نظر گرفته که در نوع خود بی نظیر هست.

یکی از نکات جالب در این نسخه این هست که سیمفونی ۲ از سه فرمت YAML , XML , PHP برای فایل های کانفیگ استفاده کرده. یعنی شما با هر کدوم از این فرمت ها که راحت هستید می تونید کار کنید. به راحتی ..

و باز هم مثل همیشه یه داکیومنت کامل همیشه همراه شماست.

شروع کار با LMDE

بعد از درگیری های نصب arch برگشتم به سمت debian . چند روزی بود که داشتم کارم رو با دبیان استیبل ادامه می دادم تا اینکه یکی از دوستام از من سوالی در مورد بازیابی اطلاعات پرسید. طبق معمول اولین سوالی که پرسیدم این بود که سیستم عامل چیه و دوستم جواب داد mint ! برای اولین بار بود که این اسم رو می شنیدم. طبق معمول شروع به جستوجو کردم در مورد این توزیع. چند تا از وبلاگ های دوستام رو خوندم. به نظر توزیع مناسبی بود و جای کار داشت. با یکی از دیگه از دوستام دراین مورد مشورت کردم و اونجا بود که از پایداری نسبی ( نظر شخصی من اینه که هیچ توزیعی مثل دبیان استیبل پایدار نیست‌ ) این توزیع تصمیم به نصب گرفتم. دقیقا یک ساعت پیش این توزیع رو به طور کامل نسب کردم. چند تا مورد خیلی جالب در این توضیع دیدم. اول اینکه خیلی سریع نسب شد و فکر کنم نسب کردنش برای هر کسی که با لینوکس کار کرده باشه باید ساده باشه. تغییراتی در میز کار gnome دیدم که خیلی خوب بود. تقریبا ظاهری شبیه به اوبونتو داره اما واقعا منو خیلی زیبایی داره. همینطور Network manager خوبی داشت و من درگیری های قبلی برای برقراری ارتباط با شبکه رو ندارم. یکی از بزرگترین خصوصیات های این توزیع debian-base بودنش هست که واقعا من احساس امنیت خاطر بیشتری دارم و بیشتر می تونم روی این توزیع حساب باز کنم.

بهتون پیشنهاد می کنم حتما یک بار از این توضیع استفاده کنید.

رفع خطایه Could not reliably determine the server’s

امروز موقع restart کردن apache با خطای زیر مواجه شدم

Could not reliably determine the server’s fully qualified domain name, using 127.0.0.1 for ServerName

برای رفع این خطا می بایست فایل زیر را در یک ادیتور مناسب باز کنید

/etc/apache2/apache2.conf

سپس خط زیر را به ابتدا یا انتهای فایل اضافه کنید

ServerName nameofserver

توجه داشته باشید که nameofserver نام سرور لوکال شماست . در اکثریت موارد localhost مورد استفاده است.

آموزش نصب LAMP روی Debian

LAMP, Linux Apache Mysql PHP

ابتدا توسط دستور زیر را در ترمینال وارد کنید و سپس کلمه عبور کاربر root را وارد کنید

su

حالا توسط دستور زیر پکیج های موجود در سیستم را آپدیت می کنیم

aptitude update && aptitude upgrade

mysql

برای نصب mysql کد زیر را در ترمینال وارد کنید

aptitude install mysql-server mysql-client

اگر در زمان نصب کلمه عبور کاربر root از شما پرسیده نشد توسط دستور زیر کلمه عبور کاربر ریشه یا همان root را وارد کنید

/usr/bin/mysqladmin -u root password ‘enter-your-good-new-password-here’

کاربر root کاربر پیش فرض mysql برای بر قراری ارتباط با دیتابیس می باشد. شما می توانید توسط phpmyadmin یا دستورات mysql کاربران دیگری با سطح های دسترسی مختلفی بسازید.

apache2

برای نصب apache web server دستور زیر را در تریمنال وارد کنید

aptitude install apache2 apache2-doc

PHP5

برای نصب php5 دستور زیر را در ترمینال وارد کنید

aptitude install php5 php5-mysql libapache2-mod-php5

Perl

برای نصب perl دستور زیر را در ترمینال وارد کنید

aptitude install perl libapache2-mod-perl2

Python

برای نصب python دستور زیر را در ترمینال وارد کنید

aptitude install python libapache2-mod-python

تنظیمات مربوط به apache

در صورت نیاز می توانید apache2.conf را ویرایش کنید. این فایل را می توانید در مسیر زیر بیابید

/etc/apache2/apache2.conf

phpmyadmin

برای نصب phpmyadmin دستور زیر را در ترمینال وارد کنید

بعد از نصب phpmyadmin می باید فایل تنظیمات phpmyadmin را در تنظیمات apache2 اینکلود کنید. برای این منظور ابتدا فایل زیر را در یک ویرایش گر باز کنید:

/etc/apache2/apache2.conf

سپس خط زیر را در انتهای فایل بالا اضافه کنید:

Include /etc/phpmyadmin/apache.conf

برای اعمال تغییرات می بایست آپاچی را restart کنیم. دستور زیر را در ترمینال وارد کنید

/etc/init.d/apache2 restart

php.ini

برای تغییر تنظیمات مربوط به php.ini می توانید فایل مذکور را در مسیر زیر بیابید:

/etc/php5/apache2/php.ini

برای برقراری php و mysql می بایست extension مربوط به mysql را در فایل php.ini اضافه کنید. خط زیر را در php.ini اضافه کنید:

my.cnf

در صورت نیاز می توانید فایل مربوط به تنظیمات mysql را در مسیر زیر بیابید:

/etc/mysql/my.cnf

منبع :‌ http://wiki.debian.org/LaMp