@pinojs/redact: حذف امن اطلاعات حساس از آبجکتهای JS
خلاصهٔ کاملتر
وقتی داری لاگ میزنی یا داده رد و بدل میکنی، یه اشتباه رایجه که اطلاعات حساس مثل پسورد، توکن یا کوکی توی لاگها یا خروجی API لو بره. @pinojs/redact دقیقاً برای حل همین مشکل طراحی شده — یه کتابخونهی جاوااسکریپت که بهت اجازه میده مسیرهای حساس رو مشخص کنی و اونها رو با یه مقدار جایگزین (مثل [REDACTED]) عوض کنی.
تفاوت اصلیش با fast-redact اینه که آبجکت اصلی رو هیچوقت تغییر نمیده. یعنی اگه یه آبجکت رو بین چند بخش از کدت به اشتراک گذاشتی، با redact کردنش نگران نباش که جای دیگهای از کد خراب بشه.
استفاده ازش خیلی سادست. یه بار تابع redact رو با مسیرهای حساس میسازی و بعد روی هر آبجکتی اعمالش میکنی:
const pinoRedact = require('@pinojs/redact')
const redact = pinoRedact({
paths: ['headers.cookie', 'headers.authorization', 'user.password']
})
const obj = {
headers: { cookie: 'secret-session-token', authorization: 'Bearer abc123' },
user: { name: 'john', password: 'secret123' }
}
console.log(redact(obj))
// {"headers":{"cookie":"[REDACTED]","authorization":"[REDACTED]"},"user":{"name":"john","password":"[REDACTED]"}}
console.log(obj.headers.cookie) // 'secret-session-token' — دستنخورده!یکی از قابلیتهای جالبش اینه که میتونی به جای یه مقدار ثابت، یه تابع به عنوان censor بدی. مثلاً بر اساس مسیر فیلد، مقدار متفاوتی بذاری:
const redact = pinoRedact({
paths: ['password'],
censor: (value, path) => `REDACTED:${path}`
})همچنین با گزینهی serialize: false میتونی به جای JSON string، یه آبجکت جدید بگیری که قابلیت restore هم داره — یعنی میتونی مقادیر اصلی رو برگردونی:
const redact = pinoRedact({ paths: ['secret'], serialize: false })
const result = redact({ secret: 'hidden', public: 'data' })
console.log(result.secret) // '[REDACTED]'
const restored = result.restore()
console.log(restored.secret) // 'hidden'اگه بخوای فیلد رو کاملاً از خروجی حذف کنی (نه redact کنی)، گزینهی remove: true دقیقاً این کار رو میکنه. همچنین از wildcard هم پشتیبانی میکنه، مثلاً users.*.password رمز همهی کاربرها رو یهجا مخفی میکنه.
از نظر عملکرد، این کتابخونه با روش «کلون انتخابی» کار میکنه. یعنی به جای اینکه کل آبجکت رو کپی کنه، فقط شاخههایی که باید تغییر کنن رو کلون میکنه و بقیه رو با همون reference اصلی نگه میداره. این باعث میشه مصرف حافظه خیلی کمتر بشه و سرعت هم برای آبجکتهای بزرگ تقریباً برابر fast-redact باشه (مثلاً ~18μs در مقابل ~17μs برای آبجکتهای 18KB).
البته برای آبجکتهای خیلی کوچیک (حدود 180 بایت)، یه سربار کمی داره (~690ns در مقابل ~200ns). پس اگه throughput فوقالعاده بالایی داری و آبجکتهات کوچیکن، fast-redact هنوز انتخاب بهتریه. ولی در اکثر پروژههای واقعی که آبجکتها بزرگترن یا immutability مهمه، @pinojs/redact انتخاب مناسبتریه.
نکات کلیدی:
- آبجکت اصلی رو هیچوقت تغییر نمیده (immutability کامل)
- فقط شاخههای حساس رو کلون میکنه، بقیه رو share میکنه
- API کاملاً سازگار با fast-redact
- پشتیبانی از wildcard، bracket notation و ایندکس آرایه
- گزینهی remove برای حذف کامل فیلد از خروجی
- با serialize: false میتونی آبجکت redactشده رو برگردونی و بعداً restore کنی
- برای آبجکتهای بزرگ با redaction محدود، سرعتش تقریباً برابر fast-redactه




