گیک فارسی

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

فهرست فایل‌هایی که از یک تاریخ خاص توی Git Repo پروژه تغییر کرده‌اند

نویسنده:
۲۶ تیر ۹۶

اگه برنامه نویس هستین و تا حالا از هیچ Source Control ی استفاده نکردین و همچنان روی کاغذ یا توی فایل‌ها ، وضعیت تغییر فایل‌های پروژه را یادداشت میکنین توصیه میکنم هر چه زودتر برای یادگیری Git که به نظر من بهترین Source Control هست وقت بگذارین و توی چند روز براحتی یاد بگیرینش.

نمیخوام در مورد همه امکانات Git براتون توضیح بدم اما فکر کنین یک هفته هست روی فایل‌های پروژه دارین کار میکنید و حالا میخواین منتقل کنین فایل‌ها را به FTP ، میتونین کل فایل‌ها را Zip کنین و هر بار با مشکلات بروزرسانی کل فایل‌های سایت طرف باشین یا تغییرات را جایی یادداشت کنین و با مشکلاتی مثل فراموش کردن نوشتن تغییر در فایلی روبرو بشین. حالا اگه چند نفری روی این پروژه کار کنین که امکان رخ دادن این مشکلات چندین برابر میشه.

اگه از Git استفاده کنین و تاریخ قبلی بروزرسانی فایل‌های آنلاین هفت روز پیش باشه:(یعنی از ۶ روز پیش را میخوایم)

git log --pretty=format: --name-only --since="6 days ago" | sort | uniq

نکته: برای since– میتونین هر عبارت معادل زمانی معتبری را بگذارین و حتی ساعت و دقیقه هم بدین.

نکته: دستورات sort و uniq و امکان pipe کردن هم فقط توی لینوکس (اگه روی ویندوز محیط Bash نداشته باشین) امکان پذیره و این خودش نشون میده بهتره زودتر مهاجرت کنین به لینوکس.

خطای عدم دسترسی به کاربر root در نسخه های جدید mariadb

نویسنده:
۱۰ خرداد ۹۶

اگه هنوز به جای استفاده از MariaDB دارین از MySQL استفاده میکنید باید بگم خیلی در اشتباه هستین و بهتره خیلی زود به فکر مهاجرت باشین که البته این مهاجرت اصلاً سخت نیست و سازگاری خوبی بین MySQL و MariaDB وجود داره.

اخیراً بعد از نصب MariaDB روی یک سرور توی مراحل نصب پرسشی مبنی بر انتخاب گذرواژه برای root نکرد و بعد از نصب هم وقتی میخواستم با دستور mysql -u root -p ارتباط با سرور برقرار کنم خطای عدم دسترسی کاربر root میداد.

اول فکر کردم شاید گذرواژه ست نشده و با روش‌ skip-grant-tables– وارد شدم و گذرواژه را توی جدول user پایگاه mysql ست کردم اما بعد از اتمام کار متوجه شدم خیر باز هم اجازه برقراری ارتباط نمیده. خیلی شانسی متوجه شدم داره بی دردسر اجازه میده با sudo و بدون گذرواژه ارتباط برقرار کنم که با کمی جستجو متوجه شدم MariaDB داره به صورت پیش‌فرض برای کاربر root از unix_socket plugin استفاده میکنه و این plugin اجازه دسترسی از طریق socket را به کاربر متناظر سیستم میده.

خوب ایده جالبی بود چون کلاً توی محیط های production بهتره ارتباط با root برقرار نباشه و این پلاگین خیلی هم در تأمین امنیت کاربردی هست ولی اگه ارتباط از طریق root خیلی مهمه میتونید با ساختن یک کاربر دیگه مثلاً admin و دادن دسترسی های root بهش از برنامه‌های دیگه ارتباط بزنید. دوستانی هم که ترجیح میدن مثل گذشته کاربر root گذرواژه بگیره کافیه Query زیر را بزنن :

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your password'

Track کردن پوشه های خالی در یک ساختار درختی در Git

نویسنده:
۲ فروردین ۹۶

