🛡️ بازگشت Worm معروف Shai-Hulud به npm
یک خبر جدی برای توسعهدهندههای JavaScript:
محققان امنیتی اعلام کردهاند که Shai-Hulud، یک Worm مخرب در اکوسیستم npm، دوباره فعال شده است.
این بار نکته عجیبتر این است که مهاجمان توانستهاند چند پکیج مخرب را از سیستم جدید بررسی امنیتی npm عبور دهند.
بررسیها نشان میدهد:
🔴 ۴ پکیج مخرب در فاصله کوتاهی منتشر شدند
🔴 حمله بعد از حدود ۱۱۱ روز دوباره مشاهده شد
🔴 و اینکه Payload استفادهشده همان نمونه قبلی بوده
🔴 هدف اصلی، سرقت Tokenها و اطلاعات حساس توسعهدهندههاست
یعنی حتی اگر یک Package Manager سیستم بررسی امنیتی داشته باشد، باز هم نباید Blind Trust داشته باشیم.
🎯 برای پروژههای واقعی:
💡 امنیت Supply Chain یعنی فقط به کدی که خودت نوشتهای اعتماد نکنی؛ تمام Dependency Tree بخشی از سطح حمله پروژه است.
@CodeVerse_dev
یک خبر جدی برای توسعهدهندههای JavaScript:
محققان امنیتی اعلام کردهاند که Shai-Hulud، یک Worm مخرب در اکوسیستم npm، دوباره فعال شده است.
این بار نکته عجیبتر این است که مهاجمان توانستهاند چند پکیج مخرب را از سیستم جدید بررسی امنیتی npm عبور دهند.
بررسیها نشان میدهد:
🔴 ۴ پکیج مخرب در فاصله کوتاهی منتشر شدند
🔴 حمله بعد از حدود ۱۱۱ روز دوباره مشاهده شد
🔴 و اینکه Payload استفادهشده همان نمونه قبلی بوده
🔴 هدف اصلی، سرقت Tokenها و اطلاعات حساس توسعهدهندههاست
یعنی حتی اگر یک Package Manager سیستم بررسی امنیتی داشته باشد، باز هم نباید Blind Trust داشته باشیم.
🎯 برای پروژههای واقعی:
npm install
↓
Dependency
↓
Dependency Chain
↓
Malicious Code?
↓
Your CI/CD + Secrets
💡 امنیت Supply Chain یعنی فقط به کدی که خودت نوشتهای اعتماد نکنی؛ تمام Dependency Tree بخشی از سطح حمله پروژه است.
@CodeVerse_dev
👍5❤2
🚨بیش از ۶ میلیون سایت در معرض خطر بودند
دو آسیبپذیری جدی در Pluginهای محبوب WordPress شناسایی و Patch شدهاند:
🔴 Elementor Pro
🔴 Super Forms
هر دو مشکل مربوط به Unrestricted File Upload بودهاند؛ یعنی مهاجم میتوانسته فایلهایی با نوع خطرناک را در شرایط خاص روی سایت آپلود کند.
در مورد Elementor Pro، آسیبپذیری تا نسخه 4.2.1 وجود داشته و امکان Remote Code Execution را ایجاد میکرد.
شدت هر دو آسیبپذیری:
CVSS 9.8 / Critical
و نکته مهمتر:
⚠️ صدها هزار تلاش برای سوءاستفاده از این آسیبپذیریها مشاهده شده است.
🎯 درس مهم برای WordPress Developer:
فقط WordPress Core را Update نکن.
💡 یک Plugin میتواند به اندازه خود WordPress Core سطح حمله ایجاد کند.
@CodeVerse_dev
دو آسیبپذیری جدی در Pluginهای محبوب WordPress شناسایی و Patch شدهاند:
🔴 Elementor Pro
🔴 Super Forms
هر دو مشکل مربوط به Unrestricted File Upload بودهاند؛ یعنی مهاجم میتوانسته فایلهایی با نوع خطرناک را در شرایط خاص روی سایت آپلود کند.
در مورد Elementor Pro، آسیبپذیری تا نسخه 4.2.1 وجود داشته و امکان Remote Code Execution را ایجاد میکرد.
شدت هر دو آسیبپذیری:
CVSS 9.8 / Critical
و نکته مهمتر:
⚠️ صدها هزار تلاش برای سوءاستفاده از این آسیبپذیریها مشاهده شده است.
🎯 درس مهم برای WordPress Developer:
فقط WordPress Core را Update نکن.
Core
+
Plugins
+
Themes
+
Server
+
Dependencies
=
Security
💡 یک Plugin میتواند به اندازه خود WordPress Core سطح حمله ایجاد کند.
@CodeVerse_dev
👍6❤2
💻❤️ روز برنامهنویس مبارک!
به همهی اونایی که ساعتها باگ میزنن، دیباگ میکنن، سرچ میکنن و آخرش با یه
برنامهنویسی همیشه آسون نیست؛ بعضی روزها پر از خطا و سردرگمیه، ولی هر چیزی که امروز برات سخته، با تمرین یه روز تبدیل میشه به چیزی که بهش افتخار میکنی.
پس اگه تازه شروع کردی، وسط راهی یا حتی یه مدت خسته شدی، ادامه بده.
کدی که امروز نمیفهمیش، شاید فردا دلیل پیشرفتت باشه. 🚀
روز همهی برنامهنویسها مبارک ❤️🔥
@CodeVerse_dev
به همهی اونایی که ساعتها باگ میزنن، دیباگ میکنن، سرچ میکنن و آخرش با یه
; یا یه پرانتز اضافه میفهمن مشکل کجا بوده 😂برنامهنویسی همیشه آسون نیست؛ بعضی روزها پر از خطا و سردرگمیه، ولی هر چیزی که امروز برات سخته، با تمرین یه روز تبدیل میشه به چیزی که بهش افتخار میکنی.
پس اگه تازه شروع کردی، وسط راهی یا حتی یه مدت خسته شدی، ادامه بده.
کدی که امروز نمیفهمیش، شاید فردا دلیل پیشرفتت باشه. 🚀
روز همهی برنامهنویسها مبارک ❤️🔥
@CodeVerse_dev
❤🔥16❤2👎1
🔍 چرا Dependencyهای غیرمستقیم مهمتر از چیزی هستند که فکر میکنی؟
فرض کن پروژهات فقط این Package را نصب کرده:
اما
تو فقط
اما در واقع داری به چندین Package دیگر هم اعتماد میکنی.
این همان چیزی است که به آن:
Transitive Dependencies
میگوییم.
🎯 مشکل کجاست؟
اگر یکی از Dependencyهای پاییندست:
🔴 آسیبپذیر شود
🔴 یا Hijack شود
🔴 همینطور Maintainer آن Compromise شود
🔴 نسخه مخرب منتشر کند
ممکن است پروژه تو هم تحت تأثیر قرار بگیرد.
💡 به همین دلیل ابزارهای Dependency Scanning و Lockfileها فقط امکانات جانبی نیستند؛ در پروژههای جدی بخشی از زنجیره امنیت هستند.
@CodeVerse_dev
فرض کن پروژهات فقط این Package را نصب کرده:
{
"dependencies": {
"package-a": "^5.0"
}
}اما
package-a خودش از اینها استفاده میکند:
package-a
├── package-b
│ └── package-c
│ └── package-d
└── package-e
تو فقط
package-a را نصب کردی؛اما در واقع داری به چندین Package دیگر هم اعتماد میکنی.
این همان چیزی است که به آن:
Transitive Dependencies
میگوییم.
🎯 مشکل کجاست؟
اگر یکی از Dependencyهای پاییندست:
🔴 آسیبپذیر شود
🔴 یا Hijack شود
🔴 همینطور Maintainer آن Compromise شود
🔴 نسخه مخرب منتشر کند
ممکن است پروژه تو هم تحت تأثیر قرار بگیرد.
💡 به همین دلیل ابزارهای Dependency Scanning و Lockfileها فقط امکانات جانبی نیستند؛ در پروژههای جدی بخشی از زنجیره امنیت هستند.
@CodeVerse_dev
👍5❤1
📊 یه ابزار ساده، کاربردی و خوشساخت برای ساخت Pie Chart
اگه برای گزارش، ارائه یا پروژهات نیاز به نمودار دایرهای داری، این ابزار بدون دردسر برات میسازه.
کافیه دادهها رو وارد کنی؛ نمودار همون لحظه بهصورت زنده ساخته میشه و میتونی خروجی رو با فرمتهای PNG، JPG یا SVG دریافت کنی.
نکته جالبتر اینکه کل پردازش داخل مرورگر انجام میشه و دادهها به سرور ارسال نمیشن. این پروژه هم با React، Tailwind CSS و Google Charts ساخته شده و روی Vercel دیپلوی شده. 👌
یه نمونه خوب از اینکه چطور میشه با یک ایده ساده، یک ابزار کاربردی و تمیز ساخت.
📎 Article
@CodeVers_dev
اگه برای گزارش، ارائه یا پروژهات نیاز به نمودار دایرهای داری، این ابزار بدون دردسر برات میسازه.
کافیه دادهها رو وارد کنی؛ نمودار همون لحظه بهصورت زنده ساخته میشه و میتونی خروجی رو با فرمتهای PNG، JPG یا SVG دریافت کنی.
نکته جالبتر اینکه کل پردازش داخل مرورگر انجام میشه و دادهها به سرور ارسال نمیشن. این پروژه هم با React، Tailwind CSS و Google Charts ساخته شده و روی Vercel دیپلوی شده. 👌
یه نمونه خوب از اینکه چطور میشه با یک ایده ساده، یک ابزار کاربردی و تمیز ساخت.
📎 Article
@CodeVers_dev
👍5❤2
🐘 وضعیت PHP 8.5 در سپتامبر ۲۰۲۶
اگر هنوز پروژههای PHP خودت را روی نسخههای قدیمی نگه داشتهای، وقت آن است که وضعیت Version را جدیتر بررسی کنی.
شاخه فعلی PHP 8.5 است و نسخههای Patch آن بهصورت منظم منتشر میشوند.
اما یک نکته مهم:
❌ فقط به عدد Version نگاه نکن.
مثلاً:
قبل از ارتقای Production:
1️⃣ Changelog را بخوان
2️⃣ Composer Dependencies را بررسی کن
3️⃣ Test Suite را اجرا کن
4️⃣ روی Staging تست کن
5️⃣ بعد Production را Update کن
💡 در پروژههای حرفهای، «آخرین نسخه» لزوماً به معنی «همین الان روی Production نصبش کن» نیست؛ Release را بررسی میکنیم، Compatibility را میسنجیم و بعد Deploy میکنیم.
@CodeVerse_dev
اگر هنوز پروژههای PHP خودت را روی نسخههای قدیمی نگه داشتهای، وقت آن است که وضعیت Version را جدیتر بررسی کنی.
شاخه فعلی PHP 8.5 است و نسخههای Patch آن بهصورت منظم منتشر میشوند.
اما یک نکته مهم:
❌ فقط به عدد Version نگاه نکن.
مثلاً:
PHP 8.5
↓
Patch Release
↓
Bug Fix
↓
Security Fix
↓
Changelog
قبل از ارتقای Production:
1️⃣ Changelog را بخوان
2️⃣ Composer Dependencies را بررسی کن
3️⃣ Test Suite را اجرا کن
4️⃣ روی Staging تست کن
5️⃣ بعد Production را Update کن
💡 در پروژههای حرفهای، «آخرین نسخه» لزوماً به معنی «همین الان روی Production نصبش کن» نیست؛ Release را بررسی میکنیم، Compatibility را میسنجیم و بعد Deploy میکنیم.
@CodeVerse_dev
👍5❤3
🧩 Design Patterns in 3 Minutes | Factory Pattern
فرض کن در پروژه یک سیستم پرداخت داری:
امروز مشکلی ندارد.
اما بعداً میشود:
و Controller تبدیل میشود به یک جنگل از
اینجا Factory Pattern میتواند کمک کند.
مثلاً:
حالا مسئولیت ساخت Object از Controller خارج شده.
🎯حالا Factory چه مشکلی حل میکند؟
به جای اینکه هر جای پروژه بدانی:
«برای ساخت این Object دقیقاً باید چه Classای را
این تصمیم را به یک نقطه مشخص منتقل میکنی.
💡 اما یک نکته Senior-Level:
قابلیتFactory را فقط برای اینکه کدت حرفهایتر به نظر برسد استفاده نکن.
اگر فقط دو Class داری و منطق ساخت ساده است، Factory ممکن است فقط پیچیدگی اضافه کند.
موضوع Pattern زمانی ارزش دارد که یک مشکل واقعی در طراحی را حل کند.
@CodeVerse_dev
فرض کن در پروژه یک سیستم پرداخت داری:
if ($gateway === 'zarinpal') {
$payment = new Zarinpal();
}
if ($gateway === 'idpay') {
$payment = new IDPay();
}
if ($gateway === 'stripe') {
$payment = new Stripe();
}امروز مشکلی ندارد.
اما بعداً میشود:
5 Gateway
↓
10 Gateway
↓
20 Gateway
و Controller تبدیل میشود به یک جنگل از
if/elseها. 😅اینجا Factory Pattern میتواند کمک کند.
مثلاً:
$payment = PaymentFactory::make($gateway);
حالا مسئولیت ساخت Object از Controller خارج شده.
🎯حالا Factory چه مشکلی حل میکند؟
به جای اینکه هر جای پروژه بدانی:
«برای ساخت این Object دقیقاً باید چه Classای را
new کنم؟»این تصمیم را به یک نقطه مشخص منتقل میکنی.
💡 اما یک نکته Senior-Level:
قابلیتFactory را فقط برای اینکه کدت حرفهایتر به نظر برسد استفاده نکن.
اگر فقط دو Class داری و منطق ساخت ساده است، Factory ممکن است فقط پیچیدگی اضافه کند.
موضوع Pattern زمانی ارزش دارد که یک مشکل واقعی در طراحی را حل کند.
@CodeVerse_dev
👍5❤2
🧩 چرا بعد از حذف یک افزونه، سرعت سایت همیشه بهتر نمیشه؟
یک تصور رایج:
«این افزونه رو حذف کردم، پس دیتابیس هم سبک شد.»
لزوماً نه.
بعضی افزونهها هنگام حذف، تمام دادههایی که داخل دیتابیس ساختهاند رو پاک نمیکنن.
ممکنه بعد از حذف افزونه هنوز چیزهایی مثل:
باقی مونده باشن.
بدتر اینکه بعضی افزونهها دادههای موقتی یا Optionهای زیادی ایجاد میکنن که بعداً روی Autoload هم اثر میذاره.
اما اینجا هم نباید کورکورانه بری سراغ حذف اطلاعات.
چون ممکنه یک Option هنوز توسط قالب یا افزونه دیگری استفاده بشه.
روش حرفهای:
اول شناسایی → بعد بررسی وابستگی → بعد پاکسازی
نه اینکه مستقیم وارد دیتابیس بشی و هر چیزی که اسم افزونه قدیمی روشه حذف کنی. 😄
در WordPress، تمیز بودن دیتابیس خوبه؛
ولی پاکسازی بدون شناخت میتونه از دیتابیس شلوغ خطرناکتر باشه.
@CodeVerse_dev
یک تصور رایج:
«این افزونه رو حذف کردم، پس دیتابیس هم سبک شد.»
لزوماً نه.
بعضی افزونهها هنگام حذف، تمام دادههایی که داخل دیتابیس ساختهاند رو پاک نمیکنن.
ممکنه بعد از حذف افزونه هنوز چیزهایی مثل:
wp_options
wp_postmeta
wp_usermeta
Custom Tables
Cron Events
باقی مونده باشن.
بدتر اینکه بعضی افزونهها دادههای موقتی یا Optionهای زیادی ایجاد میکنن که بعداً روی Autoload هم اثر میذاره.
اما اینجا هم نباید کورکورانه بری سراغ حذف اطلاعات.
چون ممکنه یک Option هنوز توسط قالب یا افزونه دیگری استفاده بشه.
روش حرفهای:
اول شناسایی → بعد بررسی وابستگی → بعد پاکسازی
نه اینکه مستقیم وارد دیتابیس بشی و هر چیزی که اسم افزونه قدیمی روشه حذف کنی. 😄
در WordPress، تمیز بودن دیتابیس خوبه؛
ولی پاکسازی بدون شناخت میتونه از دیتابیس شلوغ خطرناکتر باشه.
@CodeVerse_dev
🔥5❤2
⚡ چرا forEach همیشه انتخاب خوبی نیست؟
این کد رو زیاد میبینیم:
ظاهرش کاملاً منطقیه.
ولی یک مشکل مهم داره:
تابع forEach منتظر
یعنی ممکنه همه sendEmail
اگر واقعاً میخوای یکییکی اجرا بشن:
و اگر مستقل از هم هستن و میخوای همزمان اجرا بشن:
تفاوت این دو فقط Syntax نیست.
اولی:
کنترلشده و ترتیبی
دومی:
همزمان و سریعتر، ولی با مصرف منابع بیشتر
پس وقتی Async Code مینویسی، همیشه از خودت بپرس:
این عملیات باید یکییکی انجام بشه یا واقعاً میتونن همزمان اجرا بشن؟
همین یک سؤال میتونه جلوی کلی Bug و Performance Problem رو بگیره.
@CodeVerse_dev
این کد رو زیاد میبینیم:
users.forEach(async (user) => {
await sendEmail(user);
});ظاهرش کاملاً منطقیه.
ولی یک مشکل مهم داره:
تابع forEach منتظر
Promiseهای داخل Callback نمیمونه.یعنی ممکنه همه sendEmail
ها تقریباً همزمان شروع بشن و کدی که بعد از forEach نوشته شده، قبل از تمام شدن اونها اجرا بشه.اگر واقعاً میخوای یکییکی اجرا بشن:
for (const user of users) {
await sendEmail(user);
}و اگر مستقل از هم هستن و میخوای همزمان اجرا بشن:
await Promise.all(
users.map(user => sendEmail(user))
);
تفاوت این دو فقط Syntax نیست.
اولی:
کنترلشده و ترتیبی
دومی:
همزمان و سریعتر، ولی با مصرف منابع بیشتر
پس وقتی Async Code مینویسی، همیشه از خودت بپرس:
این عملیات باید یکییکی انجام بشه یا واقعاً میتونن همزمان اجرا بشن؟
همین یک سؤال میتونه جلوی کلی Bug و Performance Problem رو بگیره.
@CodeVerse_dev
👍5❤1
یه باگ که از یه جای خیلی ساده شروع شد!
یروز داشتم یکی از بخشهای پروژه رو بررسی میکردم که متوجه شدم یه درخواست HTTP بیشتر از چیزی که انتظار داشتم اجرا میشه.
اول فکر کردم مشکل از Backend ـه.
ولی وقتی Network رو باز کردم و درخواستها رو یکییکی بررسی کردم، فهمیدم مشکل از Frontend شروع شده.
یه Event Listener چند بار روی یک Element ثبت شده بود!
نتیجه؟
با هر کلیک، چند درخواست همزمان ارسال میشد. 😐
جالب اینجاست که کد ظاهراً کاملاً درست به نظر میرسید.
این تجربه دوباره بهم یادآوری کرد که موقع Debug فقط به نتیجه نهایی نگاه نکنم؛ مسیر اتفاق رو هم بررسی کنم.
گاهی DevTools بیشتر از خود کد بهت جواب میده.
📢 @CodeVerse_dev
یروز داشتم یکی از بخشهای پروژه رو بررسی میکردم که متوجه شدم یه درخواست HTTP بیشتر از چیزی که انتظار داشتم اجرا میشه.
اول فکر کردم مشکل از Backend ـه.
ولی وقتی Network رو باز کردم و درخواستها رو یکییکی بررسی کردم، فهمیدم مشکل از Frontend شروع شده.
یه Event Listener چند بار روی یک Element ثبت شده بود!
نتیجه؟
با هر کلیک، چند درخواست همزمان ارسال میشد. 😐
جالب اینجاست که کد ظاهراً کاملاً درست به نظر میرسید.
این تجربه دوباره بهم یادآوری کرد که موقع Debug فقط به نتیجه نهایی نگاه نکنم؛ مسیر اتفاق رو هم بررسی کنم.
گاهی DevTools بیشتر از خود کد بهت جواب میده.
📢 @CodeVerse_dev
❤9
یکی از خطرناکترین جملهها در یک پروژه:
«فعلاً کار میکنه، بعداً درستش میکنیم.»
«بعداً» معمولاً تبدیل میشود به:
و ناگهان بعد از چند ماه، هیچکس جرئت تغییر آن قسمت را ندارد.
اسم این مشکل فقط Technical Debt نیست.
مشکل بزرگتر اینه که تیم کمکم ترس از تغییر کد پیدا میکنه.
توسعهدهنده حرفهای لزوماً کسی نیست که از اول بهترین معماری دنیا را طراحی کند.
کسیه که بداند:
کجا میشود ساده نوشت،
کجا باید از ابتدا درست طراحی کرد،
و کجا نباید «فعلاً» را وارد Production کرد.
@CodeVerse_dev
«فعلاً کار میکنه، بعداً درستش میکنیم.»
«بعداً» معمولاً تبدیل میشود به:
TODO
↓
TODO
↓
TODO
↓
Temporary Fix
↓
Temporary Fix
↓
Production Code
و ناگهان بعد از چند ماه، هیچکس جرئت تغییر آن قسمت را ندارد.
اسم این مشکل فقط Technical Debt نیست.
مشکل بزرگتر اینه که تیم کمکم ترس از تغییر کد پیدا میکنه.
توسعهدهنده حرفهای لزوماً کسی نیست که از اول بهترین معماری دنیا را طراحی کند.
کسیه که بداند:
کجا میشود ساده نوشت،
کجا باید از ابتدا درست طراحی کرد،
و کجا نباید «فعلاً» را وارد Production کرد.
@CodeVerse_dev
👍7❤2
🚨 اگر All-in-One WP Migration داری، این پست مهمه
یک آسیبپذیری SQL Injection بدون نیاز به لاگین در افزونهی محبوب All-in-One WP Migration and Backup گزارش شده که حدود ۵ میلیون سایت وردپرسی را تحت تأثیر قرار میدهد.
نکتهی جالبتر اینه که Wordfence اعلام کرده برای کاربران رایگانش، محافظت فایروال از ۱۵ سپتامبر ۲۰۲۶ فعال میشود.
یعنی امروز دقیقاً روزیه که اگر این افزونه روی سایتت نصبه، باید وضعیتش رو بررسی کنی.
🔐 همیشه اینو یادت باشه:
نصب یک افزونهی محبوب ≠ امن بودن آن
قبل از هر چیز:
نسخه افزونه را بررسی کن
آپدیت موجود را نصب کن
افزونههای بلااستفاده را حذف کن
لاگهای امنیتی سایت را بررسی کن
@CodeVerse_dev
یک آسیبپذیری SQL Injection بدون نیاز به لاگین در افزونهی محبوب All-in-One WP Migration and Backup گزارش شده که حدود ۵ میلیون سایت وردپرسی را تحت تأثیر قرار میدهد.
نکتهی جالبتر اینه که Wordfence اعلام کرده برای کاربران رایگانش، محافظت فایروال از ۱۵ سپتامبر ۲۰۲۶ فعال میشود.
یعنی امروز دقیقاً روزیه که اگر این افزونه روی سایتت نصبه، باید وضعیتش رو بررسی کنی.
🔐 همیشه اینو یادت باشه:
نصب یک افزونهی محبوب ≠ امن بودن آن
قبل از هر چیز:
نسخه افزونه را بررسی کن
آپدیت موجود را نصب کن
افزونههای بلااستفاده را حذف کن
لاگهای امنیتی سایت را بررسی کن
@CodeVerse_dev
👍6❤2
🚀 زبان TypeScript دیگه فقط یک زبان تایپشده روی JavaScript نیست؛ Compiler خودش هم متحول شده
یکی از تغییرات مهم امسال، مهاجرت TypeScript به یک Compiler کاملاً Native بر پایه Go هست.
نسخه TypeScript 7 با این معماری جدید منتشر شده و مایکروسافت گزارش کرده که در Buildهای کامل، بسته به پروژه، سرعتهایی حدود ۸ تا ۱۲ برابر نسبت به Compiler قبلی دیده میشه.
اما نکته مهم فقط سرعت نیست.
در پروژههای بزرگ TypeScript، زمان صرفشده برای:
میتونه روی تجربه توسعهدهنده تأثیر جدی بذاره.
وقتی این بخشها سریعتر بشن، نتیجه فقط یک Build سریعتر نیست.
یعنی:
⚡عمل Feedback سریعتر داخل IDE
⚡ سریعتر شدن Type Checking
⚡ تجربه بهتر در Monorepoها
⚡ امکان کار راحتتر با Codebaseهای بزرگ
و این دقیقاً همون جاییه که TypeScript میخواد JavaScript رو برای پروژههای خیلی بزرگ مقیاسپذیرتر کنه.
💡 نکته جالب:
گاهی Performance یک زبان فقط به Runtime مربوط نیست؛ سرعت ابزارهای اطراف Developer هم بخشی از Performance واقعی اون اکوسیستمه.
@CodeVerse_dev
یکی از تغییرات مهم امسال، مهاجرت TypeScript به یک Compiler کاملاً Native بر پایه Go هست.
نسخه TypeScript 7 با این معماری جدید منتشر شده و مایکروسافت گزارش کرده که در Buildهای کامل، بسته به پروژه، سرعتهایی حدود ۸ تا ۱۲ برابر نسبت به Compiler قبلی دیده میشه.
اما نکته مهم فقط سرعت نیست.
در پروژههای بزرگ TypeScript، زمان صرفشده برای:
Type Checking
↓
Language Server
↓
Build
↓
IDE Feedback
میتونه روی تجربه توسعهدهنده تأثیر جدی بذاره.
وقتی این بخشها سریعتر بشن، نتیجه فقط یک Build سریعتر نیست.
یعنی:
⚡عمل Feedback سریعتر داخل IDE
⚡ سریعتر شدن Type Checking
⚡ تجربه بهتر در Monorepoها
⚡ امکان کار راحتتر با Codebaseهای بزرگ
و این دقیقاً همون جاییه که TypeScript میخواد JavaScript رو برای پروژههای خیلی بزرگ مقیاسپذیرتر کنه.
💡 نکته جالب:
گاهی Performance یک زبان فقط به Runtime مربوط نیست؛ سرعت ابزارهای اطراف Developer هم بخشی از Performance واقعی اون اکوسیستمه.
@CodeVerse_dev
👍6❤2
🚨 امروز چند آسیبپذیری جدی در افزونههای وردپرس گزارش شده
یکی از موارد امروز مربوط به افزونه Login with QR با شناسه CVE-2026-86710 هست.
مشکل از جایی میاد که افزونه کد ورود QR را بهدرستی اعتبارسنجی نمیکنه و در شرایطی مهاجم بدون احراز هویت میتونه بهعنوان یک کاربر وارد سایت بشه؛ حتی اگر آن حساب Administrator باشه.
دو مورد دیگه هم امروز برای افزونههای Pressengine و PuppyFW گزارش شده:
🔴 Pressengine → امکان دور زدن احراز هویت و ایجاد Session معتبر
🔴 PuppyFW → ضعف در بررسی Permission در REST API و امکان تغییر تنظیمات سایت توسط کاربر دارای دسترسی پایینتر
نکته مهم برای توسعهدهندههای WordPress:
وقتی یک API یا Login Handler مینویسی، هیچوقت نباید به دادهای که از Request میاد برای تعیین سطح دسترسی اعتماد کنی.
اشتباه خطرناک:
چون کاربر عملاً داره تعیین میکنه:
«بررسی کن ببین من این دسترسی رو دارم یا نه!»
سطح دسترسی باید سمت سرور و از یک مقدار ثابت و قابل اعتماد تعیین بشه.
💡 خیلی از باگهای امنیتی پیچیده، در نهایت از یک اشتباه ساده شروع میشن:
اعتماد کردن به چیزی که کاربر خودش میتونه کنترلش کنه.
@CodeVerse_dev
یکی از موارد امروز مربوط به افزونه Login with QR با شناسه CVE-2026-86710 هست.
مشکل از جایی میاد که افزونه کد ورود QR را بهدرستی اعتبارسنجی نمیکنه و در شرایطی مهاجم بدون احراز هویت میتونه بهعنوان یک کاربر وارد سایت بشه؛ حتی اگر آن حساب Administrator باشه.
دو مورد دیگه هم امروز برای افزونههای Pressengine و PuppyFW گزارش شده:
🔴 Pressengine → امکان دور زدن احراز هویت و ایجاد Session معتبر
🔴 PuppyFW → ضعف در بررسی Permission در REST API و امکان تغییر تنظیمات سایت توسط کاربر دارای دسترسی پایینتر
نکته مهم برای توسعهدهندههای WordPress:
وقتی یک API یا Login Handler مینویسی، هیچوقت نباید به دادهای که از Request میاد برای تعیین سطح دسترسی اعتماد کنی.
اشتباه خطرناک:
$capability = $_REQUEST['capability'];
current_user_can($capability);
چون کاربر عملاً داره تعیین میکنه:
«بررسی کن ببین من این دسترسی رو دارم یا نه!»
سطح دسترسی باید سمت سرور و از یک مقدار ثابت و قابل اعتماد تعیین بشه.
💡 خیلی از باگهای امنیتی پیچیده، در نهایت از یک اشتباه ساده شروع میشن:
اعتماد کردن به چیزی که کاربر خودش میتونه کنترلش کنه.
@CodeVerse_dev
❤8
چرا باید Destructuring در JavaScript رو بلد باشی؟ 🤔
فرض کن از API یک User گرفتیم:
روش معمول:
اما با Destructuring:
همین! 😎
حالا مستقیم میتونی استفاده کنی:
---
تغییر اسم متغیر هم میشه 👀
مثلاً:
اینجا Property همچنان name هست، ولی متغیری که ساختیم username نام داره.
---
مقدار پیشفرض هم میتونی تعیین کنی:
اگر country داخل Object وجود نداشته باشه، مقدار پیشفرض استفاده میشه.
---
داخل Destructuring برای Array هم داریم 🔥
حتی میتونی بعضی آیتمها رو رد کنی:
---
کاربرد واقعی در پروژه
وقتی از یک تابع چند مقدار برمیگردونی:
یا هنگام کار با API:
کدت هم کوتاهتر میشه، هم خواناتر.
حالا Destructuring فقط برای کوتاه کردن کد نیست؛ کمک میکنه دقیقاً مشخص باشه از یک Object یا Array چه دادهای نیاز داری. 🚀
@CodeVerse_dev
فرض کن از API یک User گرفتیم:
const user = {
name: "alex",
age: 22,
role: "Developer"
};روش معمول:
const name = user.name;
const age = user.age;
const role = user.role;
اما با Destructuring:
const { name, age, role } = user;همین! 😎
حالا مستقیم میتونی استفاده کنی:
console.log(name);
console.log(age);
console.log(role);
---
تغییر اسم متغیر هم میشه 👀
مثلاً:
const { name: username } = user;
console.log(username);
// alexاینجا Property همچنان name هست، ولی متغیری که ساختیم username نام داره.
---
مقدار پیشفرض هم میتونی تعیین کنی:
const { name, country = "England" } = user;
console.log(country);
// Englandاگر country داخل Object وجود نداشته باشه، مقدار پیشفرض استفاده میشه.
---
داخل Destructuring برای Array هم داریم 🔥
const colors = ["red", "blue", "green"];
const [first, second] = colors;
console.log(first);
// red
console.log(second);
// blue
حتی میتونی بعضی آیتمها رو رد کنی:
const [first, , third] = colors;
console.log(third);
// green
---
کاربرد واقعی در پروژه
وقتی از یک تابع چند مقدار برمیگردونی:
function getUser() {
return {
name: "alex",
age: 22
};
}
const { name, age } = getUser();یا هنگام کار با API:
const { data, status } = response;کدت هم کوتاهتر میشه، هم خواناتر.
حالا Destructuring فقط برای کوتاه کردن کد نیست؛ کمک میکنه دقیقاً مشخص باشه از یک Object یا Array چه دادهای نیاز داری. 🚀
@CodeVerse_dev
👍8❤3
یک اشتباه رایج بین توسعهدهندهها:
و تمام.
اما واقعاً چه چیزی نصب شد؟
ممکنه تو فقط اینو درخواست کرده باشی:
my-package
ولی پشت صحنه:
یعنی یک پکیج میتواند دهها یا حتی صدها dependency دیگر وارد پروژه کند.
حملات زنجیره تأمین دقیقاً از همین نقطه خطرناک میشوند.
در سال ۲۰۲۶ چندین حمله بزرگ به npm رخ داده که حتی پکیجهای محبوب را هدف گرفتهاند؛ از جمله ChainDrop که بیش از ۴۰۰ پکیج npm را تحت تأثیر قرار داد.
پس قبل از اینکه یک پکیج را فقط به خاطر محبوب بودن نصب کنی، این سؤال را بپرس:
«این پکیج چه چیزهایی را با خودش وارد پروژه من میکند؟»
@CodeVerse_dev
npm install package
و تمام.
اما واقعاً چه چیزی نصب شد؟
ممکنه تو فقط اینو درخواست کرده باشی:
my-package
ولی پشت صحنه:
my-package
├── dependency-A
│ ├── dependency-C
│ └── dependency-D
├── dependency-B
│ └── dependency-E
└── ...
یعنی یک پکیج میتواند دهها یا حتی صدها dependency دیگر وارد پروژه کند.
حملات زنجیره تأمین دقیقاً از همین نقطه خطرناک میشوند.
در سال ۲۰۲۶ چندین حمله بزرگ به npm رخ داده که حتی پکیجهای محبوب را هدف گرفتهاند؛ از جمله ChainDrop که بیش از ۴۰۰ پکیج npm را تحت تأثیر قرار داد.
پس قبل از اینکه یک پکیج را فقط به خاطر محبوب بودن نصب کنی، این سؤال را بپرس:
«این پکیج چه چیزهایی را با خودش وارد پروژه من میکند؟»
@CodeVerse_dev
👍7❤2
🚨 وقتی یک اسکریپت خارجی، تبدیل به نقطه ورود حمله میشود
یک حمله Supply Chain در سرویسهای Brevo اخیراً باعث شد JavaScript مخرب از طریق بعضی Widgetها و Assetهای این سرویس به سایتهای استفادهکننده منتقل شود.
گزارشهای منتشرشده میگویند این حمله بیش از ۱۰۰ هزار سایت را در معرض خطر قرار داده است.
نکته مهم برای توسعهدهندهها:
وقتی داخل سایتت این موارد را قرار میدهی:
در واقع بخشی از اعتماد امنیتی سایتت را به یک سرویس خارجی منتقل کردهای.
یعنی حتی اگر:
✅ سیستم محتوا WordPress بهروز باشد
✅ همینطور Pluginها امن باشند
✅ سرور امن باشد
باز هم یک Third-Party Script آلوده میتواند سطح حمله را افزایش دهد.
برای همین در پروژههای حساس:
🔹 وابستگیهای خارجی را Inventory کنید
🔹همچنین Scriptهای Third-Party را بررسی کنید
🔹 دسترسی Pluginها را محدود کنید
🔹موضوع CSP را جدی بگیرید
🔹 تغییرات غیرعادی فایلها و درخواستها را Monitor کنید
امنیت فقط محافظت از کد خودمان نیست؛ زنجیره وابستگیها هم بخشی از سیستم ماست.
@CodeVerse_dev
یک حمله Supply Chain در سرویسهای Brevo اخیراً باعث شد JavaScript مخرب از طریق بعضی Widgetها و Assetهای این سرویس به سایتهای استفادهکننده منتقل شود.
گزارشهای منتشرشده میگویند این حمله بیش از ۱۰۰ هزار سایت را در معرض خطر قرار داده است.
نکته مهم برای توسعهدهندهها:
وقتی داخل سایتت این موارد را قرار میدهی:
<script src="external-service.js">
در واقع بخشی از اعتماد امنیتی سایتت را به یک سرویس خارجی منتقل کردهای.
یعنی حتی اگر:
✅ سیستم محتوا WordPress بهروز باشد
✅ همینطور Pluginها امن باشند
✅ سرور امن باشد
باز هم یک Third-Party Script آلوده میتواند سطح حمله را افزایش دهد.
برای همین در پروژههای حساس:
🔹 وابستگیهای خارجی را Inventory کنید
🔹همچنین Scriptهای Third-Party را بررسی کنید
🔹 دسترسی Pluginها را محدود کنید
🔹موضوع CSP را جدی بگیرید
🔹 تغییرات غیرعادی فایلها و درخواستها را Monitor کنید
امنیت فقط محافظت از کد خودمان نیست؛ زنجیره وابستگیها هم بخشی از سیستم ماست.
@CodeVerse_dev
👍6❤2
💡 یک ترفند ساده HTML که میتواند تجربه کاربری سایتت را بهتر کند!
اگر در فرم سایت از
مثلاً:
مرورگر میتواند اطلاعاتی مثل ایمیل، نام، آدرس و شماره تلفن را راحتتر برای کاربر پیشنهاد دهد.
✅ فرم سریعتر پر میشود
✅ تجربه کاربری بهتر میشود
✅ مخصوصاً در موبایل کاربردی است
گاهی یک Attribute ساده میتواند UX سایت را بهتر کند. 🚀
@CodeVerse_dev
اگر در فرم سایت از
input استفاده میکنی، ویژگی autocomplete را فراموش نکن.مثلاً:
<input
type="email"
name="email"
autocomplete="email"
>
مرورگر میتواند اطلاعاتی مثل ایمیل، نام، آدرس و شماره تلفن را راحتتر برای کاربر پیشنهاد دهد.
✅ فرم سریعتر پر میشود
✅ تجربه کاربری بهتر میشود
✅ مخصوصاً در موبایل کاربردی است
گاهی یک Attribute ساده میتواند UX سایت را بهتر کند. 🚀
@CodeVerse_dev
👍8❤3
🔐 یک نکته امنیتی مهم برای توسعهدهندگان وب:
هیچوقت API Key، پسورد دیتابیس یا Secretهای پروژه را مستقیماً داخل کد قرار نده!
❌ بد:
و مقدار Secret را داخل فایل محیطی مثل
⚠️ مخصوصاً قبل از Push کردن پروژه به GitHub، حواست به اطلاعات حساس باشد.
یک API Key لو رفته میتواند دردسر بزرگی ایجاد کند.
@CodeVerse_dev
هیچوقت API Key، پسورد دیتابیس یا Secretهای پروژه را مستقیماً داخل کد قرار نده!
❌ بد:
const API_KEY = "my-secret-key";
✅ بهتر:
const API_KEY = process.env.API_KEY;
و مقدار Secret را داخل فایل محیطی مثل
.env نگهداری کن.⚠️ مخصوصاً قبل از Push کردن پروژه به GitHub، حواست به اطلاعات حساس باشد.
یک API Key لو رفته میتواند دردسر بزرگی ایجاد کند.
@CodeVerse_dev
👍6❤2