📕 کتاب REST API Design Rulebook
📌 فصل چهارم: Metadata Design
📍پارت: اول
#کتاب
💎 HTTP Headers 💎
توی درخواست و پاسخهای HTTP، یه سری اطلاعات متا (Metadata) از طریق هدرهای مختلف منتقل میشن. HTTP یه سری هدر استاندارد داره که بعضیاشون درباره منابع درخواست شده اطلاعات میدن. یه سری دیگه نشون میدن که چه نوع دیتایی توی پیام وجود داره. یه تعداد دیگه هم برای کنترل کش (Cache) استفاده میشن.
توی این متن کوتاه چندتا قانون مهم برای استفاده از هدرهای استاندارد HTTP توی طراحی REST API ها پیشنهاد شده.
⭕️ استفاده از Content-Type اجباریه
هدر Content-Type نوع دادهای که توی body درخواست یا پاسخ هست رو مشخص میکنه. مقدار این هدر یه رشته متنی با فرمت خاصه که بهش "Media Type" گفته میشه. سرور و کلاینت با استفاده از مقدار این هدر متوجه میشن چطوری باید بایتهای موجود توی بدنه پیام رو پردازش کنن.
⭕️ استفاده از Content-Length توصیه میشه
هدر Content-Length اندازه بدنه پیام (entity-body) رو بر حسب بایت مشخص میکنه. این هدر توی پاسخها مهمه چون دو تا کار رو راحت میکنه:
اول اینکه کلاینت متوجه میشه که آیا تعداد بایتهای درست رو خونده یا نه. دوم اینکه میتونه با یه درخواست HEAD بفهمه که اندازه بدنه پیام چقدره بدون اینکه نیاز باشه کل پیام رو دانلود کنه.
⭕️ استفاده از Last-Modified توی پاسخها توصیه میشه
هدر Last-Modified فقط توی پیامهای پاسخ استفاده میشه. مقدار این هدر یه timestamp (زمان دقیق) هست که نشون میده آخرین باری که چیزی توی منابع تغییر کرده کی بوده. کلاینت و کشهای میانی (Cache Intermediaries) میتونن از این هدر استفاده کنن تا بفهمن نسخه محلیشون از منبع بهروز هست یا نه. این هدر باید همیشه توی پاسخ به درخواستهای GET باشه.
⭕️ استفاده از ETag توی ریسپانس ها توصیه میشه
مقدار ETag یه رشته متنی غیرشفافه (opaque) که یه "نسخه" خاص از منبع (Resource) توی body ریسپانس رو شناسایی میکنه. body پیام HTTP شامل هدرها و body اصلی پیام میشه. مقدار ETag میتونه هر رشتهای باشه، به شرطی که وقتی نمایشی از منبع تغییر میکنه، مقدارش هم تغییر کنه. این هدر باید همیشه توی پاسخ به درخواستهای GET ارسال بشه.
کلاینتها میتونن مقدار هدر ETag رو ذخیره کنن تا توی درخواستهای GET بعدی، ازش استفاده کنن؛ به عنوان مقدار هدر شرطی If-None-Match. اگه API تشخیص بده که ETag تغییر نکرده، میتونه از ارسال دوبارهی بدنه پیام صرفنظر کنه و در نتیجه توی زمان و پهنای باند صرفهجویی بشه.
@ninja_learn_ir
⭕️ store ها باید از درخواستهای شرطی PUT پشتیبانی کنن
وقتی برای ذخیره یه منبع از متد PUT استفاده میکنه (چه برای ایجاد و چه بهروزرسانی)، ممکنه برای API مشخص نباشه که درخواست کلاینت برای درج داده جدیده یا بهروزرسانی. اینجاست که HTTP از طریق هدرها ابزار لازم رو در اختیار API میذاره تا این ابهام رو برطرف کنه. برای این کار، API باید به هدرهای شرطی کلاینت مثل If-Unmodified-Since یا If-Match متکی باشه تا منظور دقیق کلاینت رو بفهمه.
هدر If-Unmodified-Since از API میخواد که فقط در صورتی عملیات رو انجام بده که از زمانی که توی این هدر مشخص شده، وضعیت منبع تغییری نکرده باشه.
هدر If-Match یه مقدار ETag رو از کلاینت میگیره، که از پاسخ قبلی API ذخیره شده. اگه این مقدار ETag با وضعیت فعلی منبع مطابقت داشته باشه، API درخواست PUT رو انجام میده؛ وگرنه درخواست رو رد میکنه.
✅ مثال برای درخواستهای شرطی PUT
فرض کنیم دو کلاینت (کلاینت#1 و کلاینت#2) از یه منبع ذخیرهی API با آدرس
کلاینت#1 یه درخواست PUT میفرسته تا یه داده جدید توی مسیر
چند وقت بعد، کلاینت#2 درخواست PUT برای همون مسیر (
@ninja_learn_ir
📌 فصل چهارم: Metadata Design
📍پارت: اول
#کتاب
💎 HTTP Headers 💎
توی درخواست و پاسخهای HTTP، یه سری اطلاعات متا (Metadata) از طریق هدرهای مختلف منتقل میشن. HTTP یه سری هدر استاندارد داره که بعضیاشون درباره منابع درخواست شده اطلاعات میدن. یه سری دیگه نشون میدن که چه نوع دیتایی توی پیام وجود داره. یه تعداد دیگه هم برای کنترل کش (Cache) استفاده میشن.
توی این متن کوتاه چندتا قانون مهم برای استفاده از هدرهای استاندارد HTTP توی طراحی REST API ها پیشنهاد شده.
⭕️ استفاده از Content-Type اجباریه
هدر Content-Type نوع دادهای که توی body درخواست یا پاسخ هست رو مشخص میکنه. مقدار این هدر یه رشته متنی با فرمت خاصه که بهش "Media Type" گفته میشه. سرور و کلاینت با استفاده از مقدار این هدر متوجه میشن چطوری باید بایتهای موجود توی بدنه پیام رو پردازش کنن.
⭕️ استفاده از Content-Length توصیه میشه
هدر Content-Length اندازه بدنه پیام (entity-body) رو بر حسب بایت مشخص میکنه. این هدر توی پاسخها مهمه چون دو تا کار رو راحت میکنه:
اول اینکه کلاینت متوجه میشه که آیا تعداد بایتهای درست رو خونده یا نه. دوم اینکه میتونه با یه درخواست HEAD بفهمه که اندازه بدنه پیام چقدره بدون اینکه نیاز باشه کل پیام رو دانلود کنه.
⭕️ استفاده از Last-Modified توی پاسخها توصیه میشه
هدر Last-Modified فقط توی پیامهای پاسخ استفاده میشه. مقدار این هدر یه timestamp (زمان دقیق) هست که نشون میده آخرین باری که چیزی توی منابع تغییر کرده کی بوده. کلاینت و کشهای میانی (Cache Intermediaries) میتونن از این هدر استفاده کنن تا بفهمن نسخه محلیشون از منبع بهروز هست یا نه. این هدر باید همیشه توی پاسخ به درخواستهای GET باشه.
⭕️ استفاده از ETag توی ریسپانس ها توصیه میشه
مقدار ETag یه رشته متنی غیرشفافه (opaque) که یه "نسخه" خاص از منبع (Resource) توی body ریسپانس رو شناسایی میکنه. body پیام HTTP شامل هدرها و body اصلی پیام میشه. مقدار ETag میتونه هر رشتهای باشه، به شرطی که وقتی نمایشی از منبع تغییر میکنه، مقدارش هم تغییر کنه. این هدر باید همیشه توی پاسخ به درخواستهای GET ارسال بشه.
کلاینتها میتونن مقدار هدر ETag رو ذخیره کنن تا توی درخواستهای GET بعدی، ازش استفاده کنن؛ به عنوان مقدار هدر شرطی If-None-Match. اگه API تشخیص بده که ETag تغییر نکرده، میتونه از ارسال دوبارهی بدنه پیام صرفنظر کنه و در نتیجه توی زمان و پهنای باند صرفهجویی بشه.
⭕️ store ها باید از درخواستهای شرطی PUT پشتیبانی کنن
وقتی برای ذخیره یه منبع از متد PUT استفاده میکنه (چه برای ایجاد و چه بهروزرسانی)، ممکنه برای API مشخص نباشه که درخواست کلاینت برای درج داده جدیده یا بهروزرسانی. اینجاست که HTTP از طریق هدرها ابزار لازم رو در اختیار API میذاره تا این ابهام رو برطرف کنه. برای این کار، API باید به هدرهای شرطی کلاینت مثل If-Unmodified-Since یا If-Match متکی باشه تا منظور دقیق کلاینت رو بفهمه.
هدر If-Unmodified-Since از API میخواد که فقط در صورتی عملیات رو انجام بده که از زمانی که توی این هدر مشخص شده، وضعیت منبع تغییری نکرده باشه.
هدر If-Match یه مقدار ETag رو از کلاینت میگیره، که از پاسخ قبلی API ذخیره شده. اگه این مقدار ETag با وضعیت فعلی منبع مطابقت داشته باشه، API درخواست PUT رو انجام میده؛ وگرنه درخواست رو رد میکنه.
✅ مثال برای درخواستهای شرطی PUT
فرض کنیم دو کلاینت (کلاینت#1 و کلاینت#2) از یه منبع ذخیرهی API با آدرس
/objects
برای اشتراکگذاری اطلاعات استفاده میکنن.کلاینت#1 یه درخواست PUT میفرسته تا یه داده جدید توی مسیر
/objects/2113
ذخیره کنه. این مسیر قبلاً توی API وجود نداشته، پس API این درخواست رو بهعنوان "ایجاد" (Insert) تفسیر میکنه، منبع جدید رو میسازه و با کد 201 ("Created") پاسخ میده.چند وقت بعد، کلاینت#2 درخواست PUT برای همون مسیر (
/objects/2113
) میفرسته. حالا API این مسیر رو به یه منبع موجود متصل میکنه. اما چون اطلاعات کافی نداره که بفهمه آیا کلاینت#2 میخواد دادهی قبلی رو بهروزرسانی کنه یا نه، درخواست رو با کد 409 ("Conflict") رد میکنه و باید توی بدنه پاسخ هم یه توضیح از خطا بده.❤5
اگه کلاینت#2 تصمیم بگیره داده قبلی رو بهروزرسانی کنه، میتونه دوباره درخواست رو با هدر If-Match بفرسته. ولی اگه مقدار ETag توی هدر با مقدار فعلی منبع مطابقت نداشته باشه، API باید با کد 412 ("Precondition Failed") پاسخ بده. اما اگه شرط هدر مطابقت داشته باشه، API باید وضعیت منبع رو بهروزرسانی کنه و با کد 200 ("OK") یا 204 ("No Content") پاسخ بده.
اگه API یه نمای جدید از وضعیت منبع رو برگردونه، باید هدرهای Last-Modified و ETag رو با مقادیر بهروزرسانی شده توی پاسخ بذاره.
⭕️ استفاده از Location برای مشخص کردن URI منبع جدید
مقدار هدر Location یه URI هست که منبع جدیدی رو که ممکنه برای کلاینت مهم باشه، شناسایی میکنه. وقتی که API یه منبع جدید رو توی یه مجموعه یا فروشگاه ایجاد میکنه، باید هدر Location رو توی پاسخ قرار بده تا URI منبع جدید رو مشخص کنه.
توی پاسخ 202 ("Accepted")، این هدر میتونه کلاینت رو به وضعیت عملیاتی یه منبع کنترل غیرهمزمان (asynchronous controller) هدایت کنه.
⭕️ از هدرهای Cache-Control، Expires و Date برای کش کردن استفاده بشه
کش کردن یکی از قابلیتهای مفید HTTP هست که میتونه به کاهش تأخیرهای تجربهشده توسط کلاینت، افزایش اطمینانپذیری، و کاهش بار روی سرورهای API کمک کنه. کشها میتونن هر جایی باشن؛ توی شبکهی سرور API، شبکههای تحویل محتوا (CDN)، یا حتی شبکهی کلاینت.
وقتی که یه نمایشی از داده رو ارسال میکنی، باید هدر Cache-Control رو با مقدار max-age (به ثانیه) قرار بدی تا طول عمر تازگی داده رو مشخص کنی. به عنوان مثال:
برای پشتیبانی از کشهای قدیمی HTTP 1.0، API باید هدر Expires رو با یه تاریخ و زمان انقضا قرار بده. این مقدار برابر با زمانی هست که API داده رو تولید کرده به اضافهی طول عمر تازگی داده. همچنین API باید هدر Date رو با تاریخ و زمانی که پاسخ رو برگردونده، بذاره. این هدر کمک میکنه کلاینتها طول عمر تازگی داده رو بهعنوان اختلاف بین مقادیر Expires و Date محاسبه کنن. به عنوان مثال:
⭕️ از هدرهای Cache-Control، Expires و Pragma میشه برای جلوگیری از کش استفاده کرد
اگه پاسخ API نباید کش بشه، باید هدر Cache-Control با مقادیر
⭕️ کش کردن باید تشویق بشه
استفاده از
⭕️ هدرهای کشکردن باید با پاسخهای 200 (“OK”) استفاده بشن
تو پاسخهای موفقیتآمیز GET و HEAD باید هدرهای کشکردن انقضا قرار داده بشن. هرچند روش POST هم قابل کش شدنه، اکثر کشها اون رو به عنوان غیرقابل کش در نظر میگیرن. نیازی نیست این هدرها رو برای متدهای دیگه تنظیم کنی.
⭕️ هدرهای کشکردن میتونن بهصورت اختیاری با پاسخهای 3xx و 4xx استفاده بشن
علاوه بر پاسخهای موفقیتآمیز 200 (“OK”)، میتونی تو پاسخهای 3xx و 4xx هم هدرهای کشکردن اضافه کنی. این کار که بهش کشکردن منفی میگن، کمک میکنه تا بار ریدایرکتها و خطاها روی API کاهش پیدا کنه.
⭕️ از هدرهای HTTP سفارشی نباید برای تغییر رفتار متدهای HTTP استفاده بشه
هدرهای سفارشی رو میشه فقط برای اطلاعرسانی استفاده کرد. کلاینتها و سرورها باید به شکلی پیادهسازی بشن که وقتی هدرهای سفارشی مورد انتظار رو پیدا نمیکنن، دچار خطا نشن.
اگه اطلاعاتی که توی هدر سفارشی قرار میدی برای تفسیر درست درخواست یا پاسخ ضروریه، بهتره اون اطلاعات رو توی بدنه درخواست یا پاسخ، یا توی URI استفاده کنی. از هدرهای سفارشی برای این کاربردها اجتناب کن.
@ninja_learn_ir
اگه API یه نمای جدید از وضعیت منبع رو برگردونه، باید هدرهای Last-Modified و ETag رو با مقادیر بهروزرسانی شده توی پاسخ بذاره.
⭕️ استفاده از Location برای مشخص کردن URI منبع جدید
مقدار هدر Location یه URI هست که منبع جدیدی رو که ممکنه برای کلاینت مهم باشه، شناسایی میکنه. وقتی که API یه منبع جدید رو توی یه مجموعه یا فروشگاه ایجاد میکنه، باید هدر Location رو توی پاسخ قرار بده تا URI منبع جدید رو مشخص کنه.
توی پاسخ 202 ("Accepted")، این هدر میتونه کلاینت رو به وضعیت عملیاتی یه منبع کنترل غیرهمزمان (asynchronous controller) هدایت کنه.
⭕️ از هدرهای Cache-Control، Expires و Date برای کش کردن استفاده بشه
کش کردن یکی از قابلیتهای مفید HTTP هست که میتونه به کاهش تأخیرهای تجربهشده توسط کلاینت، افزایش اطمینانپذیری، و کاهش بار روی سرورهای API کمک کنه. کشها میتونن هر جایی باشن؛ توی شبکهی سرور API، شبکههای تحویل محتوا (CDN)، یا حتی شبکهی کلاینت.
وقتی که یه نمایشی از داده رو ارسال میکنی، باید هدر Cache-Control رو با مقدار max-age (به ثانیه) قرار بدی تا طول عمر تازگی داده رو مشخص کنی. به عنوان مثال:
Cache-Control: max-age=60, must-revalidate
برای پشتیبانی از کشهای قدیمی HTTP 1.0، API باید هدر Expires رو با یه تاریخ و زمان انقضا قرار بده. این مقدار برابر با زمانی هست که API داده رو تولید کرده به اضافهی طول عمر تازگی داده. همچنین API باید هدر Date رو با تاریخ و زمانی که پاسخ رو برگردونده، بذاره. این هدر کمک میکنه کلاینتها طول عمر تازگی داده رو بهعنوان اختلاف بین مقادیر Expires و Date محاسبه کنن. به عنوان مثال:
Date: Tue, 15 Nov 1994 08:12:31 GMT
Expires: Thu, 01 Dec 1994 16:00:00 GMT
⭕️ از هدرهای Cache-Control، Expires و Pragma میشه برای جلوگیری از کش استفاده کرد
اگه پاسخ API نباید کش بشه، باید هدر Cache-Control با مقادیر
no-cache
و no-store
قرار بگیره. برای سازگاری با کشهای قدیمی HTTP 1.0، هدرهای Pragma: no-cache و Expires: 0 هم باید اضافه بشن.⭕️ کش کردن باید تشویق بشه
استفاده از
no-cache
باعث میشه هیچ کشی نتونه پاسخهای کش شده رو ارائه بده. APIهای REST نباید از این دستور استفاده کنن، مگر اینکه واقعاً ضروری باشه. بهجای استفاده از `no-cache`، بهتره مقدار کمی برای max-age تنظیم بشه تا کلاینتها بتونن حداقل برای یه مدت کوتاه از نسخههای کش شده استفاده کنن، بدون اینکه تازگی دادهها به طور قابل توجهی تحت تاثیر قرار بگیره.⭕️ هدرهای کشکردن باید با پاسخهای 200 (“OK”) استفاده بشن
تو پاسخهای موفقیتآمیز GET و HEAD باید هدرهای کشکردن انقضا قرار داده بشن. هرچند روش POST هم قابل کش شدنه، اکثر کشها اون رو به عنوان غیرقابل کش در نظر میگیرن. نیازی نیست این هدرها رو برای متدهای دیگه تنظیم کنی.
⭕️ هدرهای کشکردن میتونن بهصورت اختیاری با پاسخهای 3xx و 4xx استفاده بشن
علاوه بر پاسخهای موفقیتآمیز 200 (“OK”)، میتونی تو پاسخهای 3xx و 4xx هم هدرهای کشکردن اضافه کنی. این کار که بهش کشکردن منفی میگن، کمک میکنه تا بار ریدایرکتها و خطاها روی API کاهش پیدا کنه.
⭕️ از هدرهای HTTP سفارشی نباید برای تغییر رفتار متدهای HTTP استفاده بشه
هدرهای سفارشی رو میشه فقط برای اطلاعرسانی استفاده کرد. کلاینتها و سرورها باید به شکلی پیادهسازی بشن که وقتی هدرهای سفارشی مورد انتظار رو پیدا نمیکنن، دچار خطا نشن.
اگه اطلاعاتی که توی هدر سفارشی قرار میدی برای تفسیر درست درخواست یا پاسخ ضروریه، بهتره اون اطلاعات رو توی بدنه درخواست یا پاسخ، یا توی URI استفاده کنی. از هدرهای سفارشی برای این کاربردها اجتناب کن.
❤6👍1
اگه به عنوان یه برنامه نویس دغدغه و چالش درآمد زایی داری پست جدیدمون رو ببین 😁🤟
https://www.instagram.com/p/DANmAZ5ssWH/?igsh=MWd4MGF4bHZkNjVxMg==
https://www.instagram.com/p/DANmAZ5ssWH/?igsh=MWd4MGF4bHZkNjVxMg==
❤1
🚨 مشکل امنیتی XSS چیه و چطوری جلوی اونو بگیریم؟ 🚨
سلام دوستان! امروز میخوایم درباره یکی از خطرناکترین حملات امنیتی وب یعنی XSS (Cross-Site Scripting) صحبت کنیم. این حمله خیلی وقتها دست کم گرفته میشه، ولی میتونه خیلی از سایتها رو به مشکل بندازه و اطلاعات کاربران رو به خطر بندازه 😱.
حالا XSS چیه؟ 🤔
خب XSS یه نوع حمله امنیتیه که هکرها توش میان و کدهای مخرب جاوااسکریپت رو توی صفحات وب قرار میدن. این کدها معمولاً از طریق فرمها، URLها یا بخشهای ورودی دیگه وارد سایت میشه. وقتی این کدها اجرا بشن، هکر میتونه اطلاعات حساس کاربرها رو بدزده، کوکیها رو سرقت کنه یا حتی کاربر رو به صفحات مخرب ببره 😬.
انواع XSS 🚦
Stored XSS 🗃️
توی این روش، کد مخرب توی دیتابیس سایت ذخیره میشه. هر بار که کاربر صفحهای رو باز میکنه، کد مخرب از دیتابیس خونده میشه و اجرا میشه. این روش خیلی خطرناکه چون ممکنه تعداد زیادی کاربر رو تحت تأثیر قرار بده.
Reflected XSS 🔄
توی این روش، کد مخرب از طریق URL به سرور فرستاده میشه و سرور بدون اینکه فیلترش کنه، اون رو به کاربر برمیگردونه. کاربر هم وقتی URL مخرب رو باز کنه، کد جاوااسکریپت اجرا میشه.
DOM-based XSS 🧩
توی این نوع از حمله، کد مخرب مستقیماً توی سمت کلاینت (مرورگر) تزریق و اجرا میشه، بدون اینکه نیاز باشه سرور دخالتی داشته باشه.
چه خطرهایی داره؟ ⚠️
1️⃣ دزدیدن اطلاعات کاربران:
هکرها میتونن با استفاده از XSS به اطلاعات حساس کاربرها مثل نام کاربری، پسورد و حتی اطلاعات بانکی دسترسی پیدا کنن.
2️⃣ هک کردن سشنها:
هکر میتونه با دزدیدن کوکیهای سشن کاربر، وارد حسابش بشه و از اون سوءاستفاده کنه.
3️⃣ ریدایرکت کردن کاربران به سایتهای مخرب:
با استفاده از کدهای جاوااسکریپت، کاربر رو به صفحاتی ببره که آلوده به بدافزار یا ویروس هستن.
چطور جلوی XSS رو بگیریم؟ 🛡️
1️⃣ فیلتر کردن ورودیهای کاربر:
هر ورودی که از کاربر میگیری، حتماً باید فیلتر و اعتبارسنجی بشه. نذار کاربر بتونه کدهای جاوااسکریپت یا HTML توی فرمها بنویسه.
2️⃣ ؛Encode کردن خروجیها:
حتماً دادههایی که از سرور به کلاینت میفرستی رو Encode کن. این کار جلوی اجرا شدن کدهای مخرب جاوااسکریپت رو میگیره.
3️⃣ استفاده از CSP (Content Security Policy):
با CSP میتونی محدود کنی که کدهای جاوااسکریپت فقط از منابع مطمئن لود بشن و نذاری هکرها کدهای خودشون رو اجرا کنن.
4️⃣ استفاده از کتابخونههای امن:
کتابخونههایی مثل DOMPurify برای فیلتر کردن کدهای HTML و جاوااسکریپت از سمت کاربر خیلی مفیدن.
جمعبندی 🎯
فهمیدیم XSS یکی از خطرناکترین حملات وبه که اگه جلوی اون رو نگیریم، میتونه خسارتهای زیادی به امنیت سایت بزنه. با فیلتر کردن ورودیها، Encode کردن خروجیها و استفاده از سیاستهای امنیتی مثل CSP میتونیم جلوی این نوع حملات رو بگیریم. پس حتماً حواست به امنیت اپلیکیشنت باشه! 😎
امید وارم مفید بود باشه :)
#xss #امنیت
@ninja_learn_ir
سلام دوستان! امروز میخوایم درباره یکی از خطرناکترین حملات امنیتی وب یعنی XSS (Cross-Site Scripting) صحبت کنیم. این حمله خیلی وقتها دست کم گرفته میشه، ولی میتونه خیلی از سایتها رو به مشکل بندازه و اطلاعات کاربران رو به خطر بندازه 😱.
حالا XSS چیه؟ 🤔
خب XSS یه نوع حمله امنیتیه که هکرها توش میان و کدهای مخرب جاوااسکریپت رو توی صفحات وب قرار میدن. این کدها معمولاً از طریق فرمها، URLها یا بخشهای ورودی دیگه وارد سایت میشه. وقتی این کدها اجرا بشن، هکر میتونه اطلاعات حساس کاربرها رو بدزده، کوکیها رو سرقت کنه یا حتی کاربر رو به صفحات مخرب ببره 😬.
انواع XSS 🚦
Stored XSS 🗃️
توی این روش، کد مخرب توی دیتابیس سایت ذخیره میشه. هر بار که کاربر صفحهای رو باز میکنه، کد مخرب از دیتابیس خونده میشه و اجرا میشه. این روش خیلی خطرناکه چون ممکنه تعداد زیادی کاربر رو تحت تأثیر قرار بده.
Reflected XSS 🔄
توی این روش، کد مخرب از طریق URL به سرور فرستاده میشه و سرور بدون اینکه فیلترش کنه، اون رو به کاربر برمیگردونه. کاربر هم وقتی URL مخرب رو باز کنه، کد جاوااسکریپت اجرا میشه.
DOM-based XSS 🧩
توی این نوع از حمله، کد مخرب مستقیماً توی سمت کلاینت (مرورگر) تزریق و اجرا میشه، بدون اینکه نیاز باشه سرور دخالتی داشته باشه.
چه خطرهایی داره؟ ⚠️
1️⃣ دزدیدن اطلاعات کاربران:
هکرها میتونن با استفاده از XSS به اطلاعات حساس کاربرها مثل نام کاربری، پسورد و حتی اطلاعات بانکی دسترسی پیدا کنن.
2️⃣ هک کردن سشنها:
هکر میتونه با دزدیدن کوکیهای سشن کاربر، وارد حسابش بشه و از اون سوءاستفاده کنه.
3️⃣ ریدایرکت کردن کاربران به سایتهای مخرب:
با استفاده از کدهای جاوااسکریپت، کاربر رو به صفحاتی ببره که آلوده به بدافزار یا ویروس هستن.
چطور جلوی XSS رو بگیریم؟ 🛡️
1️⃣ فیلتر کردن ورودیهای کاربر:
هر ورودی که از کاربر میگیری، حتماً باید فیلتر و اعتبارسنجی بشه. نذار کاربر بتونه کدهای جاوااسکریپت یا HTML توی فرمها بنویسه.
2️⃣ ؛Encode کردن خروجیها:
حتماً دادههایی که از سرور به کلاینت میفرستی رو Encode کن. این کار جلوی اجرا شدن کدهای مخرب جاوااسکریپت رو میگیره.
3️⃣ استفاده از CSP (Content Security Policy):
با CSP میتونی محدود کنی که کدهای جاوااسکریپت فقط از منابع مطمئن لود بشن و نذاری هکرها کدهای خودشون رو اجرا کنن.
4️⃣ استفاده از کتابخونههای امن:
کتابخونههایی مثل DOMPurify برای فیلتر کردن کدهای HTML و جاوااسکریپت از سمت کاربر خیلی مفیدن.
جمعبندی 🎯
فهمیدیم XSS یکی از خطرناکترین حملات وبه که اگه جلوی اون رو نگیریم، میتونه خسارتهای زیادی به امنیت سایت بزنه. با فیلتر کردن ورودیها، Encode کردن خروجیها و استفاده از سیاستهای امنیتی مثل CSP میتونیم جلوی این نوع حملات رو بگیریم. پس حتماً حواست به امنیت اپلیکیشنت باشه! 😎
👍5❤1
توی پست جدیدمون داکر رو معرفی کردیم، یه سر بهش بزنید 🌹
https://www.instagram.com/p/DAQGDXQIRcI/?igsh=NHd2czUxYmF5azZ4
https://www.instagram.com/p/DAQGDXQIRcI/?igsh=NHd2czUxYmF5azZ4
❤2
🌳 همهچی درباره B-Tree توی دیتابیسهای رابطهای 🌳
امروز میخوایم درباره B-Tree توی دیتابیسهای رابطهای صحبت کنیم. اگه تا حالا با دیتابیسهای مثل MySQL یا PostgreSQL کار کرده باشی، احتمالاً اسم B-Tree به گوشت خورده. B-Tree یکی از مهمترین ساختارهای داده توی دیتابیسهاست که برای ایندکس کردن و جستجوی سریع دادهها استفاده میشه 📈.
حالا B-Tree چیه؟ 🌳
خب B-Tree یه ساختار درختی (tree structure) هست که توی ایندکسهای دیتابیس استفاده میشه. این درخت بهصورت بالانس طراحی شده، یعنی همه شاخهها از ریشه تا برگها تقریباً به یه اندازه طول دارن. این باعث میشه عملیات جستجو، درج، حذف و بهروزرسانی دادهها با سرعت بالایی انجام بشه 🚀.
توی B-Tree، هر گره (node) میتونه چندین کلید (key) و فرزند (child) داشته باشه. این یعنی برخلاف درختهای دودویی معمولی که هر گره فقط ۲ فرزند داره، توی B-Tree هر گره میتونه چند فرزند و کلید داشته باشه. این باعث میشه که عمق درخت کم بشه و دسترسی به دادهها سریعتر باشه.
چرا B-Tree توی دیتابیسها استفاده میشه؟ 🤔
1⃣ سرعت بالای جستجو 🔍
یکی از مزیتهای بزرگ B-Tree اینه که جستجو توی اون خیلی سریع انجام میشه. چون این درخت بهصورت متوازن طراحی شده، عمق زیادی نداره و سریع میشه به دادهها رسید.
2⃣ مناسب برای عملیات درج و حذف ➕➖
خب B-Tree نهتنها برای جستجو عالیه، بلکه برای درج و حذف دادهها هم خیلی بهینه است. وقتی یه داده جدید رو وارد میکنی یا دادهای رو حذف میکنی، درخت همچنان بالانس خودش رو حفظ میکنه و کارایی رو پایین نمیاره.
3. مقیاسپذیری 📏
دیتابیسهایی مثل MySQL و PostgreSQL برای اینکه بتونن حجم زیادی از دادهها رو مدیریت کنن، از B-Tree استفاده میکنن. این ساختار داده بهخاطر توانایی مدیریت تعداد زیادی از کلیدها و گرهها، مقیاسپذیری خوبی داره.
چطوری B-Tree کار میکنه؟ ⚙️
فرض کن یه جدول توی دیتابیس داری که میخوای ازش بهسرعت دادههایی رو پیدا کنی. اگه این جدول بزرگ باشه، جستجوی خطی خیلی طول میکشه. اینجاست که ایندکس به کمک میاد! وقتی یه ایندکس میسازی، دیتابیس از B-Tree برای ذخیره کردن اون ایندکس استفاده میکنه.
مثلاً اگه یه کوئری مثل این داشته باشی:
اگه روی ستون
تفاوت B-Tree و B+Tree چیه؟ 🤨
خیلی از دیتابیسهای مدرن از نسخهای به نام B+Tree استفاده میکنن. فرق B+Tree اینه که همه دادهها فقط توی برگها (leaf nodes) ذخیره میشن و گرههای میانی فقط برای جستجو استفاده میشن. این باعث میشه که دسترسی به دادهها سریعتر بشه، چون برگها بهصورت مرتب ذخیره شدن و بهراحتی میشه بین اونها پیمایش کرد.
چطوری ایندکس B-Tree بسازیم؟ 🛠️
ساختن ایندکس B-Tree توی دیتابیس خیلی ساده است. مثلاً توی MySQL میتونی اینجوری یه ایندکس روی ستون
با این کار، دیتابیس یه index برای ستون
جمعبندی 🎯
فهمیدیم B-Tree یه ساختار داده عالی برای مدیریت ایندکسها توی دیتابیسهای رابطهایه. سرعت بالای جستجو، درج و حذف دادهها، و مقیاسپذیری بالا از ویژگیهای خوبشه. با اینکه B-Tree یه ساختار پیچیدهست، ولی خیلی از دیتابیسهای معروف مثل MySQL و PostgreSQL از اون استفاده میکنن تا کارایی کوئریها رو بهینه کنن.
امیدوارم مفید بوده باشه :)
@ninja_learn_ir
امروز میخوایم درباره B-Tree توی دیتابیسهای رابطهای صحبت کنیم. اگه تا حالا با دیتابیسهای مثل MySQL یا PostgreSQL کار کرده باشی، احتمالاً اسم B-Tree به گوشت خورده. B-Tree یکی از مهمترین ساختارهای داده توی دیتابیسهاست که برای ایندکس کردن و جستجوی سریع دادهها استفاده میشه 📈.
حالا B-Tree چیه؟ 🌳
خب B-Tree یه ساختار درختی (tree structure) هست که توی ایندکسهای دیتابیس استفاده میشه. این درخت بهصورت بالانس طراحی شده، یعنی همه شاخهها از ریشه تا برگها تقریباً به یه اندازه طول دارن. این باعث میشه عملیات جستجو، درج، حذف و بهروزرسانی دادهها با سرعت بالایی انجام بشه 🚀.
توی B-Tree، هر گره (node) میتونه چندین کلید (key) و فرزند (child) داشته باشه. این یعنی برخلاف درختهای دودویی معمولی که هر گره فقط ۲ فرزند داره، توی B-Tree هر گره میتونه چند فرزند و کلید داشته باشه. این باعث میشه که عمق درخت کم بشه و دسترسی به دادهها سریعتر باشه.
چرا B-Tree توی دیتابیسها استفاده میشه؟ 🤔
1⃣ سرعت بالای جستجو 🔍
یکی از مزیتهای بزرگ B-Tree اینه که جستجو توی اون خیلی سریع انجام میشه. چون این درخت بهصورت متوازن طراحی شده، عمق زیادی نداره و سریع میشه به دادهها رسید.
2⃣ مناسب برای عملیات درج و حذف ➕➖
خب B-Tree نهتنها برای جستجو عالیه، بلکه برای درج و حذف دادهها هم خیلی بهینه است. وقتی یه داده جدید رو وارد میکنی یا دادهای رو حذف میکنی، درخت همچنان بالانس خودش رو حفظ میکنه و کارایی رو پایین نمیاره.
3. مقیاسپذیری 📏
دیتابیسهایی مثل MySQL و PostgreSQL برای اینکه بتونن حجم زیادی از دادهها رو مدیریت کنن، از B-Tree استفاده میکنن. این ساختار داده بهخاطر توانایی مدیریت تعداد زیادی از کلیدها و گرهها، مقیاسپذیری خوبی داره.
چطوری B-Tree کار میکنه؟ ⚙️
فرض کن یه جدول توی دیتابیس داری که میخوای ازش بهسرعت دادههایی رو پیدا کنی. اگه این جدول بزرگ باشه، جستجوی خطی خیلی طول میکشه. اینجاست که ایندکس به کمک میاد! وقتی یه ایندکس میسازی، دیتابیس از B-Tree برای ذخیره کردن اون ایندکس استفاده میکنه.
مثلاً اگه یه کوئری مثل این داشته باشی:
SELECT * FROM users WHERE id = 123;
اگه روی ستون
id
ایندکس ساخته باشی، دیتابیس از B-Tree برای پیدا کردن رکورد مورد نظر استفاده میکنه و این کار خیلی سریع انجام میشه.تفاوت B-Tree و B+Tree چیه؟ 🤨
خیلی از دیتابیسهای مدرن از نسخهای به نام B+Tree استفاده میکنن. فرق B+Tree اینه که همه دادهها فقط توی برگها (leaf nodes) ذخیره میشن و گرههای میانی فقط برای جستجو استفاده میشن. این باعث میشه که دسترسی به دادهها سریعتر بشه، چون برگها بهصورت مرتب ذخیره شدن و بهراحتی میشه بین اونها پیمایش کرد.
چطوری ایندکس B-Tree بسازیم؟ 🛠️
ساختن ایندکس B-Tree توی دیتابیس خیلی ساده است. مثلاً توی MySQL میتونی اینجوری یه ایندکس روی ستون
id
بسازی:CREATE INDEX idx_id ON users (id);
با این کار، دیتابیس یه index برای ستون
id
میسازه و از این به بعد جستجوها خیلی سریعتر میشن.جمعبندی 🎯
فهمیدیم B-Tree یه ساختار داده عالی برای مدیریت ایندکسها توی دیتابیسهای رابطهایه. سرعت بالای جستجو، درج و حذف دادهها، و مقیاسپذیری بالا از ویژگیهای خوبشه. با اینکه B-Tree یه ساختار پیچیدهست، ولی خیلی از دیتابیسهای معروف مثل MySQL و PostgreSQL از اون استفاده میکنن تا کارایی کوئریها رو بهینه کنن.
#db #btree #bptree
❤4
یه آمار بگیریم ببینیم دوستان چیکاره هستن 😄
لطفا همه شرکت کنن، بهمون برای تولید محتوای بهتر و مناسب تر کمک میکنه ❤
لطفا همه شرکت کنن، بهمون برای تولید محتوای بهتر و مناسب تر کمک میکنه ❤
Anonymous Poll
7%
فرانت کارم
73%
بک اند کارم (Django)
5%
بک اند کارم (Node.js)
15%
سایر
❤3
یه مساله رو لازم دونستم بهتون بگم دوستان
فرقی نمیکنه شما حوزه کاریتون چی باشه و توی کدوم زبان و فریمورک متخصص باشید
اگه تخصص خوبی داشته باشید و مهارت فنی تون خوب باشه همیشه و همه جا کار هست
حتی اگه برنامه نویس زبان منسوخ شده ای مثل Cobol باشید
درسته بازار کار یه سری زبان و فریمورک نسبت به بقیه بهتره ولی خب در عوض رقابت توی اون زبان و فریمورک بیشتر و سخت تره
مثلا میگم، الان جوّ جوری شده که هر کسی میخواد فرانت یاد بگیره میره سمت React و Next.js چون بازار کارشون نسبت به بقیه فریمورکا عالیه، ولی در عوض رقابت توی این استک خیلی سخته چون همه React کار هستن
این قضیه برای بک اند هم صدق میکنه
به جای تمرکز روی بازار کار روی مهارت و تخصصتون تمرکز کنید
بازار کار دائما در حال تغییره و کسی نمیدونه چند سال دیگه چه زبان یا فریمورکی قراره بیاد که توی بازار کار از بقیه جلو بزنه
پیروز و موفق باشید 🌹
فرقی نمیکنه شما حوزه کاریتون چی باشه و توی کدوم زبان و فریمورک متخصص باشید
اگه تخصص خوبی داشته باشید و مهارت فنی تون خوب باشه همیشه و همه جا کار هست
حتی اگه برنامه نویس زبان منسوخ شده ای مثل Cobol باشید
درسته بازار کار یه سری زبان و فریمورک نسبت به بقیه بهتره ولی خب در عوض رقابت توی اون زبان و فریمورک بیشتر و سخت تره
مثلا میگم، الان جوّ جوری شده که هر کسی میخواد فرانت یاد بگیره میره سمت React و Next.js چون بازار کارشون نسبت به بقیه فریمورکا عالیه، ولی در عوض رقابت توی این استک خیلی سخته چون همه React کار هستن
این قضیه برای بک اند هم صدق میکنه
به جای تمرکز روی بازار کار روی مهارت و تخصصتون تمرکز کنید
بازار کار دائما در حال تغییره و کسی نمیدونه چند سال دیگه چه زبان یا فریمورکی قراره بیاد که توی بازار کار از بقیه جلو بزنه
پیروز و موفق باشید 🌹
❤10👍6
https://t.iss.one/+td1EcO_YfSphNTlk
دوستان این لینک گروهه میتونید توش جوین شید و چت بکنید و سوالاتونو بپرسید یا ... هرکار دیگه ای
دوستان این لینک گروهه میتونید توش جوین شید و چت بکنید و سوالاتونو بپرسید یا ... هرکار دیگه ای
Telegram
Programmers City 🌆
گروه نینجا لرن🥷
🌐 channel link : https://t.iss.one/ninja_learn_ir
👥 Group link: https://t.iss.one/+td1EcO_YfSphNTlk
⚠️ Rules: https://t.iss.one/programmers_city_rules
🌐 channel link : https://t.iss.one/ninja_learn_ir
👥 Group link: https://t.iss.one/+td1EcO_YfSphNTlk
⚠️ Rules: https://t.iss.one/programmers_city_rules
❤1
توی پست جدیدمون چند تا سایت استخدامی برای برنامه نویسا معرفی کردیم، از دستش ندید 😁🌹
https://www.instagram.com/p/DASs2RssumQ/?igsh=MTJjNHg5MjBtZjMxdA==
https://www.instagram.com/p/DASs2RssumQ/?igsh=MTJjNHg5MjBtZjMxdA==
❤4
💡 فعال کردن قابلیت Auto Import توی VSCode 💡
امروز میخوایم درباره یه قابلیت جذاب توی VSCode حرف بزنیم که به شدت میتونه تو کدنویسی وقتت رو ذخیره کنه: Auto Import! 🚀
حالا Auto Import چیه؟ 🤔
فرض کن داری یه کد مینویسی و میخوای از یه ماژول یا پکیج استفاده کنی که هنوز import نشده. اینجاست که Auto Import میاد وسط و به صورت خودکار این کار رو برات انجام میده. بدون نیاز به اینکه دستی بری بالا توی فایل import کنی، خودش میفهمه چی نیاز داری و اضافهش میکنه! 👌
چطوری فعالش کنیم؟ ⚙️
برای فعال کردن این قابلیت توی VSCode، کار خیلی سادهست:
1⃣ اول از همه، از منوی File برو به Preferences و بعد Settings 📑
2⃣ توی کادر جستجو Auto Import رو سرچ کن 🕵️♂️
3⃣ بعدش توی بخش Typescript یا Javascript (بسته به زبون کد نویسیت) گزینه "Auto Import" رو فعال کن ✅
حالا VSCode هر وقت لازم باشه بهت پیشنهاد میده که import رو خودکار انجام بده.
یه نکته باحال 🤓
این قابلیت توی زبونهای TypeScript و JavaScript خیلی خوب کار میکنه ولی برای بقیه زبونها مثل Python یا C# هم پلاگینهای مشابهی هست. میتونی با نصب اکستنشنهای مربوط به اون زبون، از این قابلیت توشون استفاده کنی. یه اکستنشن معروف برای Python، همون پلاگین Python اصلیه که Auto Import رو هم ساپورت میکنه 🐍.
چطوری از Auto Import استفاده کنیم؟ 🚀
وقتی این قابلیت فعال شد، کافیه که اسم کلاس، فانکشن یا ماژولی که میخوای استفاده کنی رو بنویسی، VSCode خودش پیشنهاد import رو بهت میده و میتونی با یه دکمه Tab یا Enter قبولش کنی. بزن بریم! ⚡
چرا Auto Import خیلی خفنه؟ 💥
- صرفهجویی در زمان ⏳: دیگه لازم نیست دستی import کنی و هی بگردی ببینی چی رو باید اضافه کنی.
- جلوگیری از خطاها 🚫: اگه چیزی رو یادت بره import کنی، این قابلیت بهت یادآوری میکنه.
- افزایش سرعت کدنویسی 🏎️: سریعتر و بهینهتر کد مینویسی و همه چی سر جاشه.
همین حالا Auto Import رو فعال کن و از این قابلیت خفن استفاده کن👨💻💥
امید وارم مفید بوده باشه :)
@ninja_learn_ir
امروز میخوایم درباره یه قابلیت جذاب توی VSCode حرف بزنیم که به شدت میتونه تو کدنویسی وقتت رو ذخیره کنه: Auto Import! 🚀
حالا Auto Import چیه؟ 🤔
فرض کن داری یه کد مینویسی و میخوای از یه ماژول یا پکیج استفاده کنی که هنوز import نشده. اینجاست که Auto Import میاد وسط و به صورت خودکار این کار رو برات انجام میده. بدون نیاز به اینکه دستی بری بالا توی فایل import کنی، خودش میفهمه چی نیاز داری و اضافهش میکنه! 👌
چطوری فعالش کنیم؟ ⚙️
برای فعال کردن این قابلیت توی VSCode، کار خیلی سادهست:
1⃣ اول از همه، از منوی File برو به Preferences و بعد Settings 📑
2⃣ توی کادر جستجو Auto Import رو سرچ کن 🕵️♂️
3⃣ بعدش توی بخش Typescript یا Javascript (بسته به زبون کد نویسیت) گزینه "Auto Import" رو فعال کن ✅
حالا VSCode هر وقت لازم باشه بهت پیشنهاد میده که import رو خودکار انجام بده.
یه نکته باحال 🤓
این قابلیت توی زبونهای TypeScript و JavaScript خیلی خوب کار میکنه ولی برای بقیه زبونها مثل Python یا C# هم پلاگینهای مشابهی هست. میتونی با نصب اکستنشنهای مربوط به اون زبون، از این قابلیت توشون استفاده کنی. یه اکستنشن معروف برای Python، همون پلاگین Python اصلیه که Auto Import رو هم ساپورت میکنه 🐍.
چطوری از Auto Import استفاده کنیم؟ 🚀
وقتی این قابلیت فعال شد، کافیه که اسم کلاس، فانکشن یا ماژولی که میخوای استفاده کنی رو بنویسی، VSCode خودش پیشنهاد import رو بهت میده و میتونی با یه دکمه Tab یا Enter قبولش کنی. بزن بریم! ⚡
چرا Auto Import خیلی خفنه؟ 💥
- صرفهجویی در زمان ⏳: دیگه لازم نیست دستی import کنی و هی بگردی ببینی چی رو باید اضافه کنی.
- جلوگیری از خطاها 🚫: اگه چیزی رو یادت بره import کنی، این قابلیت بهت یادآوری میکنه.
- افزایش سرعت کدنویسی 🏎️: سریعتر و بهینهتر کد مینویسی و همه چی سر جاشه.
همین حالا Auto Import رو فعال کن و از این قابلیت خفن استفاده کن👨💻💥
#vscode #tric
👍8❤2🔥1
Ninja Learn | نینجا لرن
۶۰۰ تایی شدیم 😳
This media is not supported in your browser
VIEW IN TELEGRAM
❤🔥4
💎 شروع کار با Node.js 💎
اگه تازه میخوای یادگیری Node.js رو شروع کنی، بهتره از یه مسیر ساده و کاربردی شروع کنی.
نود برای اجرای جاوااسکریپت سمت سرور استفاده میشه و بهت این امکان رو میده که اپلیکیشنهای تحت وب، APIها، و حتی برنامههای چت یا استریمینگ بسازی.
1⃣ قدم اول: نصب Node.js
اولین قدم اینه که Node.js رو نصب کنی. برو به سایت رسمی Node.js و نسخهای که به سیستمت میخوره رو دانلود کن. وقتی نصب شد، میتونی با زدن دستور زیر توی ترمینال مطمئن شی که درست نصب شده:
با این دستور نسخه Node.js نمایش داده میشه و میفهمی که همه چیز درسته.
2⃣ قدم دوم: آشنایی با npm
یکی از ابزارهای کلیدی که با Node.js میاد، npm یا همون Node Package Manager هست. با npm میتونی به راحتی کتابخونهها و بستههای مورد نیاز پروژهت رو نصب کنی. برای مثال، اگه بخوای یه کتابخونه مثل Express رو نصب کنی که خیلی معروفه برای ساخت وبسرورها، از این دستور استفاده میکنی:
3⃣ قدم سوم: ساخت اولین پروژه
حالا بیا یه پروژه ساده رو با هم بسازیم. اول یه پوشه جدید ایجاد کن و واردش شو:
حالا یه فایل به اسم
این کد یه سرور ساده میسازه که وقتی توی مرورگر
4⃣ قدم چهارم: اجرای پروژه
حالا برای اینکه سرورت رو اجرا کنی، توی همون پوشهای که فایل
اگه همه چیز درست باشه، پیغام
5⃣ قدم بعدی: آشنایی با فریمورکها
بعد از اینکه به Node.js عادت کردی، خوبه با فریمورکهایی مثل Express آشنا بشی که کار ساخت وبسرور و API رو برات خیلی راحتتر میکنه. با Express میتونی راحت مسیرها (routes)، میدلور (middleware)، و مدیریت درخواستها رو پیادهسازی کنی. مثلاً کد بالا رو با Express میتونی خیلی سادهتر بنویسی:
🧑🏫 یادگیری مستمر
پیشنهاد میکنم حتماً روی پروژههای کوچیک و ساده کار کنی تا مفاهیم برات جا بیفته. یه نکته دیگه اینکه، منابع آموزشی رایگان زیادی برای یادگیری Node.js هست مثل:
- سایت رسمی Node.js
- مستندات Express
- آموزشهای یوتیوب و دورههای آنلاین.
هر سوالی داشتی، اینجا هستم که کمک کنم! :)
@ninja_learn_ir
اگه تازه میخوای یادگیری Node.js رو شروع کنی، بهتره از یه مسیر ساده و کاربردی شروع کنی.
نود برای اجرای جاوااسکریپت سمت سرور استفاده میشه و بهت این امکان رو میده که اپلیکیشنهای تحت وب، APIها، و حتی برنامههای چت یا استریمینگ بسازی.
1⃣ قدم اول: نصب Node.js
اولین قدم اینه که Node.js رو نصب کنی. برو به سایت رسمی Node.js و نسخهای که به سیستمت میخوره رو دانلود کن. وقتی نصب شد، میتونی با زدن دستور زیر توی ترمینال مطمئن شی که درست نصب شده:
node -v
با این دستور نسخه Node.js نمایش داده میشه و میفهمی که همه چیز درسته.
2⃣ قدم دوم: آشنایی با npm
یکی از ابزارهای کلیدی که با Node.js میاد، npm یا همون Node Package Manager هست. با npm میتونی به راحتی کتابخونهها و بستههای مورد نیاز پروژهت رو نصب کنی. برای مثال، اگه بخوای یه کتابخونه مثل Express رو نصب کنی که خیلی معروفه برای ساخت وبسرورها، از این دستور استفاده میکنی:
npm install express
3⃣ قدم سوم: ساخت اولین پروژه
حالا بیا یه پروژه ساده رو با هم بسازیم. اول یه پوشه جدید ایجاد کن و واردش شو:
mkdir my-first-node-app
cd my-first-node-app
حالا یه فایل به اسم
app.js
بساز و کد زیر رو توش بنویس:const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(3000, () => {
console.log('Server running at https://localhost:3000/');
});
این کد یه سرور ساده میسازه که وقتی توی مرورگر
https://localhost:3000
رو باز کنی، عبارت "Hello World" رو بهت نشون میده.4⃣ قدم چهارم: اجرای پروژه
حالا برای اینکه سرورت رو اجرا کنی، توی همون پوشهای که فایل
app.js
هست دستور زیر رو بزن:node app.js
اگه همه چیز درست باشه، پیغام
Server running at https://localhost:3000/
توی ترمینال نمایش داده میشه. حالا میتونی مرورگرت رو باز کنی و این آدرس رو وارد کنی تا نتیجه رو ببینی.5⃣ قدم بعدی: آشنایی با فریمورکها
بعد از اینکه به Node.js عادت کردی، خوبه با فریمورکهایی مثل Express آشنا بشی که کار ساخت وبسرور و API رو برات خیلی راحتتر میکنه. با Express میتونی راحت مسیرها (routes)، میدلور (middleware)، و مدیریت درخواستها رو پیادهسازی کنی. مثلاً کد بالا رو با Express میتونی خیلی سادهتر بنویسی:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World');
});
app.listen(3000, () => {
console.log('Server running on https://localhost:3000');
});
🧑🏫 یادگیری مستمر
پیشنهاد میکنم حتماً روی پروژههای کوچیک و ساده کار کنی تا مفاهیم برات جا بیفته. یه نکته دیگه اینکه، منابع آموزشی رایگان زیادی برای یادگیری Node.js هست مثل:
- سایت رسمی Node.js
- مستندات Express
- آموزشهای یوتیوب و دورههای آنلاین.
هر سوالی داشتی، اینجا هستم که کمک کنم! :)
@ninja_learn_ir
❤8
پیشنهادی برای بهتر شدن کانال داری؟ 🧐
خیلی خوشحال میشم که تو کامنتا بهمون بگی ☺️❤️
خیلی خوشحال میشم که تو کامنتا بهمون بگی ☺️❤️
🔥4❤1
💎 استفاده از PostgreSQL با Django 💎
امروز میخوایم درباره PostgreSQL و اینکه چرا این دیتابیس رابطهای با Django فوقالعاده مچ میشه، صحبت کنیم. همچنین چندتا از فیچرهای خاصی که جنگو برای این دیتابیس داره رو معرفی میکنیم
چرا PostgreSQL؟ 🤔
خب PostgreSQL یه دیتابیس رابطهای قدرتمنده که خیلیها بهش میگن "Postgres". این دیتابیس اوپن سورس، خیلی خوب با Django هماهنگ میشه و خیلی امکانات و قابلیتهای پیشرفتهای رو ارائه میده که وقتی با جنگو کار میکنی حسابی به درد میخوره. از جمله پشتیبانی از JSONB، قفلهای پیچیده، پارتیشنبندی دادهها و ... 😍
چطوری از PostgreSQL توی Django استفاده کنیم؟ 🛠️
1⃣ اول از همه، باید مطمئن شی که PostgreSQL رو نصب داری.
2⃣ بعدش توی پروژه جنگویی، توی فایل settings.py باید دیتابیس رو به Postgres وصل کنی. یه همچین چیزی:
فیچرهای خاص Django برای PostgreSQL 📦
1⃣ مدلهای JSONField 📄
با استفاده از Postgres توی Django، میتونی از فیلد JSONField استفاده کنی. این فیلد بهت اجازه میده که دادههای JSON رو بهراحتی توی دیتابیس ذخیره کنی و بعداً کوئریهای خفن روشون بزنی! دیگه نیازی نیست همیشه ساختار دادهت فقط رابطهای باشه.
2⃣ فیلد ArrayField 🔢
اگه یه لیست یا آرایه داری و میخوای اون رو مستقیم توی دیتابیس ذخیره کنی، ArrayField بهترین انتخابه. با این فیلد، میتونی یه لیست از مقادیر (مثلاً یه سری عدد یا استرینگ) رو توی یه ستون ذخیره کنی.
خب HStore یه قابلیت خاص توی Postgresه که بهت اجازه میده دادههای کلید-مقدار (key-value) رو توی دیتابیس ذخیره کنی. Django از این فیلد پشتیبانی میکنه و باهاش میتونی دادههایی شبیه به دیکشنری رو ذخیره کنی.
این فیلد بهت اجازه میده که رِنجها رو توی دیتابیس ذخیره کنی. مثلاً میخوای یه بازه تاریخی یا عددی رو نگهداری، این فیلد دقیقاً به درد همون کار میخوره.
خب Postgres قابلیت جستجوی متنی پیشرفته داره و Django هم از این قابلیت پشتیبانی میکنه. با استفاده از این فیچر میتونی بهصورت سریع و بهینه توی متنها جستجو کنی.
استفاده از PostgreSQL توی Django یه انتخاب خیلی خوبه، چون هم دیتابیس قویایه و هم فیچرهای اختصاصی زیادی برای جنگو داره که میتونه کارتو سریعتر و راحتتر کنه. از ذخیره JSON گرفته تا جستجوی متنی، Postgres و Django یه ترکیب طلایین
امیدوارم مفید بوده باشه :)
@ninja_learn_ir
امروز میخوایم درباره PostgreSQL و اینکه چرا این دیتابیس رابطهای با Django فوقالعاده مچ میشه، صحبت کنیم. همچنین چندتا از فیچرهای خاصی که جنگو برای این دیتابیس داره رو معرفی میکنیم
چرا PostgreSQL؟ 🤔
خب PostgreSQL یه دیتابیس رابطهای قدرتمنده که خیلیها بهش میگن "Postgres". این دیتابیس اوپن سورس، خیلی خوب با Django هماهنگ میشه و خیلی امکانات و قابلیتهای پیشرفتهای رو ارائه میده که وقتی با جنگو کار میکنی حسابی به درد میخوره. از جمله پشتیبانی از JSONB، قفلهای پیچیده، پارتیشنبندی دادهها و ... 😍
چطوری از PostgreSQL توی Django استفاده کنیم؟ 🛠️
1⃣ اول از همه، باید مطمئن شی که PostgreSQL رو نصب داری.
2⃣ بعدش توی پروژه جنگویی، توی فایل settings.py باید دیتابیس رو به Postgres وصل کنی. یه همچین چیزی:
DATABASES = {حالا میتونی از قابلیتهای خفن Postgres استفاده کنی و دیتابیس پروژهت رو به یه سطح بالاتر ببری! 🚀
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_db_name',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'localhost',
'PORT': '5432',
}
}
فیچرهای خاص Django برای PostgreSQL 📦
1⃣ مدلهای JSONField 📄
با استفاده از Postgres توی Django، میتونی از فیلد JSONField استفاده کنی. این فیلد بهت اجازه میده که دادههای JSON رو بهراحتی توی دیتابیس ذخیره کنی و بعداً کوئریهای خفن روشون بزنی! دیگه نیازی نیست همیشه ساختار دادهت فقط رابطهای باشه.
from django.db import models
class MyModel(models.Model):
data = models.JSONField()
2⃣ فیلد ArrayField 🔢
اگه یه لیست یا آرایه داری و میخوای اون رو مستقیم توی دیتابیس ذخیره کنی، ArrayField بهترین انتخابه. با این فیلد، میتونی یه لیست از مقادیر (مثلاً یه سری عدد یا استرینگ) رو توی یه ستون ذخیره کنی.
from django.contrib.postgres.fields import ArrayField3⃣ فیلد HStore 🗂️
from django.db import models
class MyModel(models.Model):
tags = ArrayField(models.CharField(max_length=100), blank=True)
خب HStore یه قابلیت خاص توی Postgresه که بهت اجازه میده دادههای کلید-مقدار (key-value) رو توی دیتابیس ذخیره کنی. Django از این فیلد پشتیبانی میکنه و باهاش میتونی دادههایی شبیه به دیکشنری رو ذخیره کنی.
from django.contrib.postgres.fields import HStoreField4⃣ فیلد Range 📏
from django.db import models
class MyModel(models.Model):
attributes = HStoreField()
این فیلد بهت اجازه میده که رِنجها رو توی دیتابیس ذخیره کنی. مثلاً میخوای یه بازه تاریخی یا عددی رو نگهداری، این فیلد دقیقاً به درد همون کار میخوره.
from django.contrib.postgres.fields import DateRangeField5⃣ و در اخر Full-Text Search 🔍
from django.db import models
class MyModel(models.Model):
date_range = DateRangeField()
خب Postgres قابلیت جستجوی متنی پیشرفته داره و Django هم از این قابلیت پشتیبانی میکنه. با استفاده از این فیچر میتونی بهصورت سریع و بهینه توی متنها جستجو کنی.
from django.contrib.postgres.search import SearchVectorجمعبندی 🎯
from .models import MyModel
MyModel.objects.annotate(search=SearchVector('title', 'description')).filter(search='keyword')
استفاده از PostgreSQL توی Django یه انتخاب خیلی خوبه، چون هم دیتابیس قویایه و هم فیچرهای اختصاصی زیادی برای جنگو داره که میتونه کارتو سریعتر و راحتتر کنه. از ذخیره JSON گرفته تا جستجوی متنی، Postgres و Django یه ترکیب طلایین
#django #postgressql #postgres
🔥12❤5
🚀 معرفی رورس پروکسی Traefik 🚀
امروز میخوایم درباره Traefik صحبت کنیم، یه رورس پروکسی هست و خیلی کارآمد که مخصوصاً برای مدیریت ترافیک توی اپلیکیشنهای میکروسرویس طراحی شده.
حالا Traefik چیه؟ 🤔
خب Traefik یه reverse proxy و load balancer قویه که به راحتی میتونه ترافیک رو بین چندین سرویس توی یه کلاستر مدیریت کنه. یکی از ویژگیهای جالبش اینه که به راحتی میتونی با Docker، Kubernetes و دیگر ابزارهای مدیریت کانتینر کار کنی.
چرا باید از Traefik استفاده کنیم؟ 💡
1⃣ پیکربندی آسان: Traefik به راحتی با فایلهای پیکربندی یا بر اساس برچسبهای Docker پیکربندی میشه و نیازی به تنظیمات پیچیده نداره.
2⃣؛ TLS خودکار: Traefik به راحتی میتونه SSL رو مدیریت کنه و برای هر دامنه، گواهینامه Let’s Encrypt رو به صورت خودکار بگیره. دیگه نیازی به نگرانی درباره امنیت نیست 🔒
3⃣ داشبورد کاربرپسند: یه داشبورد خیلی قشنگ داره که میتونی وضعیت سرویسها و ترافیک رو ببینی.
این داشبورد بهت کمک میکنه تا بفهمی چه اتفاقی داره میافته. 📊
4⃣ پشتیبانی از پروتکلهای مختلف: Traefik از HTTP/2 و WebSocket پشتیبانی میکنه و میتونه بهترین عملکرد رو ارائه بده.
5⃣ کاملن مقیاسپذیر: به راحتی میتونی با افزایش تعداد سرویسها، Traefik رو گسترش بدی و ترافیک رو مدیریت کنی.
5⃣ چطوری شروع کنیم؟ 🚀
برای شروع کار با Traefik، کافیه Docker رو نصب کنی و یه فایل
حالا با یک دستور ساده میتونی Traefik رو بالا بیاری و شروع کنی به مدیریت سرویسهات.
جمعبندی 🎯
فهمیدیم Traefik یکی از بهترین انتخابها برای مدیریت ترافیک و بارگذاری در اپلیکیشنهای مدرن و میکروسرویسهاست. با ویژگیهای کاربرپسند و پیکربندی آسونش میتونه به تو کمک کنه که تمرکز بیشتری روی توسعه اپلیکیشنهات داشته باشی.
امید وارم مفید بوده باشه :)
@ninja_learn_ir
امروز میخوایم درباره Traefik صحبت کنیم، یه رورس پروکسی هست و خیلی کارآمد که مخصوصاً برای مدیریت ترافیک توی اپلیکیشنهای میکروسرویس طراحی شده.
حالا Traefik چیه؟ 🤔
خب Traefik یه reverse proxy و load balancer قویه که به راحتی میتونه ترافیک رو بین چندین سرویس توی یه کلاستر مدیریت کنه. یکی از ویژگیهای جالبش اینه که به راحتی میتونی با Docker، Kubernetes و دیگر ابزارهای مدیریت کانتینر کار کنی.
چرا باید از Traefik استفاده کنیم؟ 💡
1⃣ پیکربندی آسان: Traefik به راحتی با فایلهای پیکربندی یا بر اساس برچسبهای Docker پیکربندی میشه و نیازی به تنظیمات پیچیده نداره.
2⃣؛ TLS خودکار: Traefik به راحتی میتونه SSL رو مدیریت کنه و برای هر دامنه، گواهینامه Let’s Encrypt رو به صورت خودکار بگیره. دیگه نیازی به نگرانی درباره امنیت نیست 🔒
3⃣ داشبورد کاربرپسند: یه داشبورد خیلی قشنگ داره که میتونی وضعیت سرویسها و ترافیک رو ببینی.
این داشبورد بهت کمک میکنه تا بفهمی چه اتفاقی داره میافته. 📊
4⃣ پشتیبانی از پروتکلهای مختلف: Traefik از HTTP/2 و WebSocket پشتیبانی میکنه و میتونه بهترین عملکرد رو ارائه بده.
5⃣ کاملن مقیاسپذیر: به راحتی میتونی با افزایش تعداد سرویسها، Traefik رو گسترش بدی و ترافیک رو مدیریت کنی.
5⃣ چطوری شروع کنیم؟ 🚀
برای شروع کار با Traefik، کافیه Docker رو نصب کنی و یه فایل
docker-compose.yml
ساده بسازی. مثلاً:version: '3.7'
services:
traefik:
image: traefik:v2.5
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080" # داشبورد
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
حالا با یک دستور ساده میتونی Traefik رو بالا بیاری و شروع کنی به مدیریت سرویسهات.
جمعبندی 🎯
فهمیدیم Traefik یکی از بهترین انتخابها برای مدیریت ترافیک و بارگذاری در اپلیکیشنهای مدرن و میکروسرویسهاست. با ویژگیهای کاربرپسند و پیکربندی آسونش میتونه به تو کمک کنه که تمرکز بیشتری روی توسعه اپلیکیشنهات داشته باشی.
#traefik #reverse_proxy #web_server
👍7❤3🔥2🆒1