برنامه نویسی

چگونه از آسیب‌پذیری تزریق لاگ در برنامه‌های JavaScript و Node.js جلوگیری کنیم

Summarize this content to 400 words in Persian Lang
در بسیاری از برنامه‌های استاندارد سازمانی، گزارش‌گیری مداوم اهداف زیادی را دنبال می‌کند. این به کسب‌وکارها کمک می‌کند تا خطاها را شناسایی و اصلاح کنند، بینش‌های تحلیلی ارزشمندی ارائه می‌کند و به شما امکان می‌دهد راه‌حل‌های جدید را آزمایش کنید. با این حال، این همچنین باعث می‌شود که تزریق لاگ یکی از رایج‌ترین روش‌هایی باشد که هکرها می‌توانند اطلاعات حساس کاربر را ربوده یا حتی به آنها دسترسی پیدا کنند. آسیب‌پذیری‌ها در روش‌هایی که داده‌های گزارش برنامه‌ها می‌توانند به مهاجمان اجازه دهند تا کدهای مخرب را به گزارش‌ها تزریق کنند، که یکپارچگی و محرمانه بودن برنامه شما را به خطر می‌اندازد.

در این مقاله، شما به طور خاص به آسیب‌پذیری‌های log injection در Node.js می‌پردازید. شما نحوه عملکرد تزریق لاگ را بررسی خواهید کرد و راه های موثر برای جلوگیری از آنها را یاد خواهید گرفت.

آسیب پذیری log injection چیست؟

وقتی نوبت به ثبت اطلاعات می رسد، برخی از برنامه ها به یک فایل خارجی وارد می شوند یا به یک API خارجی که در آن گزارش ها ارسال می شوند، تکیه می کنند. تزریق گزارش زمانی اتفاق می‌افتد که مهاجم داده‌های ورودی را برای تزریق کد مخرب به گزارش‌های برنامه دستکاری می‌کند. این گزارش‌ها معمولاً برای اهداف اشکال‌زدایی، نظارت و ممیزی استفاده می‌شوند.

هنگامی که یک log injection رخ می دهد، مهاجم می تواند گزارش ها را بهم ریخته یا حتی کد را در زمینه برنامه اجرا کند که منجر به خطرات امنیتی مختلف می شود.

نمونه ای از یک برنامه آسیب پذیر Node.js

یک برنامه ساده Node.js را در نظر بگیرید که از چارچوب وب Express برای ثبت داده های ارائه شده توسط کاربر بدون اعتبارسنجی یا پاکسازی مناسب استفاده می کند. در زیر یک قطعه کد نشان دهنده این آسیب پذیری است:

const express = require(‘express’);
const app = express();

app.get(‘/log’, (req, res) => {
const userInput = req.query.data;
console.log(‘INFO: ‘ + userInput);
res.send(‘Data logged successfully.’);
});

app.listen(3000, () => {
console.log(‘Server started on port 3000’);
});

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که این سرور به صورت محلی راه‌اندازی شد، می‌توانید با استفاده از ابزارهای تست API مانند Insomnia یک درخواست GET ارسال کنید تا بررسی کنید که آیا کارها مطابق انتظار کار می‌کنند یا خیر. در این مورد، شما در حال برنامه ریزی برای ثبت نام کاربری از یک فرم برای آزمایش ظاهر گزارش های سرور هستید. داده ها را برای مطابقت با آنچه سرور شما انتظار دارد اضافه می کنید و درخواست را ارسال می کنید. انجام این کار به شما یک 200 OK و متنی که می گوید: “داده ها با موفقیت ثبت شدند.”:

اگر گزارش های سمت سرور را بررسی کنید، به نظر می رسد همه چیز همانطور که انتظار می رود ثبت می شود. از آنجایی که ارزش را اضافه کردید charlie به پارامترهای داده، گزارش نشان می دهد INFO: charlie وارد شدن به سرور:

یکی از راه‌هایی که یک فرد مخرب می‌تواند از روشی که این برنامه داده‌ها را ثبت می‌کند سوء استفاده کند، قرار دادن گزارش‌های نادرست از طریق data پارامتر در این مثال، تنها کاری که یک فرد مخرب باید انجام دهد این است که متن اضافی را به پرس و جو اضافه کند:

