JWT (Json Web Token):
یک استاندارد برای ایجاد توکنهای دیجیتاله که تو فرایند احراز هویت و تأیید اعتبار در برنامهها و سیستمهای وب استفاده میشه. JWT یک توکن کم حجم و ایمن هستش که اطلاعاتی رو تو خودش ذخیره می کنه و به صورت امضاشده به عنوان یک رشته Base64 ارسال می کنه.
چرا بصورت Base64 ارسال میشه؟
1. قابلیت انتقال توی فرمت متنی:
رشتههای Base64 متشکل از کاراکترهای الفبای بیتی هستن که میتونن بدون مشکل در فرمتهای متنی ارسال و ذخیره بشن. باعث میشه که توکن JWT بدون نیاز به فرمتهای خاص بتونه تو درخواستها و پاسخهای HTTP ارسال بشه.
2. حجم کمتر:
با استفاده از رشتههای Base64 برای نمایش سربرگ، حجم توکن JWT کمتر می شه. چون رشتههای Base64 نسبت به داده اصلی کوچیک ترن. این کاهش حجم باعث میشه توکن JWT به صورت کمحجمتری قابل انتقال و ذخیره بشه.
آیا Base64 بودن امنیت توکنو تضمین می کنه؟
استفاده از Base64 هیچ تأثیری تو امنیت توکن نداره. امضای دیجیتال توکن تو قسمت امضا (Signature) صورت میگیره و اصالت و صحت سربرگ توسط امضا بررسی میشه. بنابراین، حتی اگر سربرگ در قالب Base64 لو بره، امنیت توکن تضمین میشه.
#JWT
@khat_academy
یک استاندارد برای ایجاد توکنهای دیجیتاله که تو فرایند احراز هویت و تأیید اعتبار در برنامهها و سیستمهای وب استفاده میشه. JWT یک توکن کم حجم و ایمن هستش که اطلاعاتی رو تو خودش ذخیره می کنه و به صورت امضاشده به عنوان یک رشته Base64 ارسال می کنه.
چرا بصورت Base64 ارسال میشه؟
1. قابلیت انتقال توی فرمت متنی:
رشتههای Base64 متشکل از کاراکترهای الفبای بیتی هستن که میتونن بدون مشکل در فرمتهای متنی ارسال و ذخیره بشن. باعث میشه که توکن JWT بدون نیاز به فرمتهای خاص بتونه تو درخواستها و پاسخهای HTTP ارسال بشه.
2. حجم کمتر:
با استفاده از رشتههای Base64 برای نمایش سربرگ، حجم توکن JWT کمتر می شه. چون رشتههای Base64 نسبت به داده اصلی کوچیک ترن. این کاهش حجم باعث میشه توکن JWT به صورت کمحجمتری قابل انتقال و ذخیره بشه.
آیا Base64 بودن امنیت توکنو تضمین می کنه؟
استفاده از Base64 هیچ تأثیری تو امنیت توکن نداره. امضای دیجیتال توکن تو قسمت امضا (Signature) صورت میگیره و اصالت و صحت سربرگ توسط امضا بررسی میشه. بنابراین، حتی اگر سربرگ در قالب Base64 لو بره، امنیت توکن تضمین میشه.
#JWT
@khat_academy
👍7❤2
Refresh Token, Access Token
تو مکانیزم JWT، معمولاً از دو بخش توکن استفاده میشه که به عنوان "Refresh Token" و "Access Token" شناخته میشن. هر کدوم از این دو توکن نقش و وظیفههای مختص خودشو تو فرآیند احراز هویت و مدیریت دسترسیها دارن.
1. Refresh Token:
رفرش توکن، توکنی است که به کاربر در زمان احراز هویت و داده میشه. این توکن معمولاً دارای مدت زمان اعتبار بلندتری نسبت به Access Token هستش و معمولاً توسط سرور صادر میشه. وظیفه Refresh Token در تجدید و تمدید Access Token هستش. به عبارت دیگه، هنگامی که Access Token منقضی میشه، کاربر میتونه Refresh Token رو به سرور ارسال کنه تا یدونه Access Token جدید دریافت کنه بدون نیاز به مجدداً وارد کردن اطلاعات احراز هویت.
2. Access Token:
اکسس توکن، توکنی است که بعد از احراز هویت کاربر به او اختصاص داده میشه و برای دسترسی به منابع و انجام عملیات مختلف استفاده میشه. این توکن معمولاً دارای مدت زمان اعتبار کوتاهتری نسبت به رفرش توکن هستش.
اکسس توکن برای هر درخواست از طریق هدر یا پارامترهای درخواست ارسال میشه و سرور با بررسی اعتبار و صحتش، دسترسی کاربر به منابع رو تأیید میکنه.
دو دلیل برای اینکه چرا دو نوع توکن داریم؟
1. امنیت بیشتر: استفاده از توکن Access با مدت زمان اعتبار کوتاهتر، مزیت امنیتی داره. در صورتی که توکن Access در دسترس یک اتکر قرار بگیره، مدت زمانی که میتونه ازش استفاده کنه محدوده و احتمال سوءاستفاده کم میشه.
2. مدیریت دسترسی بهتر: با استفاده از دو نوع توکن، مدیریت دسترسیها بهتر امکانپذیر میشه. با تنظیم مدت زمان اعتبار کوتاهتر برای Access Token، کاربران تو فاصله زمانی کوتاهتری بین درخواستها مجدداً احراز هویت میشن و دسترسی خودشونو تایید می کنن. این به سرور اجازه میده تا در مدت زمان کمتری درخواستهای کاربران رو بررسی کنه و عملکرد سیستم رو بهبود ببخشه.
شاید از خودتون بپرسید خب اگه رفرش توکن دست هکر بیوفته چی؟
اینجاس که بحث پیاده سازی سیستم احراز هویت امن پیش میاد. یعنی ما باید بررسی کنیم ببینیم شخصی که داره درخواست می ده واقعا خودشه یا نه!
#JWT
@khat_academy
تو مکانیزم JWT، معمولاً از دو بخش توکن استفاده میشه که به عنوان "Refresh Token" و "Access Token" شناخته میشن. هر کدوم از این دو توکن نقش و وظیفههای مختص خودشو تو فرآیند احراز هویت و مدیریت دسترسیها دارن.
1. Refresh Token:
رفرش توکن، توکنی است که به کاربر در زمان احراز هویت و داده میشه. این توکن معمولاً دارای مدت زمان اعتبار بلندتری نسبت به Access Token هستش و معمولاً توسط سرور صادر میشه. وظیفه Refresh Token در تجدید و تمدید Access Token هستش. به عبارت دیگه، هنگامی که Access Token منقضی میشه، کاربر میتونه Refresh Token رو به سرور ارسال کنه تا یدونه Access Token جدید دریافت کنه بدون نیاز به مجدداً وارد کردن اطلاعات احراز هویت.
2. Access Token:
اکسس توکن، توکنی است که بعد از احراز هویت کاربر به او اختصاص داده میشه و برای دسترسی به منابع و انجام عملیات مختلف استفاده میشه. این توکن معمولاً دارای مدت زمان اعتبار کوتاهتری نسبت به رفرش توکن هستش.
اکسس توکن برای هر درخواست از طریق هدر یا پارامترهای درخواست ارسال میشه و سرور با بررسی اعتبار و صحتش، دسترسی کاربر به منابع رو تأیید میکنه.
دو دلیل برای اینکه چرا دو نوع توکن داریم؟
1. امنیت بیشتر: استفاده از توکن Access با مدت زمان اعتبار کوتاهتر، مزیت امنیتی داره. در صورتی که توکن Access در دسترس یک اتکر قرار بگیره، مدت زمانی که میتونه ازش استفاده کنه محدوده و احتمال سوءاستفاده کم میشه.
2. مدیریت دسترسی بهتر: با استفاده از دو نوع توکن، مدیریت دسترسیها بهتر امکانپذیر میشه. با تنظیم مدت زمان اعتبار کوتاهتر برای Access Token، کاربران تو فاصله زمانی کوتاهتری بین درخواستها مجدداً احراز هویت میشن و دسترسی خودشونو تایید می کنن. این به سرور اجازه میده تا در مدت زمان کمتری درخواستهای کاربران رو بررسی کنه و عملکرد سیستم رو بهبود ببخشه.
شاید از خودتون بپرسید خب اگه رفرش توکن دست هکر بیوفته چی؟
اینجاس که بحث پیاده سازی سیستم احراز هویت امن پیش میاد. یعنی ما باید بررسی کنیم ببینیم شخصی که داره درخواست می ده واقعا خودشه یا نه!
#JWT
@khat_academy
👏8👍2😱2
ساختار JWT
از سه بخش تشکیل شده: سربرگ (Header)، بدنه (Payload) و امضا (Signature). سربرگ شامل اطلاعات مربوط به نوع توکن و الگوریتم امضا هستش، بدنه حاوی اطلاعات مفیدی است که برنامهها میتونن ازش استفاده کنن.
امضا برای تأیید اعتبار توکن استفاده میشه(امضا رو فقط خودمون می دونیم چیه و اعتبار توکن هم بر اساس امضا می سنجیم).
قسمت payload اطلاعاتی که نیازه بهش توکن داشته باشه. مثلا تاریخ انقضا و اینکه توکن برای چه شخصی صادر شده. تو این قسمت ما می تونیم اطلاعات بیشتری رو ذخیره کنیم برای مثال:
last_name, username, user_id ...
خلاصه می تونیم اطلاعات مورد نیازمونو قرارش بدیم تا نیاز نباشه هربار از دیتابیس بگیریم. در نهایت میایم encrypt می کنیم تا قابل خوندن نباشه.
قسمت signature:
امضا به عنوان یک سپر امنیتی برای تشخیص تغییرات در دادههای توکن و تأیید اینکه توکن توسط یک صادر کننده معتبر ایجاد شده، به کار میره.
پ.ن
تو گوگل سرچ کنید کلی توضیح کامل میاد. بریم سراغ پیاده سازیش
#JWT
@khat_academy
از سه بخش تشکیل شده: سربرگ (Header)، بدنه (Payload) و امضا (Signature). سربرگ شامل اطلاعات مربوط به نوع توکن و الگوریتم امضا هستش، بدنه حاوی اطلاعات مفیدی است که برنامهها میتونن ازش استفاده کنن.
امضا برای تأیید اعتبار توکن استفاده میشه(امضا رو فقط خودمون می دونیم چیه و اعتبار توکن هم بر اساس امضا می سنجیم).
Header.Payload.Signature
همونطور که تو عکس مشخصه. قسمت header نوع توکن مشخص شده با الگوریتم امضا.قسمت payload اطلاعاتی که نیازه بهش توکن داشته باشه. مثلا تاریخ انقضا و اینکه توکن برای چه شخصی صادر شده. تو این قسمت ما می تونیم اطلاعات بیشتری رو ذخیره کنیم برای مثال:
last_name, username, user_id ...
خلاصه می تونیم اطلاعات مورد نیازمونو قرارش بدیم تا نیاز نباشه هربار از دیتابیس بگیریم. در نهایت میایم encrypt می کنیم تا قابل خوندن نباشه.
قسمت signature:
امضا به عنوان یک سپر امنیتی برای تشخیص تغییرات در دادههای توکن و تأیید اینکه توکن توسط یک صادر کننده معتبر ایجاد شده، به کار میره.
پ.ن
تو گوگل سرچ کنید کلی توضیح کامل میاد. بریم سراغ پیاده سازیش
#JWT
@khat_academy
👍9
JWT
اگه شما توسعه دهنده فرانت اند هستید. می تونید سیستم احراز هویت JWT رو توی این پروژه ی واقعی که آنلاینش کردم تست کنید(فعلا آفلاینه)
http://188.121.113.3/api/schema/redoc/
همچنین یک سری قابلیت های دیگه هم در ادامه بهش اضافه می کنم.
#JWT
@khat_academy
اگه شما توسعه دهنده فرانت اند هستید. می تونید سیستم احراز هویت JWT رو توی این پروژه ی واقعی که آنلاینش کردم تست کنید(فعلا آفلاینه)
http://188.121.113.3/api/schema/redoc/
همچنین یک سری قابلیت های دیگه هم در ادامه بهش اضافه می کنم.
#JWT
@khat_academy
❤7
بررسی استاندارد احراز هویت JWT توی پروژه qanda.
لینک گیت هاب:
https://github.com/alireza-fa/question-and-answer
Model
اولین کاری که میکنیم اینه یک مدل به اسم UserLogin مینویسیم.
اینکه چه فیلد هایی رو میخواید قرار بدید انتخاب خودتونه اما فیلد های مورد نیاز ما این موارد هستش:
user_id
refresh token
expired_at
device
ip_address
Token
یکی از کارهای دیگه که کردیم این هستش که یک سری اطلاعات بیشتری رو توی payload توکن هامون قرار دادیم که این فیلد ها هستش:
username
email
first_name
last_name
device_name
ip_address
دلیل اینکه اینکارو انجام دادیم چیه؟
با اضافه کردن این اطلاعات پرکاربرد دیگه نیاز نیست هر بار از سمت دیتابیس بگیریم.
Encrypt / Decrypt
میخوایم اطلاعاتی که توی payload توکن قرار دادیم قابل دیدن نباشه. پس میایم توکن رو encrypt شده سمت کلاینت ارسال می کنیم و هر وقت که نیاز بود سمت بک اند decrypt میکنیم و عملیات اعتبار سنجی و هرچیزی نیاز هستش رو انجام می دیم.
چجوری توکن رو امن تر کردیم؟
تو مدل UserLogin اطلاعات کاربر موقعی که لاگین می کنه ذخیره کردیم. مثل نام دستگاه و آدرس آی پی. همچنین توی توکن هم اضافه کردیم.
کاری که می کنیم اینه چک می کنیم شخصی که میخواد اکسس توکن جدید بگیره ip address و device name همونه یا نه. اگه اون نبود توکن رو نامعتبر می شماریم.
همچنین برای امنیت بیشتر تو هر درخواست اکسس توکن رو هم می تونیم بررسی کنیم که مشخصاتش با شخصی که داره درخواست میده یکی هستش یا نه
برای بررسی بیشتر حتما به ریپازیتوری گیت هاب سر بزنید. برای حمایت ستاره بدید ممنون میشم.
#JWT
@khat_academy
لینک گیت هاب:
https://github.com/alireza-fa/question-and-answer
Model
اولین کاری که میکنیم اینه یک مدل به اسم UserLogin مینویسیم.
اینکه چه فیلد هایی رو میخواید قرار بدید انتخاب خودتونه اما فیلد های مورد نیاز ما این موارد هستش:
user_id
refresh token
expired_at
device
ip_address
Token
یکی از کارهای دیگه که کردیم این هستش که یک سری اطلاعات بیشتری رو توی payload توکن هامون قرار دادیم که این فیلد ها هستش:
username
first_name
last_name
device_name
ip_address
دلیل اینکه اینکارو انجام دادیم چیه؟
با اضافه کردن این اطلاعات پرکاربرد دیگه نیاز نیست هر بار از سمت دیتابیس بگیریم.
Encrypt / Decrypt
میخوایم اطلاعاتی که توی payload توکن قرار دادیم قابل دیدن نباشه. پس میایم توکن رو encrypt شده سمت کلاینت ارسال می کنیم و هر وقت که نیاز بود سمت بک اند decrypt میکنیم و عملیات اعتبار سنجی و هرچیزی نیاز هستش رو انجام می دیم.
چجوری توکن رو امن تر کردیم؟
تو مدل UserLogin اطلاعات کاربر موقعی که لاگین می کنه ذخیره کردیم. مثل نام دستگاه و آدرس آی پی. همچنین توی توکن هم اضافه کردیم.
کاری که می کنیم اینه چک می کنیم شخصی که میخواد اکسس توکن جدید بگیره ip address و device name همونه یا نه. اگه اون نبود توکن رو نامعتبر می شماریم.
همچنین برای امنیت بیشتر تو هر درخواست اکسس توکن رو هم می تونیم بررسی کنیم که مشخصاتش با شخصی که داره درخواست میده یکی هستش یا نه
برای بررسی بیشتر حتما به ریپازیتوری گیت هاب سر بزنید. برای حمایت ستاره بدید ممنون میشم.
#JWT
@khat_academy
👍13
لینک اشتراک گذاری تو شبکه های اجتماعی مختلف.
آکولاد اول لینک اون صفحه از وب سایتتون که میخواید به اشتراک بذارید رو میدید. آکولاد دوم توضیح درباره اون لینکه که بعضی از شبکه های اجتماعی میگیرنش
FACEBOOK:
https://www.facebook.com/sharer/sharer.php?u={}
TWITTER:
https://twitter.com/intent/tweet?url={}&text={}
LINKEDIN:
https://www.linkedin.com/shareArticle?mini=true&url={}&noscript={}
PINTEREST:
https://www.pinterest.com/pin/find/?url={}&denoscription={}
TUMBLE:
http://www.tumblr.com/share?v=3&u={}&t={}
TELEGRAM:
https://telegram.me/share/url?url={}&text={}
GOOGLE_PLUS:
https://plus.google.com/share?url={}
WHATSAPP:
whatsapp://send?text={}
@khat_academy
آکولاد اول لینک اون صفحه از وب سایتتون که میخواید به اشتراک بذارید رو میدید. آکولاد دوم توضیح درباره اون لینکه که بعضی از شبکه های اجتماعی میگیرنش
FACEBOOK:
https://www.facebook.com/sharer/sharer.php?u={}
TWITTER:
https://twitter.com/intent/tweet?url={}&text={}
LINKEDIN:
https://www.linkedin.com/shareArticle?mini=true&url={}&noscript={}
PINTEREST:
https://www.pinterest.com/pin/find/?url={}&denoscription={}
TUMBLE:
http://www.tumblr.com/share?v=3&u={}&t={}
TELEGRAM:
https://telegram.me/share/url?url={}&text={}
GOOGLE_PLUS:
https://plus.google.com/share?url={}
WHATSAPP:
whatsapp://send?text={}
@khat_academy
❤4🔥3
از کی تا حالا شرکتای آمریکایی از طریق جابینجا نیرو جذب می کنن!
یه شرکت آمریکایی این ایملو بهم فرستاده. خودمم تعجب کردم
@khat_academy
یه شرکت آمریکایی این ایملو بهم فرستاده. خودمم تعجب کردم
@khat_academy
😱9😁2
تو تیممون به یکی نیاز داریم بتونه ادیت ویدیو انجام بده.
در حد حرفه ای نه، برای ریلز های اینستا و اینجور محتوا ها
اگه کسی دوست داره جز تیممون شه بهم پی ام بده
@alireza_fai
در حد حرفه ای نه، برای ریلز های اینستا و اینجور محتوا ها
اگه کسی دوست داره جز تیممون شه بهم پی ام بده
@alireza_fai
🎉6👍3
تغییر name server توی لینوکس
تو اکثر سیستم عامل هایی که بیسش لینوکسه،داخل فایل
/etc/resolv.conf
سرور های دی ان اس رو مشخص می کنیم.
حداقل باید یک نیم سرور توی فایل وجود داشته باشه که بصورت پیشفرض مساوی با
nameserver 127.0.0.53
هستش.
برای تغییر کافیه ترمینالتونو باز کنید و این دستورو بزنید:
sudo nano /etc/resolv.conf
بعدش دنبال nameserver بگردید و بجای 127.0.0.53 نیم سروری که میخواید جایگزین کنیدو وارد کنید.
نکته:
توی nano برای سیو کردن crt + o رو بزنید و بعدش enter. برای خروج ctr + x رو بزنید.
چه مواقع استفاده می کنیم؟
با توجه به اینکه تو ایران زندگی می کنیم خیلی وقت ها !
مثلا اگه بخواید از داکر استفاده کنید نیازه که دی ان اس خودتونو تغییر بدید.
@khat_academy
تو اکثر سیستم عامل هایی که بیسش لینوکسه،داخل فایل
/etc/resolv.conf
سرور های دی ان اس رو مشخص می کنیم.
حداقل باید یک نیم سرور توی فایل وجود داشته باشه که بصورت پیشفرض مساوی با
nameserver 127.0.0.53
هستش.
برای تغییر کافیه ترمینالتونو باز کنید و این دستورو بزنید:
sudo nano /etc/resolv.conf
بعدش دنبال nameserver بگردید و بجای 127.0.0.53 نیم سروری که میخواید جایگزین کنیدو وارد کنید.
نکته:
توی nano برای سیو کردن crt + o رو بزنید و بعدش enter. برای خروج ctr + x رو بزنید.
چه مواقع استفاده می کنیم؟
با توجه به اینکه تو ایران زندگی می کنیم خیلی وقت ها !
مثلا اگه بخواید از داکر استفاده کنید نیازه که دی ان اس خودتونو تغییر بدید.
@khat_academy
👍8
قراره یکی از مقالات خوب در خصوص server hardening در لینوکس رو بصورت ترجمه شده با توضیحات کامل تر توی یه کانال تخصصی قرارش بدم.
اگه برای شما هم مسائل امنیتی سرور جذابه و باهاش سر و کار دارید اینجا هم قرارش میدم(واقعا زیاده هر نکته تقریبا اندازه یه مقالست)
اگه برای شما هم مسائل امنیتی سرور جذابه و باهاش سر و کار دارید اینجا هم قرارش میدم(واقعا زیاده هر نکته تقریبا اندازه یه مقالست)
Anonymous Poll
83%
قرارش بدم
17%
قرارش ندم
گوگلو قانونی دور بزن !
تو این مقاله درباره سئو کلاه خاکستری توضیح دادیم و چند روش برای پیاده سازیش مثال زدیم که به شما این امکانو میده تو مدت زمان کم سئو وب سایتتون تقویت بشه
@khat_academy
تو این مقاله درباره سئو کلاه خاکستری توضیح دادیم و چند روش برای پیاده سازیش مثال زدیم که به شما این امکانو میده تو مدت زمان کم سئو وب سایتتون تقویت بشه
@khat_academy
Telegraph
سئو کلاه خاکستری
- گوگل رو قانونی دور بزن!
🔥6👍3
چهل نکته درباره Linux Server Hardening (قسمت اول)
تو قسمت اول نکته یک تا ده رو بهتون گفتم.
امیدوارم براتون مفید باشه 👌
#hardening
@khat_academy
تو قسمت اول نکته یک تا ده رو بهتون گفتم.
امیدوارم براتون مفید باشه 👌
#hardening
@khat_academy
Telegraph
چهل نکته درباره Linux Server Hardening
👍8🔥3
اگه اول راه هستید و نمیدونید کدوم فیلد مناسب شماست.
اگه میخواید لینکدین حرفه ای داشته باشید و رزومه خوبی برای خودتون درست کنید
این کانال همه این موارد رو پوشش میده
راستی توجه اصلی کانال روی مباحث هوش مصنوعی هستش
پس اگه علاقه مند به این موضوعات هستید حتما دنبال کنید
آدرس کانال:
https://news.1rj.ru/str/MobiFacts
#معرفی_کانال
@khat_academy
اگه میخواید لینکدین حرفه ای داشته باشید و رزومه خوبی برای خودتون درست کنید
این کانال همه این موارد رو پوشش میده
راستی توجه اصلی کانال روی مباحث هوش مصنوعی هستش
پس اگه علاقه مند به این موضوعات هستید حتما دنبال کنید
آدرس کانال:
https://news.1rj.ru/str/MobiFacts
#معرفی_کانال
@khat_academy
👍7
🔥13
« از اون بالا کفتر میایه »
شهاب تیام که با آهنگ «از اون بالا کفتر میایه» شناخته میشه مهندس سخت افزار هستش و پونزده سالی توی اینتل مشغول به فعالیت بوده و الانم تو یه شرکت جدید شروع به فعالیت کرده :)
بله. بعضی وقتا زندگی مسیری رو برات میچینه که فکرشم نمیکردی
(باورت نمیشه کامنتو نگاه کن)
https://www.linkedin.com/in/shahab-tiam-a873b14/
@khat_academy
شهاب تیام که با آهنگ «از اون بالا کفتر میایه» شناخته میشه مهندس سخت افزار هستش و پونزده سالی توی اینتل مشغول به فعالیت بوده و الانم تو یه شرکت جدید شروع به فعالیت کرده :)
بله. بعضی وقتا زندگی مسیری رو برات میچینه که فکرشم نمیکردی
(باورت نمیشه کامنتو نگاه کن)
https://www.linkedin.com/in/shahab-tiam-a873b14/
@khat_academy
😱7🤣3👍2
سیر تحول فنی «کوییز آو کینگز»: مسیری که باعث تعجب تیم یوتیوب شد!
https://virgool.io/@mohammad7293/%D8%B3%DB%8C%D8%B1-%D8%AA%D8%AD%D9%88%D9%84-%D9%81%D9%86%DB%8C-%DA%A9%D9%88%DB%8C%DB%8C%D8%B2-%D8%A2%D9%88-%DA%A9%DB%8C%D9%86%DA%AF%D8%B2-%D9%85%D8%B3%DB%8C%D8%B1%DB%8C-%DA%A9%D9%87-%D8%A8%D8%A7%D8%B9%D8%AB-%D8%AA%D8%B9%D8%AC%D8%A8-%D8%AA%DB%8C%D9%85-%DB%8C%D9%88%D8%AA%DB%8C%D9%88%D8%A8-%D8%B4%D8%AF-h8m7caqni6rg
@khat_academy
https://virgool.io/@mohammad7293/%D8%B3%DB%8C%D8%B1-%D8%AA%D8%AD%D9%88%D9%84-%D9%81%D9%86%DB%8C-%DA%A9%D9%88%DB%8C%DB%8C%D8%B2-%D8%A2%D9%88-%DA%A9%DB%8C%D9%86%DA%AF%D8%B2-%D9%85%D8%B3%DB%8C%D8%B1%DB%8C-%DA%A9%D9%87-%D8%A8%D8%A7%D8%B9%D8%AB-%D8%AA%D8%B9%D8%AC%D8%A8-%D8%AA%DB%8C%D9%85-%DB%8C%D9%88%D8%AA%DB%8C%D9%88%D8%A8-%D8%B4%D8%AF-h8m7caqni6rg
@khat_academy
👍8