داشتم دربارهی Rule Engine یا همون موتور قوانین میخوندم، دیدم چقدر چیز باحالیه واسه وقتی که قراره کلی شرط و منطق رو توی یه برنامه پیاده کنیم، مخصوصاً جاهایی مثل اپ بانکی.
مثلاً فرض کن یه قانون داریم که اگه حقوق طرف بالای ۷۰ تومن باشه و امتیاز اعتباریش بالای ۹۰۰، اون وقت میتونیم ۶۰ درصد وام درخواستیشو براش تصویب کنیم. خب اینجور قوانین اگه یکیدوتا باشه با کدنویسی ساده میسازیش، ولی وقتی تعداد قوانین زیاد میشه یا هی تغییر میکنن، دیگه کنترلش از دست در میره. تازه اگه بخوای کسایی که برنامهنویس نیستن هم بتونن قانونا رو بفهمن یا عوض کنن، باید یه راه سادهتر پیدا کرد.
اینجاست که Rule Engine وارد میشه. توی این سیستم، قوانین به صورت «اگر فلان شد، پس بهمان کن» تعریف میشن. بهش میگی مثلاً اگه حقوق بالای ۷۰ بود و امتیاز بالای ۹۰۰، اون وقت وام رو تایید کن. این قوانین توی یه جایی ذخیره میشن (مثلاً یه فایل یا دیتابیس)، بعد یه چیزی به اسم Inference Engine یا موتور استنتاج میاد این قوانین رو با دادهها بررسی میکنه، اگه شرطی درست بود، اکشنش رو اجرا میکنه.
یه قسمت جالب دیگهش اینه که دو تا روش داره برای اینکه تصمیم بگیره:
۱. رو به جلو (Forward Chaining) یعنی از دادهها شروع میکنه تا ببینه به چه نتیجهای میرسه.
۲. رو به عقب (Backward Chaining) یعنی اول هدفو میذاره جلوش، بعد میگرده ببینه برای رسیدن به اون هدف باید چه شرایطی درست باشه.
خلاصهاش اینکه Rule Engine باعث میشه منطق کسبوکار رو جدا از خود برنامه نگه داریم، راحتتر مدیریت کنیم، نیاز به تغییر کد نداشته باشیم، و حتی بیزینسیها هم بتونن باهاش کار کنن. کلی هم باعث تمیزتر شدن کد و بهتر شدن کارایی میشه.
مثلاً فرض کن یه قانون داریم که اگه حقوق طرف بالای ۷۰ تومن باشه و امتیاز اعتباریش بالای ۹۰۰، اون وقت میتونیم ۶۰ درصد وام درخواستیشو براش تصویب کنیم. خب اینجور قوانین اگه یکیدوتا باشه با کدنویسی ساده میسازیش، ولی وقتی تعداد قوانین زیاد میشه یا هی تغییر میکنن، دیگه کنترلش از دست در میره. تازه اگه بخوای کسایی که برنامهنویس نیستن هم بتونن قانونا رو بفهمن یا عوض کنن، باید یه راه سادهتر پیدا کرد.
اینجاست که Rule Engine وارد میشه. توی این سیستم، قوانین به صورت «اگر فلان شد، پس بهمان کن» تعریف میشن. بهش میگی مثلاً اگه حقوق بالای ۷۰ بود و امتیاز بالای ۹۰۰، اون وقت وام رو تایید کن. این قوانین توی یه جایی ذخیره میشن (مثلاً یه فایل یا دیتابیس)، بعد یه چیزی به اسم Inference Engine یا موتور استنتاج میاد این قوانین رو با دادهها بررسی میکنه، اگه شرطی درست بود، اکشنش رو اجرا میکنه.
یه قسمت جالب دیگهش اینه که دو تا روش داره برای اینکه تصمیم بگیره:
۱. رو به جلو (Forward Chaining) یعنی از دادهها شروع میکنه تا ببینه به چه نتیجهای میرسه.
۲. رو به عقب (Backward Chaining) یعنی اول هدفو میذاره جلوش، بعد میگرده ببینه برای رسیدن به اون هدف باید چه شرایطی درست باشه.
خلاصهاش اینکه Rule Engine باعث میشه منطق کسبوکار رو جدا از خود برنامه نگه داریم، راحتتر مدیریت کنیم، نیاز به تغییر کد نداشته باشیم، و حتی بیزینسیها هم بتونن باهاش کار کنن. کلی هم باعث تمیزتر شدن کد و بهتر شدن کارایی میشه.
به نظرم یکی از چیزایی که یه برنامهنویس یا مهندس نرم افزار باید بلد باشه، وصل کردن سیستمهای مختلف به همه. مثلاً با Rule Engine میتونی کلی سناریو بسازی و وقتی به سیستمای دیگه وصلش کنی، یه چرخه کامل و خودکار درمیاد.
👍1
⏱️ حملهی زمانی (Timing Attack) تو Node.js چیه و چطوری جلوش رو بگیریم؟
Timing Attack یعنی هکر فقط با اندازهگیری زمان پاسخ سرور، میتونه حدس بزنه چه بخشهایی از یه رمز یا توکن درسته!
مثلاً وقتی مقایسهی رمز از چپ به راست انجام میشه، سرور همونجا که mismatch پیدا کنه، متوقف میشه. این باعث میشه زمان پاسخ متغیر باشه و از همین زمان، اطلاعات لو بره.
مثال:
مقایسهی بالا variable-time هست و میتونه اطلاعات رمز رو لو بده.
راهحلها 🔐
✅ ۱. استفاده از timingSafeEqual
مقایسهی ثابت زمان، فرق نمیکنه رشته چقدر شباهت داشته باشه.
🧂 ۲. استفاده از هشهای کند مثل bcrypt یا scrypt
با این کار، brute-force کردن رمز زمانبر میشه.
🔄 ۳. اجتناب از شرطهای مبتنی بر اطلاعات حساس
این مدل شرطها هم لو میدن که رمز از کجا شروع شده.
🕒 ۴. تاخیر ثابت بذار برای همهی پاسخها
Timing Attack یعنی هکر فقط با اندازهگیری زمان پاسخ سرور، میتونه حدس بزنه چه بخشهایی از یه رمز یا توکن درسته!
مثلاً وقتی مقایسهی رمز از چپ به راست انجام میشه، سرور همونجا که mismatch پیدا کنه، متوقف میشه. این باعث میشه زمان پاسخ متغیر باشه و از همین زمان، اطلاعات لو بره.
مثال:
if (input === secretToken) {
// ...
}مقایسهی بالا variable-time هست و میتونه اطلاعات رمز رو لو بده.
راهحلها 🔐
✅ ۱. استفاده از timingSafeEqual
import { timingSafeEqual } from 'node:crypto';
const a = Buffer.from(userInput, 'utf8');
const b = Buffer.from(secret, 'utf8');
if (a.length === b.length && timingSafeEqual(a, b)) {
// امنه
}مقایسهی ثابت زمان، فرق نمیکنه رشته چقدر شباهت داشته باشه.
🧂 ۲. استفاده از هشهای کند مثل bcrypt یا scrypt
با این کار، brute-force کردن رمز زمانبر میشه.
🔄 ۳. اجتناب از شرطهای مبتنی بر اطلاعات حساس
if (password.startsWith('admin')) {
// خطرناک!
}این مدل شرطها هم لو میدن که رمز از کجا شروع شده.
🕒 ۴. تاخیر ثابت بذار برای همهی پاسخها
const delay = 200; // ms
const elapsed = Date.now() - start;
await new Promise(r => setTimeout(r, Math.max(0, delay - elapsed)));
Code & Life
https://www.youtube.com/watch?v=_K-eupuDVEc
این ویدیو یه ماک اینترویو عه که توش یکی از Software Engineer گوگل شروع میکنه دیزاین کردن پروداکت Spotify . نکات جالبی داره ببینین
❤1
پریروز توی مسابقه ict یه چالشی داشتم که نیاز بود insert و update روی دیتابیس رو capture کنم.
یکی از بچه ها ابزار debezium رو معرفی کرد که دقیقا مناسب همین کار هست. میاد change های روی دیتابیس رو با توجه به کانفیگی که بهش میدین produce میکنه روی یه تاپیک کافکا
یکی از بچه ها ابزار debezium رو معرفی کرد که دقیقا مناسب همین کار هست. میاد change های روی دیتابیس رو با توجه به کانفیگی که بهش میدین produce میکنه روی یه تاپیک کافکا
Code & Life
پریروز توی مسابقه ict یه چالشی داشتم که نیاز بود insert و update روی دیتابیس رو capture کنم. یکی از بچه ها ابزار debezium رو معرفی کرد که دقیقا مناسب همین کار هست. میاد change های روی دیتابیس رو با توجه به کانفیگی که بهش میدین produce میکنه روی یه تاپیک کافکا
GitHub
GitHub - erfuuan/logixon
Contribute to erfuuan/logixon development by creating an account on GitHub.
Code & Life
https://github.com/erfuuan/logixon
اینم کدی که برای اون پروژه نوشتم
Code & Life
https://github.com/ashishps1/awesome-system-design-resources
داشتم درباره سیستم دیزاین مطالعه میکردم که به این ریپوزیتوری توی گیتهاب برخوردم
داخلش توضیح داده که اگر تازه شروع کردین به خوندن این لینک کمک میکنه این ۳۰ کانپست های اولیه رو سریع یه مرور کنین که مطالب رو بهتر متوجه بشین :