به عنوان مثال، یک فرد مخرب می تواند اضافه کند INFO: User deleted به عنوان یک گزارش نادرست وقتی تیم توسعه‌دهنده این گزارش را پیدا می‌کند، ممکن است به اشتباه هدایت شوند و زمان و منابع خود را صرف کنند تا بفهمند چرا این برنامه زمانی که کاربر یک نام کاربری ارسال می‌کند، کاربران خود را حذف می‌کند، همه اینها به این دلیل است که یک مهاجم تصمیم گرفته است کاراکترهای اضافی را در فرم ورودی کاربر درج کند.

در حالی که این مثال ساده است، به شما کمک می کند تا درک کنید که تزریق لاگ به طور کلی چیست. انواع دیگر تزریق‌ها می‌تواند شامل اضافه کردن گزارش‌های خطای نادرست یا گزارش‌های اطلاعات نادرست کاربر به سادگی با تغییر پیام گزارش یا بدتر از آن، درج دستور تزریق‌هایی باشد که به مهاجمان توانایی دستکاری مستقیم داده‌های داخلی را می‌دهد.

نحوه جلوگیری از آسیب پذیری log injection در Node.js

برای کاهش آسیب‌پذیری‌های تزریق لاگ در برنامه‌های Node.js، برخی از این روش‌های رایج را در نظر بگیرید:

ورودی های کاربر را ضد عفونی کنید

در بیشتر موارد، ورودی های کاربر باید قبل از ثبت نام، اعتبارسنجی و پاکسازی شوند. این به این معنی است که مطمئن شوید هر چیزی که قرار است ثبت شود به طور کامل بررسی شده است تا نویسه‌هایی را که با ورودی گزارش دیگری اشتباه گرفته می‌شوند حذف شود و/یا فقط شامل کاراکترهایی باشد که باید در گزارش‌ها باشد.

با استفاده از مثال قبلی، یکی از راه‌های پاک‌سازی گزارش‌ها شامل یک regex است که فیلتر می‌کند و فقط حروف الفبا را مجاز می‌کند، که از اضافه شدن کاراکترها یا اعداد خاص به گزارش جلوگیری می‌کند:

app.get(‘/log’, (req, res) => {
const userInput = req.query.data
const sanitizedInput = userInput.replace(/[^a-zA-Z]+/, ”)
console.log(‘INFO: Username: ‘, sanitizedInput);
res.send(‘Data logged successfully.’);
});

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یکی از نکات مهمی که باید به خاطر بسپارید این است که انتخاب راه درست برای پاکسازی داده ها می تواند مشکل باشد. در این مثال، شخصی با اعداد در نام کاربری خود (به عنوان مثال 123) نام کاربری آنها در گزارش ها تغییر خواهد کرد.

در حالی که ورودی‌های ضدعفونی می‌توانند به شناسایی سیاهه‌های مخرب کمک کنند، این معاوضه‌ها از توسعه‌دهندگان می‌خواهد که در مورد فیلتر کردن و روش‌های انجام آن دقت بیشتری داشته باشند. به عنوان مثال، نوشتن نادرست عبارات منظم می تواند منجر به آسیب پذیری های ReDOS شود که برنامه های Node.js را فلج می کند تا متوقف شود. استفاده از بسته های npm شخص ثالث مانند validator.js گزینه خوبی برای جلوگیری از اختراع مجدد چرخ است، اما مطمئن شوید که این وابستگی ها را به روز نگه دارید.

مراقب باشید که چه چیزی را ثبت می کنید

هر برنامه منحصر به فرد است. یک استاندارد ورود به سیستم نمی‌تواند تمام نیازهای بالقوه‌ای را که ممکن است از هر برنامه‌ای ایجاد می‌شود، در نظر بگیرد. مهم است که در نظر داشته باشید که چه اطلاعاتی برای ورود به سیستم و برای چه کسی نیاز دارید.