Git از جمله موضوعاتی هست که من باید خیلی دربار‌ه‌ش بنویسم اما خوب واقعاً نشده اما صد در صد در موردش خواهم نوشت. در مورد این نوشته خاص باید توضیح بدم که اصولاً Git پوشه ها را Track نمیکنه و فایل‌ها را Track میکنه. در نتیجه اگه یک پوشه خالی باشه اصولاً Git بی خیالش میشه و شما هم نمیتونین توی Stage بیارینش.

راه حلی که خیلی مورد استفاده قرار میگیره این هست که یک فایل خالی با عنوان keep. یا gitkeep. توی اون پوشه مورد نظر ایجاد میکنند تا Git اون ها را توی پروسه Track و Stage بیاره. اگه هم پوشه ای باشه که خودش ignore شده باشه توی gitignore. از طریق کد زیر درخواست عدم نادیده گرفتن فایل gitkeep. را میدیم :

!.gitkeep

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

folder
 sub1
   sub1-1
   sub1-2
 sub2

توجه: توی همه پوشه ها هم فایل gitkeep. داریم.

توی gitignore. داریم :

folder/*

اما مشکل اینجاست که Git تا نسخه‌ای که در زمان نوشتن این مطلب منتشر شده فقط مجوز Track کردن همون سطح اول پوشه ها را میده (یعنی folder) و باقی را نادیده میگیره (یعنی sub1 و sub2 و همه فرزندانش) و به اصطلاح Recursive عمل نمیکنه.

من راه حلی از طریق Git پیدا نکردم جز اینکه یکی یکی پوشه ها را ignore کنی یا با git-add -f با اعمال قدرت از Git بخوای که فایل‌های gitkeep. را Track کنه! فقط توی این حالت دوم بعد از ساخت فایل‌های gitkeep. دستور زیر کمک میکنه که دستی اون ها را Add نکنیم (دستور را توی root پروژه میزنیم) :

find . -name '.gitkeep' | xargs git add -f

پشتیبان گیری (Backup) از پایگاه داده MySQL و MariaDB

نویسنده:
۲۷ دی ۹۵

برنامه نویس هایی که با پشتوانه ویندوزی و استفاده از MSSQL به لینوکس و PHP و پایگاه داده محبوب این محیط یعنی MySQL مهاجرت میکنن یا میخوان توی پروژه ای ازش استفاده کنند در زمان انتقال پروژه به سیستم دیگه ، روی وب یا کلاً زمان پشتیبان گیری سعی میکنند مثل MSSQL که یک فایل Database و Log داره و با کپی گرفتن ازش همه چیز حله با MySQL برخورد کنند و با کپی گرفتن از پوشه MySQL و جداول مربوطه خودشون را خلاص میکنند.

اما وقتی زمان بارگزاری مجدد و Restore کردن پروژه میشه تازه متوجه میشن یا اطلاعاتی را کپی نگرفتند یا MySQL فایل‌های پشتیبان را تشخیص نمیده و حواسشون به اینکه MyISAM بوده یا InnoDB نداشتند و حسابی گیر میوفتن.

راستش من از اول وقتی متوجه شدم MySQL ابزاری به نام MySQLDump داره کلاً درگیر کپی کردن فایل‌ها نشدم. خیلی راحت میشه با دستور زیر جداول و کل روال ها و توابع ایجاد شده را تر و تمیز پشتیبان گرفت :

mysqldump -e -R -h [Remote host or 127.0.0.1 or localhost] -u [Your username] --password=[Your password] [Database name] > [Filename to save backup]

توی ویندوز اسمش mysqldump.exe میشه البته. (امیدوارم تا حالا مهاجرت کرده باشین به لینوکس!)

برای بارگزاری مجدد یا Restore هم از دستورخود mysql استفاده کنید (mysql.exe ویندوز):

mysql -h [Remote host or 127.0.0.1 or localhost] -u [Your username] --password=[Your password] --default-character-set=utf8 --database=[Database name] < [Filename to load backup data]

این روش مزایای زیادی داره از جمله اینکه میتونید از پایگاه داده‌های Remote هم پشتیبان بگیرین و Restore کنین یا با یک Cronjob به صورت هفتگی از پایگاه های داده محلی یا Remote (روی وب) پشتیبان بگیرین و …

وقتی برنامه نود خودش را درگیر موضوعی میکنه که اشراف کامل روش نداره !!!

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

دیشب عادل فردوسی پور توی برنامه نود سعی کرد نرم‌افزار بلیت فروشی مسابقات لیگ برتر را به چالش بکشه و مشکلات اون را نشون بده که به نظر من بحثش را از دو جنبه میشه بررسی کرد. یکی اینکه مشکلات فنی که اشاره کرد واقعا موضوعات حاد و باگ بودن ؟ یا مقایسه با بلیت فروشی سایت بارسلونا از نظر فنی و تکنیکی درست بود ؟! دوم اینکه اصلاً چرا فلان پیمان کار عهده دار انجام چنین موضوعی شده ؟!

در مورد بحث فنی راستش من اصلاً استدلال های نود را قبول ندارم و به نظرم پیمانکار مجری نرم افزار خیلی قابل انتقاد آنچنانی نیست و مشکلات اشاره شده هم باگ نیستند. خبرنگار نود اومده توی سایت یک صندلی را گرفته و به سایت بانک رفته ولی پرداخت و تکمیل خرید را انجام نداده و برگشته توی سایت خرید بلیت و شاکی از اینکه چرا اون صندلی که انتخاب کرده بوده قابل خرید برای دیگران نیست ، غافل از اینکه نمیشه وقتی یک صندلی رفت توی سبد خرید اما پرداخت تکمیل نشده اون را برای انتخاب افراد دیگه باز گذاشت ، چون ممکنه ۱۰۰ نفر آنلاین باشن و چون زمان میبره تا فرد بره توی سایت بانک و اطلاعاتش را بزنه و خرید تکمیل بشه و برگرده. در این حین اگه صندلی رزرو نشه افراد دیگه ممکنه سریعتر از اونی که اول از همه اقدام کرده خرید را تکمیل کنند و صندلی از کف نفر اول بره. پس برای مدت زمان معینی نیاز هست که صندلی رزرو بشه و اگه خرید تا N دقیقه بعد انجام نشد کل خرید کنسل بشه و صندلی آزاد بشه که البته مسئول اون شرکت به صورت دست و پا شکسته اشاره کرد به همین موردی که گفتم اما فردوسی پور دیگه !

تنها ایرادی که بهشون وارد هست اینه که به جای سیاه کردن صندلی به عنوان ناموجود باید صندلی های رزرو را به رنگ دیگه ای نشون بدن و مرتب صفحه را توی بازه زمانی معینی Refresh کنند.

اما اشکال دومی که خبرنگار نود میگیره از اون چرت تره !!! گیر داده چرا با کد ملی هر شخصی میشه توی سیستم ثبت نام کرد ، افراد غریبه و حتی خانم‌ها؟! از اون عجیب تر هم مسئول اون شرکت هست که میگه حرف شما درسته و باید ثبت احوال با ما همکاری کنه و مثلاً پایگاه اطلاعاتی کل مردم مملکت را در اختیار ما بگذاره !!! در صورتی که قطعاً قصد از گرفتن این کد ملی این نبوده که شخص برای خرید بلیت تعیین هویت بشه !!! مگه برای ورود به ورزشگاه یا سینِما و کنسرت میشه دم در به همه گفت کارت ملیتون را بردارین بیارین ؟! خلاصه اینکه با گرفتن این کد ملی به هر دلیلی که بوده نمیشه ایرادی به سیستم وارد کرد.

تناظر کد ملی با بلیت وقتی ایراد میشه که نرم‌افزار اجازه نده کسی با یک کد ملی بیش از یک یا چند تا بلیت بگیره چون ممکنه کسی کد ملی مثل من را بدونه و بره حداکثر بلیت ممکن را بگیره و من نتونم با کد ملی خودم دیگه بلیت تهیه کنم. نه اینکه استدلالت این باشه که چرا میشه با کد ملی خانم هم بلیت گرفت! بعدش جناب فردوسی پور سایت باشگاه بارسلونا را نشون میدن و میگن با هر IP میشه ۶ تا بلیت خرید و شما هم بهتر بود همون IP را معیار قرار میدادین. ایشون توجه نمیکنن که IP هم مشکلات خودش را داره و مثلاً توی خود صدا و سیما اگه ۳۰ نفر بخوان از اینترنت اونجا اقدام کنند برای خرید بلیت از همین بارسلونا ، حداکثر همون ۶ تا بلیت را میتونن بخرند. در صورتی که افراد کاملاً متفاوتی هستند که دارند از یک IP استفاده میکنند.

موضوع بعدی که در مورد اشاره به بارسلونا جالب بود سخیف شمردن پروسه خرید بلیت پیمان کار ایرانی در مقابل بارسلونا بود که به نظر من ، هم شماتیک سایت پیمان کار ایرانی بهتر بود هم پروسه را Ajax ی پیاده‌سازی کرده بودند که خیلی مدرن تر از Page To Page باشگاه بارسلونا بود و کلاً نیشخند جناب فردوسی پور نشون از عدم آگاهی ایشون از Web و توهین به متخصصین وطنی داره.

اما بحث بعدی این بود که چرا اون شرکت به عنوان پیمانکار انتخاب شده و مناقصه صورت نگرفته !؟ این مورد هیچ ربطی به پیمان کار نداره و اگه سازمان لیگ تحت نفوذ هر شخصی (حتی مسئولین همین پیمانکار) بدون مناقصه چنین واگذاری را انجام داده باشه باید ازش سؤال بشه نه پیمانکار که حالا جناب فردوسی علاقه‌مند هم هستند بدونن دریافتیشون از خرید هر بلیت هم چقدره !!!! من احساس کردم جناب فردوسی پور توی ایران زندگی نمیکنند و نمیدونن توی ایران چطوری کار ها به پیمان کار ها واگذار میشه که حالا باید قشر IT مملکت پاسخگوی این وضعیت باشه‌!؟

کمی بحث طولانی شد اما واقعاً از برنامه نود با این سابقه انتظار نمیره بدون مشاوره با یکی از هم صنفی های این پیمانکار چنین نقد غیر کارشناسانه ای داشته باشه !!!

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

نویسنده:
۱۶ شهریور ۹۵

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

مشکل نمایش متون فارسی به صورت علامت سوال

از اونجا که غالباً هر کسی در بخشی از پروسه انجام کار مشکل داره من به ترتیب مراحل اطمینان از درستی انجام کار را در چند شماره توضیح میدم :

۱ – زمانی که پایگاه داده را روی سیستم خودتون نصب میکنید اطمینان حاصل کنید که در مراحل نصب ، پشتیبانی از utf8 را در تنظیمات mysql انجام میدین. روی هاست ها میشه ۹۹ درصد مطمئن بود که از utf8 روی mysql پشتیبانی میشه.

۲ – زمانی که جدول را ایجاد میکنید بهتره برای جلوگیری از مشکلات آتی و فارغ از اینکه Charset پیش‌فرض و Colltation پیش‌فرض در زمان نصب MySQL چی بوده خودتون جداول را با Charset از نوع utf8 و Collation از نوع utf8_persian_ci ایجاد کنید.

توجه: اگه این دو مورد خیلی براتون ملموس نیست اهمیتی نداره ! اگه توی phpmyadmin یا هر برنامه مدیریت پایگاه داده‌ای که استفاده میکنید میتونید فارسی بنویسین و ذخیره کنین و نمایش بگیرین پس کلاً با utf8 مشکل ندارین مگه جاهای خاص که ربطی به موضوع این پست نداره و اگه مشکل دارین با پشتیبانی شرکت میزبان وب خودتون تماس بگیرین.

۳ – حتماً اطمینان حاصل کنید که charset صفحه html را توی تگ meta برابر با utf8 قرار بدین :
در html4 و xhtml

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

در html5

<meta charset="UTF-8">

۴ – اگه از کتابخونه mysql توی php استفاده میکنید حتماً بعد از mysql_connect (دقیقاً بعدش نه اینکه بعد از select گرفتن این کار را انجام بدین !!!) mysql_set_charset را اجرا کنین :

$link = mysql_connect("server_ip_address","mysql_user_name","mysql_pass",true);
mysql_set_charset('utf8',$link);

توجه: ممکنه خیلی جاها ببینید گفته باشن این دو query را بعد از connect اجرا کنین :

mysql_query("SET NAMES 'utf8'",$link);
mysql_query("SET character_set_connection = 'utf8'",$link);

اما تابع mysql_set_charset بهتر و بهینه تره چون باعث میشه زمان استفاده از تابع mysql_real_escape_string که برای جلوگیری از حملات SQL Injection خیلی مهم هست کاراکتر های یونیکد به درستی escape بشن که در حالت پیشنهادی دوم این اتفاق نمیفته و شما در مقابل برخی حملات SQL Injection در خطر قرار میگیرین !

۵ – اگه از کتابخونه mysqli استفاده میکنید بعد از connect متد set_charset را صدا بزنید :

$db = new mysqli('server_ip_address', 'db-user', 'db-pass', 'db-name');
$db->set_charset("utf8");

۶ – اگه از کتابخونه pdo استفاده میکنید زمان connect باید charset را توی dsn مشخص کنید:

$link = new PDO("mysql:host=localhost;dbname=DB;charset=utf8");

توجه: کلاً بهتره کتابخونه mysql را بی‌خیال بشین چون دیگه توی نسخه های جدید php پشتیبانی نمیشه و کلاً حذف شده. اما در مورد mysqli و pdo خیلی سلیقه‌ای هست که توصیه میکنم اگه از mysql استفاده میکنید و قصد جایگزینیش با mssql و پایگاه های دیگه را ندارید حتماً از mysqli استفاده کنید چون سریعتر از PDO هست و برای پایگاه داده mysql بهینه شده.

اگه همه موارد را درست رعایت کرده باشین هیچ مشکلی در نمایش و درج فارسی با پایگاه داده MySQL توی PHP نخواهید داشت. من در پایان هم یک نمونه کد جهت تست قرار میدم :

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>نمایش محتوای جدول</title>
<style>
  body{
      font-family:tahoma;
      font-size:12px;
  }
</style>
</head>

<body>
<?php
  $db = new mysqli('localhost', 'db-user', 'db-pass', 'db-name');
  if($db->connect_errno > 0){
      die('خطا در زمان اتصال به پایگاه داده [' . $db->connect_error . ']');
  }else{
      $db->set_charset("utf8");
      $result = $db->query("select * from tbl_names");
      echo "<table border='1' style='direction:rtl'>";
      echo "<tr style='font-weight:bold;background-color:#ccc'>";
      echo "<td>نام</td>";
      echo "<td>نام خانوادگی</td>";
      echo "<td>کد ملی</td>";
      echo "</tr>";
      while($row = $result->fetch_assoc()){
        echo "<tr>";
        echo "<td>{$row['fld_name']}</td>";
        echo "<td>{$row['fld_family']}</td>";
        echo "<td>{$row['fld_idnumber']}</td>";
        echo "</tr>";
      }
      echo "</table>";
      $result->free();
      $db->close();
  }
?>
</body>

</html>

موفق باشین.

نمایش صفحه سفید ،‌ کار نکردن کد روی سرور و از این دست مشکلات در PHP

نویسنده:
۲۴ اردیبهشت ۹۵

یکی از سؤالاتی که بارها مخصوصاً توسط تازه کار‌های PHP پرسیده میشه این هست که برنامه یا سایت روی سیستم خودمون به صورت Local درست کار میکنه اما وقتی به Server و سایت اصلی منتقلش میکنیم به مشکل میخوریم.

کدنویس عصبانی

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

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

بر روی Server از طریق کانفیگ PHP به صورت پیش‌ فرض مانع از نمایش خطا ها به کاربر می‌شوند که کاملاً درسته و شما خودتون باید نمایش خطا‌ها را دستی فعال کنید. برای این کار این دو خط را در ابتدای کدهای PHP خودتون قرار بدین :

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

این دو خط از مفسر PHP میخواد که همه انواع خطاها را گزارش کنه و در صورت بروز خطا آن‌ها را در خود صفحه نمایش بده. اگه بخواهیم اصولی‌تر گزارش خطاها را کنترل کنیم بهتره از htaccess. استفاده کنیم و این چند خط را داخلش بنویسیم :

php_flag display_startup_errors on
php_flag display_errors on
php_value error_reporting 32767

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

php_flag  log_errors on
php_value error_reporting 32767
php_value error_log  /full/path/to/log/file.log

حالا کافیه سایت را دوباره چک کنیم و این بار قطعاً خطاهای احتمالی را متوجه میشیم و میتونیم رفعشون کنیم.

بازنشاندن یا همون Reset کردن فیلد File Input با جاوا اسکریپت

نویسنده:
۲۳ اردیبهشت ۹۵

اگه به توسعه Ajax ی وب سایت‌های خودتون روی آورده باشین قطعاً یکی از دردسر هایی که باهاش مواجه شدین میتونه این باشه که چطور یک فیلد Input از نوع فایل را Reset کنید. چون با خالی کردنش یا Clone گرفتن و این چیزا Reset بشو نیست و مرورگر‌های مختلف هم رفتار‌های متفاوتی دارند که اگه اینطور نبود جای تعجب داشت مخصوصاً نسخه‌های قدیمی IE !!!

روش کلی این هست که کل ورودی ها را یا همون input را بگذاریم توی تگ form و حالا فرم را Reset کنیم. اما اگه بخواهیم فقط همون Input را بدون خرابکاری و تگ بازی و دینامیک Reset کنیم میتونیم از این کد استفاده کنیم :

با فرض اینکه اسم id اون Input مورد نظر myfile باشه :

function reset_fileinput(input_id){
	e = document.getElementById(input_id);
	$(e).wrap('<form>').closest('form').get(0).reset();
	$(e).unwrap();
}

reset_fileinput("myfile");

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

نویسنده:
۷ بهمن ۹۴

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

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

اعتبار سنجی (Login) کاربر با استفاده از HTTP Authentication و PHP

نویسنده:
۲۵ دی ۹۴

توی یکسری از سناریو‌ها نیاز هست که بدون استفاده از فرم ورود به سایت با استفاده از نام کاربری و گذرواژه دسترسی کاربر را اعتبارسنجی کنیم. یکی از موارد میتونه سایت‌های اشتراک فایل باشه که باید دسترسی کاربر به فایل ، شارژ حجمی حساب کاربر و موارد دیگه را اعتبار سنجی کنیم.

Authentication

HTTP Authentication یا اعتبار سنجی از طریق پروتوکل HTTP مدت زمان زیادی هست که وجود داره و در گذشته خیلی استفاده میشده و حالا خیلی کم‌رنگ شده. اما برای سناریو‌هایی که در پاراگراف بالا اشاره کردم بهترین انتخاب هست و با کمک PHP میتونیم اعتبارسنجی را بدون نیاز به htpasswd. و فایل htaccess. انجام بدیم :

$username = null;
$password = null;

if (isset($_SERVER['PHP_AUTH_USER'])) {
 $username = $_SERVER['PHP_AUTH_USER'];
 $password = $_SERVER['PHP_AUTH_PW'];
} elseif (isset($_SERVER['HTTP_AUTHORIZATION'])) {
 if (strpos(strtolower($_SERVER['HTTP_AUTHORIZATION']),'basic')===0)
 list($username,$password) = explode(':',base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
}

if (is_null($username)) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'You need login information in http authentication format';
    die();
} else {
    echo "<p>Hello {$username}.</p>";
    echo "<p>You entered {$password} as your password.</p>";
}

نکته: برای ارسال نام کاربری و گذرواژه با URL باید با فرمت زیر عمل کرد :

http://user:pass@example.com/path-to-file

نکته: در این روش نام کاربری و گذرواژه عبور به صورت متن خام Plain Text ارسال میشه و برای فراهم کردن امنیت باید از SSL استفاده کنیم یا از روش Digest Authentication استفاده کنیم که به سر راستی روش Basic که شرح داده شد نیست اما همه نرم‌افزار ها و مرورگر ها ازش پشتیبانی میکنن.