گزارش‌هایی که در سطح DEBUG وجود دارند می‌توانند به توسعه‌دهندگان کمک کنند تا آنچه را که در برنامه‌شان اتفاق می‌افتد و نحوه حرکت کاربر از یک مؤلفه به مؤلفه دیگر یا نحوه انتقال اطلاعات از یک منبع به منبع دیگر را ردیابی کنند. گزارش‌هایی که در سطح WARN یا ERROR وجود دارند می‌توانند به تیم‌های مهندسی کمک کنند تا اشکالات احتمالی را زودتر شناسایی کنند و بفهمند چه چیزی باعث خرابی یا عملکرد نادرست برنامه می‌شود. نکته کلیدی در اینجا این است که فقط آنچه را که نیاز دارید ثبت کنید و نه چیز دیگری در حالی که در نظر بگیرید اگر لاگ های شما توسط مهاجمان نقض شود چه اتفاقی می افتد.

همانطور که این مقاله Snyk در مورد آسیب‌پذیری‌های ورود به سیستم توضیح می‌دهد، اطلاعات حساس ارسال شده به یک سرویس ثبت‌نام خارجی می‌تواند منجر به نقض داده‌ها توسط مهاجمان شود. به طور کلی یک قانون خوب برای جلوگیری از ثبت اطلاعات حساس یا محرمانه مانند رمز عبور، کلیدهای API یا داده های شخصی است. اگر انجام می‌دهید، مطمئن شوید که کنترل‌های دسترسی مناسب را اجرا کرده‌اید و از متغیرهای محیطی (مانند GitHub Actions) و سیستم‌های مدیریت کلید برای مدیریت امن داده‌های پیکربندی حساس استفاده کنید.

علاوه بر فکر کردن در مورد آنچه که ثبت می کنید، باید نحوه ثبت آن را نیز در نظر بگیرید. گزارش‌گیری ساختاریافته می‌تواند راه سازماندهی‌تری برای ثبت داده‌ها فراهم کند که شناسایی آن برای توسعه‌دهندگان آسان‌تر است. به عنوان مثال، با توجه به مثال قبلی، به جای ثبت اطلاعات کاربر مستقیماً به عنوان یک رشته، استفاده از یک شی JSON می تواند به شما اجازه دهد تا آنچه را که ثبت می شود به روشی تمیزتر برچسب گذاری کنید:

app.get(‘/log’, (req, res) => {
const userInput = req.query.data;
const log = {username: userInput, ‘action’:’submitted username’, ‘time’: new Date()}
console.log(log)
res.send(‘Data logged successfully.’);
});

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مهمتر از آن، ساختاردهی گزارش‌ها به این روش می‌تواند تزریق لاگ‌ها را برای مهاجمان دشوارتر کند، زیرا ویژگی‌های زیادی در شی log وجود دارد که مهاجم نیز باید آنها را دستکاری کند (یعنی action یا time) و انجام ندادن این کار می تواند کاری را که مهاجم می خواهد انجام دهد را از بین ببرد:

در حالی که این گزارش‌گیری از شی JSON یک مثال ساده است، کتابخانه‌های گزارش‌گیری وجود دارد (که در ادامه بحث می‌شود) که گزارش‌گیری ساختاریافته را به عنوان جایگزین‌های مفیدی برای معمول ارائه می‌کند. console.log.

از یک کتابخانه ورود به سیستم به جای console.log استفاده کنید

بسیاری از کتابخانه‌های گزارش‌گیری مانند کنترل و امنیت بهتری بر خروجی‌های گزارش در مقایسه با console.log زیرا آنها معمولاً دارای قابلیت ضدعفونی داخلی و فیلتر برای جلوگیری از حملات تزریق لاگ هستند. آنها همچنین پرچم‌هایی را به توسعه‌دهندگان ارائه می‌دهند تا کنترل کنند کدام گزارش‌ها در چه محیطی نمایش داده می‌شوند (تست در مقابل تولید)، انعطاف‌پذیری در مورد جایی که گزارش‌ها باید ارسال شوند (فایل محلی، پایگاه داده و/یا API شخص ثالث)، و راه‌هایی برای پیکربندی لاگ هایی که ردیابی آنها را آسان تر می کند.

یکی از این کتابخانه‌هایی که توصیه می‌کنیم، pino است که به خوبی نگهداری می‌شود و یک بسته کلی سالم و بدون آسیب‌پذیری امنیتی شناخته شده است.

Pino برای عملکرد بسیار بهینه شده است و می توان آن را به گونه ای تنظیم کرد که در هر ورودی گزارش، مُهرهای زمانی گنجانده شود، از ثبت ساختار یافته و سطوح گزارش استاندارد سیستم پشتیبانی می کند. این پیچیدگی و ساختار افزوده می‌تواند امنیت را افزایش دهد و احتمال اینکه لاگ‌ها توسط مهاجمان به خطر بیفتد، کمتر می‌شود.

از پسوند snyk IDE برای VS Code برای شناسایی آسیب‌پذیری‌ها استفاده کنید

Snyk یک پسوند IDE رایگان برای Visual Studio Code (VS Code) ارائه می‌کند که می‌تواند به شما کمک کند آسیب‌پذیری‌های تزریق لاگ (در میان سایر آسیب‌پذیری‌ها) را در کد Node.js خود شناسایی کنید. در اینجا نحوه تنظیم آن آمده است:

حرکت به برنامه های افزودنی در VS Code برگه را بزنید و “Snyk” را جستجو کنید تا پسوند “Snyk Security – Code, Open Source Dependencies, Iac Configurations” را پیدا کنید. کلیک کنید نصب کنید:

پس از نصب، Snyk از شما می خواهد که با اتصال به IDE، حساب خود را احراز هویت کنید. کلیک کنید VS Code را با Snyk وصل کنید، که یک صفحه وب خارجی Snyk را باز می کند و از شما برای اتصال می خواهد. پس از رسیدن، کلیک کنید احراز هویت.

پس از احراز هویت، کلیک کنید اسکن کنید برای اسکن کد شما برای آسیب پذیری ها. همچنین می توانید پسوند را در صورت نیاز پیکربندی کنید:

پسوند Snyk IDE به طور خودکار کد شما را برای آسیب‌پذیری‌های تزریق لاگ اسکن می‌کند. بعلاوه، Snyk سایر مسائل امنیتی بالقوه، از جمله داشتن اسرار رمزگذاری شده یا آسیب‌پذیری‌های پیمایش مسیر را در کد شما در طول اسکن برجسته می‌کند و بینش‌ها و پیشنهادات عملی را برای کمک به شما در ایمن کردن برنامه‌تان ارائه می‌کند.

در بسیاری از برنامه‌های استاندارد سازمانی، گزارش‌گیری مداوم اهداف زیادی را دنبال می‌کند. این به کسب‌وکارها کمک می‌کند تا خطاها را شناسایی و اصلاح کنند، بینش‌های تحلیلی ارزشمندی ارائه می‌کند و به شما امکان می‌دهد راه‌حل‌های جدید را آزمایش کنید. با این حال، این همچنین باعث می‌شود که تزریق لاگ یکی از رایج‌ترین روش‌هایی باشد که هکرها می‌توانند اطلاعات حساس کاربر را ربوده یا حتی به آنها دسترسی پیدا کنند. آسیب‌پذیری‌ها در روش‌هایی که داده‌های گزارش برنامه‌ها می‌توانند به مهاجمان اجازه دهند تا کدهای مخرب را به گزارش‌ها تزریق کنند، که یکپارچگی و محرمانه بودن برنامه شما را به خطر می‌اندازد.

در این مقاله، شما به طور خاص به آسیب‌پذیری‌های log injection در Node.js می‌پردازید. شما نحوه عملکرد تزریق لاگ را بررسی خواهید کرد و راه های موثر برای جلوگیری از آنها را یاد خواهید گرفت.

آسیب پذیری log injection چیست؟

وقتی نوبت به ثبت اطلاعات می رسد، برخی از برنامه ها به یک فایل خارجی وارد می شوند یا به یک API خارجی که در آن گزارش ها ارسال می شوند، تکیه می کنند. تزریق گزارش زمانی اتفاق می‌افتد که مهاجم داده‌های ورودی را برای تزریق کد مخرب به گزارش‌های برنامه دستکاری می‌کند. این گزارش‌ها معمولاً برای اهداف اشکال‌زدایی، نظارت و ممیزی استفاده می‌شوند.

هنگامی که یک log injection رخ می دهد، مهاجم می تواند گزارش ها را بهم ریخته یا حتی کد را در زمینه برنامه اجرا کند که منجر به خطرات امنیتی مختلف می شود.

نمونه ای از یک برنامه آسیب پذیر Node.js

یک برنامه ساده Node.js را در نظر بگیرید که از چارچوب وب Express برای ثبت داده های ارائه شده توسط کاربر بدون اعتبارسنجی یا پاکسازی مناسب استفاده می کند. در زیر یک قطعه کد نشان دهنده این آسیب پذیری است:

const express = require('express');
const app = express();

app.get('/log', (req, res) => {
  const userInput = req.query.data;
  console.log('INFO: ' + userInput);
  res.send('Data logged successfully.');
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که این سرور به صورت محلی راه‌اندازی شد، می‌توانید با استفاده از ابزارهای تست API مانند Insomnia یک درخواست GET ارسال کنید تا بررسی کنید که آیا کارها مطابق انتظار کار می‌کنند یا خیر. در این مورد، شما در حال برنامه ریزی برای ثبت نام کاربری از یک فرم برای آزمایش ظاهر گزارش های سرور هستید. داده ها را برای مطابقت با آنچه سرور شما انتظار دارد اضافه می کنید و درخواست را ارسال می کنید. انجام این کار به شما یک 200 OK و متنی که می گوید: “داده ها با موفقیت ثبت شدند.”:


اگر گزارش های سمت سرور را بررسی کنید، به نظر می رسد همه چیز همانطور که انتظار می رود ثبت می شود. از آنجایی که ارزش را اضافه کردید charlie به پارامترهای داده، گزارش نشان می دهد INFO: charlie وارد شدن به سرور:

https%3A%2F%2Fdev to
یکی از راه‌هایی که یک فرد مخرب می‌تواند از روشی که این برنامه داده‌ها را ثبت می‌کند سوء استفاده کند، قرار دادن گزارش‌های نادرست از طریق data پارامتر در این مثال، تنها کاری که یک فرد مخرب باید انجام دهد این است که متن اضافی را به پرس و جو اضافه کند:

https%3A%2F%2Fdev to
https%3A%2F%2Fdev to
به عنوان مثال، یک فرد مخرب می تواند اضافه کند INFO: User deleted به عنوان یک گزارش نادرست وقتی تیم توسعه‌دهنده این گزارش را پیدا می‌کند، ممکن است به اشتباه هدایت شوند و زمان و منابع خود را صرف کنند تا بفهمند چرا این برنامه زمانی که کاربر یک نام کاربری ارسال می‌کند، کاربران خود را حذف می‌کند، همه اینها به این دلیل است که یک مهاجم تصمیم گرفته است کاراکترهای اضافی را در فرم ورودی کاربر درج کند.

در حالی که این مثال ساده است، به شما کمک می کند تا درک کنید که تزریق لاگ به طور کلی چیست. انواع دیگر تزریق‌ها می‌تواند شامل اضافه کردن گزارش‌های خطای نادرست یا گزارش‌های اطلاعات نادرست کاربر به سادگی با تغییر پیام گزارش یا بدتر از آن، درج دستور تزریق‌هایی باشد که به مهاجمان توانایی دستکاری مستقیم داده‌های داخلی را می‌دهد.

نحوه جلوگیری از آسیب پذیری log injection در Node.js

برای کاهش آسیب‌پذیری‌های تزریق لاگ در برنامه‌های Node.js، برخی از این روش‌های رایج را در نظر بگیرید:

ورودی های کاربر را ضد عفونی کنید

در بیشتر موارد، ورودی های کاربر باید قبل از ثبت نام، اعتبارسنجی و پاکسازی شوند. این به این معنی است که مطمئن شوید هر چیزی که قرار است ثبت شود به طور کامل بررسی شده است تا نویسه‌هایی را که با ورودی گزارش دیگری اشتباه گرفته می‌شوند حذف شود و/یا فقط شامل کاراکترهایی باشد که باید در گزارش‌ها باشد.

با استفاده از مثال قبلی، یکی از راه‌های پاک‌سازی گزارش‌ها شامل یک regex است که فیلتر می‌کند و فقط حروف الفبا را مجاز می‌کند، که از اضافه شدن کاراکترها یا اعداد خاص به گزارش جلوگیری می‌کند:

app.get('/log', (req, res) => {
  const userInput = req.query.data
  const sanitizedInput = userInput.replace(/[^a-zA-Z]+/, '')
  console.log('INFO: Username: ', sanitizedInput);
  res.send('Data logged successfully.');
});

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0tmn3ipvl4ufukzfdon
یکی از نکات مهمی که باید به خاطر بسپارید این است که انتخاب راه درست برای پاکسازی داده ها می تواند مشکل باشد. در این مثال، شخصی با اعداد در نام کاربری خود (به عنوان مثال 123) نام کاربری آنها در گزارش ها تغییر خواهد کرد.

در حالی که ورودی‌های ضدعفونی می‌توانند به شناسایی سیاهه‌های مخرب کمک کنند، این معاوضه‌ها از توسعه‌دهندگان می‌خواهد که در مورد فیلتر کردن و روش‌های انجام آن دقت بیشتری داشته باشند. به عنوان مثال، نوشتن نادرست عبارات منظم می تواند منجر به آسیب پذیری های ReDOS شود که برنامه های Node.js را فلج می کند تا متوقف شود. استفاده از بسته های npm شخص ثالث مانند validator.js گزینه خوبی برای جلوگیری از اختراع مجدد چرخ است، اما مطمئن شوید که این وابستگی ها را به روز نگه دارید.

مراقب باشید که چه چیزی را ثبت می کنید

هر برنامه منحصر به فرد است. یک استاندارد ورود به سیستم نمی‌تواند تمام نیازهای بالقوه‌ای را که ممکن است از هر برنامه‌ای ایجاد می‌شود، در نظر بگیرد. مهم است که در نظر داشته باشید که چه اطلاعاتی برای ورود به سیستم و برای چه کسی نیاز دارید.

گزارش‌هایی که در سطح DEBUG وجود دارند می‌توانند به توسعه‌دهندگان کمک کنند تا آنچه را که در برنامه‌شان اتفاق می‌افتد و نحوه حرکت کاربر از یک مؤلفه به مؤلفه دیگر یا نحوه انتقال اطلاعات از یک منبع به منبع دیگر را ردیابی کنند. گزارش‌هایی که در سطح WARN یا ERROR وجود دارند می‌توانند به تیم‌های مهندسی کمک کنند تا اشکالات احتمالی را زودتر شناسایی کنند و بفهمند چه چیزی باعث خرابی یا عملکرد نادرست برنامه می‌شود. نکته کلیدی در اینجا این است که فقط آنچه را که نیاز دارید ثبت کنید و نه چیز دیگری در حالی که در نظر بگیرید اگر لاگ های شما توسط مهاجمان نقض شود چه اتفاقی می افتد.

همانطور که این مقاله Snyk در مورد آسیب‌پذیری‌های ورود به سیستم توضیح می‌دهد، اطلاعات حساس ارسال شده به یک سرویس ثبت‌نام خارجی می‌تواند منجر به نقض داده‌ها توسط مهاجمان شود. به طور کلی یک قانون خوب برای جلوگیری از ثبت اطلاعات حساس یا محرمانه مانند رمز عبور، کلیدهای API یا داده های شخصی است. اگر انجام می‌دهید، مطمئن شوید که کنترل‌های دسترسی مناسب را اجرا کرده‌اید و از متغیرهای محیطی (مانند GitHub Actions) و سیستم‌های مدیریت کلید برای مدیریت امن داده‌های پیکربندی حساس استفاده کنید.

علاوه بر فکر کردن در مورد آنچه که ثبت می کنید، باید نحوه ثبت آن را نیز در نظر بگیرید. گزارش‌گیری ساختاریافته می‌تواند راه سازماندهی‌تری برای ثبت داده‌ها فراهم کند که شناسایی آن برای توسعه‌دهندگان آسان‌تر است. به عنوان مثال، با توجه به مثال قبلی، به جای ثبت اطلاعات کاربر مستقیماً به عنوان یک رشته، استفاده از یک شی JSON می تواند به شما اجازه دهد تا آنچه را که ثبت می شود به روشی تمیزتر برچسب گذاری کنید:

app.get('/log', (req, res) => {
  const userInput = req.query.data;
  const log = {username: userInput, 'action':'submitted username', 'time': new Date()}
  console.log(log)
  res.send('Data logged successfully.');
});

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مهمتر از آن، ساختاردهی گزارش‌ها به این روش می‌تواند تزریق لاگ‌ها را برای مهاجمان دشوارتر کند، زیرا ویژگی‌های زیادی در شی log وجود دارد که مهاجم نیز باید آنها را دستکاری کند (یعنی action یا time) و انجام ندادن این کار می تواند کاری را که مهاجم می خواهد انجام دهد را از بین ببرد:

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fres3m7q5s1ibglhagiiy
در حالی که این گزارش‌گیری از شی JSON یک مثال ساده است، کتابخانه‌های گزارش‌گیری وجود دارد (که در ادامه بحث می‌شود) که گزارش‌گیری ساختاریافته را به عنوان جایگزین‌های مفیدی برای معمول ارائه می‌کند. console.log.

از یک کتابخانه ورود به سیستم به جای console.log استفاده کنید

بسیاری از کتابخانه‌های گزارش‌گیری مانند کنترل و امنیت بهتری بر خروجی‌های گزارش در مقایسه با console.log زیرا آنها معمولاً دارای قابلیت ضدعفونی داخلی و فیلتر برای جلوگیری از حملات تزریق لاگ هستند. آنها همچنین پرچم‌هایی را به توسعه‌دهندگان ارائه می‌دهند تا کنترل کنند کدام گزارش‌ها در چه محیطی نمایش داده می‌شوند (تست در مقابل تولید)، انعطاف‌پذیری در مورد جایی که گزارش‌ها باید ارسال شوند (فایل محلی، پایگاه داده و/یا API شخص ثالث)، و راه‌هایی برای پیکربندی لاگ هایی که ردیابی آنها را آسان تر می کند.

یکی از این کتابخانه‌هایی که توصیه می‌کنیم، pino است که به خوبی نگهداری می‌شود و یک بسته کلی سالم و بدون آسیب‌پذیری امنیتی شناخته شده است.

Pino برای عملکرد بسیار بهینه شده است و می توان آن را به گونه ای تنظیم کرد که در هر ورودی گزارش، مُهرهای زمانی گنجانده شود، از ثبت ساختار یافته و سطوح گزارش استاندارد سیستم پشتیبانی می کند. این پیچیدگی و ساختار افزوده می‌تواند امنیت را افزایش دهد و احتمال اینکه لاگ‌ها توسط مهاجمان به خطر بیفتد، کمتر می‌شود.

از پسوند snyk IDE برای VS Code برای شناسایی آسیب‌پذیری‌ها استفاده کنید

Snyk یک پسوند IDE رایگان برای Visual Studio Code (VS Code) ارائه می‌کند که می‌تواند به شما کمک کند آسیب‌پذیری‌های تزریق لاگ (در میان سایر آسیب‌پذیری‌ها) را در کد Node.js خود شناسایی کنید. در اینجا نحوه تنظیم آن آمده است:

حرکت به برنامه های افزودنی در VS Code برگه را بزنید و “Snyk” را جستجو کنید تا پسوند “Snyk Security – Code, Open Source Dependencies, Iac Configurations” را پیدا کنید. کلیک کنید نصب کنید:

https%3A%2F%2Fdev to
پس از نصب، Snyk از شما می خواهد که با اتصال به IDE، حساب خود را احراز هویت کنید. کلیک کنید VS Code را با Snyk وصل کنید، که یک صفحه وب خارجی Snyk را باز می کند و از شما برای اتصال می خواهد. پس از رسیدن، کلیک کنید احراز هویت.

پس از احراز هویت، کلیک کنید اسکن کنید برای اسکن کد شما برای آسیب پذیری ها. همچنین می توانید پسوند را در صورت نیاز پیکربندی کنید:

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0coprd5svsryliwst9qj
پسوند Snyk IDE به طور خودکار کد شما را برای آسیب‌پذیری‌های تزریق لاگ اسکن می‌کند. بعلاوه، Snyk سایر مسائل امنیتی بالقوه، از جمله داشتن اسرار رمزگذاری شده یا آسیب‌پذیری‌های پیمایش مسیر را در کد شما در طول اسکن برجسته می‌کند و بینش‌ها و پیشنهادات عملی را برای کمک به شما در ایمن کردن برنامه‌تان ارائه می‌کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا