Table of Contents
مقدمه ای بر اسکریپت نویسی Cross-Site (XSS) و دفاع از جاوا اسکریپت
اسکریپت نویسی Cross-site (XSS) یکی از رایج ترین آسیب پذیری های امنیت وب است که به طور مداوم در OWASP Top 10 رتبه بندی می شود. An XSS حمله به مهاجم اجازه می دهد تا اسکریپت های جانبی مخرب را به صفحات وب مشاهده شده توسط کاربران دیگر تزریق کند، این اسکریپت ها می توانند توکن های جلسه را سرقت کنند، کاربران را به سایت های فیشینگ، صفحات چهره یا نصب بدافزار، در حالی که سرور آماده سازی برای محافظت از یک برنامه های کلیدی در این نقش کلیدی و هدایت کننده در این برنامه های کلیدی در این برنامه های کلیدی برای جلوگیری از این برنامه های کلیدی در این برنامه های کاربر برای جلوگیری از این برنامه های کلیدی و هدایت می کند.
درک سه نوع XSS
قبل از غواصی در پیشگیری، ضروری است که سه دسته اصلی XSS را درک کنید: ذخیره شده، منعکس شده و DOM-based هر کدام نیاز به یک روش تشخیص و پیشگیری کمی متفاوت دارند.
ذخیره XSS
ذخیره (مسترس) XSS زمانی رخ می دهد که ورودی مخرب به طور دائمی در سرور ذخیره می شود (به عنوان مثال، در پایگاه داده، پست انجمن یا نظر) و بعدا به کاربران بدون اطمینان مناسب خدمت می کند. محموله حمله در مرورگر هر کسی که محتوای ذخیره شده را مشاهده می کند اجرا می شود.
XSS
منعکس شده XSS زمانی اتفاق می افتد که اسکریپت مخرب از یک سرور وب منعکس می شود، به طور معمول از طریق یک پارامتر URL یا ارسال فرم، مهاجم یک قربانی را به کلیک بر روی یک لینک ساخته شده، و کد تزریق شده بلافاصله بر خلاف XSS ذخیره شده، بار ادامه نمی دهد.
DOM-based XSS
DOM-based XSS یک آسیب پذیری کاملاً مشتری است. [۱] محموله حمله محیط DOM را در مرورگر قربانی اصلاح می کند.کد مخرب هرگز سرور را لمس نمی کند؛ از جاوا اسکریپت مشتری-side سرچشمه می گیرد که به طور غیر ایمن ورودی کاربر را کنترل می کند (به عنوان مثال، خواندن از ، ، یا ).
شناسایی حملات XSS با جاوا اسکریپت
تشخیص در مورد شناسایی فعالیت های مشکوک قبل از وقوع آسیب است. جاوا اسکریپت می تواند ورودی های کاربر را نظارت کند، جهش های DOM را ردیابی کند و داده ها را در نقاط ورودی معتبر کند، در حالی که تشخیص مشتری نمی تواند تمام حملات را به دست آورد (به ویژه اگر مهاجم مستقیماً به سرور درخواست کند)، این یک خط اول ارزشمند دفاع را فراهم می کند.
اعتبار ورودی و سانیتاسیون
همیشه قبل از پردازش، ورودی های کاربر را در سمت مشتری تأیید و ایمن کنید.از به جای برای جلوگیری از اجرای اسکریپت استفاده کنید.
function sanitizeInput(input) {
const div = document.createElement('div');
div.textContent = input;
return div.innerHTML;
}
این کار به این دلیل است که تنظیم (FLT:6) تگ های HTML را تفسیر نمی کند؛ بلکه همه چیز را به عنوان متن ساده، در نتیجه (FLT-7) شامل نسخه های فرار از هر کاراکتر خاص HTML (به عنوان مثال، ، ، است.
نظارت بر DOM Mutations for Suspicious Elements
مهاجمان اغلب برچسب ها یا دستگاه های رویداد ( را به DOM تزریق می کنند.
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1) { // element node
if (node.tagName === 'SCRIPT') {
console.warn('Potential XSS: a script element was injected via DOM.');
node.remove(); // or log and analyze
}
// Check for dangerous attributes
if (node.hasAttribute('onerror') || node.hasAttribute('onload')) {
console.warn('Suspicious event handler attribute detected.');
}
}
});
});
});
observer.observe(document.body, { childList: true, subtree: true });
[FLT: 1] اسکریپت های مسدود کننده از طریق می تواند توسط مهاجمان هوشمند دور ریخته و ممکن است عملکرد مشروع را شکستن این به عنوان یک ابزار نظارت به جای یک مکانیسم پیشگیری اولیه استفاده کنید.
اعتبارسنجی URL و Hash پارامترها
برای XSS مبتنی بر DOM، اجزای URL را با خیال راحت با استفاده از بخوانید و از قرار دادن مستقیم مقادیر به HTML اجتناب کنید.
const params = new URLSearchParams(window.location.search);
const userParam = params.get('name');
if (userParam && /[<>"'\/]/.test(userParam)) {
console.warn('Potential XSS in parameter: ' + userParam);
// Do not use this value in the DOM without encoding
}
جلوگیری از حملات XSS با جاوا اسکریپت
پیشگیری نیاز به یک رویکرد چند لایه ای دارد. جاوا اسکریپت به تنهایی نمی تواند به طور کامل یک برنامه را امن کند، اما هنگامی که با استفاده از sanitization مناسب و (FLT:0) سیاست امنیت محتوا (CSP) ترکیب شود ، به طور چشمگیری خطر را کاهش می دهد.
رمزگذاری تمام داده های کنترل شده کاربر قبل از ورود به DOM
قانون طلایی: هرگز داده های غیر قابل اعتماد را به طور مستقیم به DOM وارد نکنید.از روش های امن DOM به جای HTML داخلی استفاده کنید.
استفاده از [[FLT 19]] یا [[FLT 20]]
const userInput = getUserInput();
const safeText = document.createTextNode(userInput);
document.getElementById('output').appendChild(safeText);
هنگامی که شما باید از [FLT 22] استفاده کنید، با یک کتابخانه
اگر شما کاملا نیاز به ارائه HTML (به عنوان مثال، از یک ویرایشگر متن غنی)، بر یک کتابخانه معتبر مانند تکیه کنید DOMPurify یک کتابخانه به طور گسترده مورد استفاده، کتابخانه آزمایش شده است که کد مخرب را حذف می کند در حالی که حفظ HTML امن است.
// Example with DOMPurify (install via npm or CDN)
const dirty = '<img src=x onerror="alert(1)">';
const clean = DOMPurify.sanitize(dirty);
document.getElementById('content').innerHTML = clean;
DOMPurify با تجزیه و تحلیل ورودی، حذف تگ های خطرناک و ویژگی های آن و بازگشت تنها عناصر مجاز کار می کند. View DOMPurify در GitHub
اجتناب از عملکرد های جاوا اسکریپت خطرناک
برخی از روش ها و خواص جاوا اسکریپت برای فعال کردن XSS یا کنترل دقیق بدنام هستند:
- [در این باره] [FLT: 1 ] [ از یا به درستی [از آن] استفاده کنید.
- [در این باره] [FLT26 [FLT 27] [FLT: 1 ] [ [ [ [x]] [و [در این میان] [بر [و]] [و [از این رو] [بر [بر]] [و [بر [و]]] [و [به]]] [و [از [و]]] [و [به [و]]] [و [و [و]] [و [و [و [و [و]]]]]]] [و [از [و [از [و [و [و [و [و [و]]]]]]]]]] [و [و [و [و [و [و [و [و [بر [از [و [و [و [از [بر [و [و [و [از [و]]]]]]]]] [از [از [از [از [از [از [بر [بر [بر [بر [از [و [و [و [و]]]]]]]]]]]]]]] [از [و [از [و [و [و [بر
- [[۱] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۳] [۱۰] [۳] [۱۰] [۳] [۳] [۶] [۶] [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر روی]]]]] کاربر]]]]] [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر]]]] کاربر]]]]]]]]] [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر روی [بر [بر [بر [
- [در این صورت] [FLT 29] [FLT 1:1] [در صورت وقوع هر گونه ورودی، می تواند مورد بهره برداری قرار گیرد.
- [FLT: 30] / [FLT 31] با کد رشته اجتناب کنید؛ به جای استفاده از ارجاعات تابع استفاده کنید.
- [[ویرایش] [۱] [۱۰] [۱۰] [۱۰] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳
پیاده سازی سیاست امنیت محتوا (CSP) از طریق جاوا اسکریپت
CSP یک مکانیسم مرورگر است که محدود می کند که اسکریپت ها می توانند اجرا کنند.این معمولا از طریق هدرهای HTTP تنظیم می شود، اما شما همچنین می توانید آن را با استفاده از یک تگ یا از طریق جاوا اسکریپت با ایجاد یک عنصر پویا (FLT:35) تنظیم کنید، تنظیم CSP در جاوا اسکریپت کمتر امن است زیرا مهاجم که قبلا کنترل آن را دارد، همیشه ترجیح می دهد که در هنگام استفاده از آن استفاده کنید (به عنوان مثال،).
const meta = document.createElement('meta');
meta.httpEquiv = 'Content-Security-Policy';
meta.content = "default-src 'self'; script-src 'self' 'unsafe-inline'"; // Be very careful with 'unsafe-inline'
document.head.appendChild(meta);
برای تولید، پیکربندی CSP در سرور وب یا پروکسی معکوس (FLT:0) مستندات CSP را فراهم می کند هدایت جامع.
تدابیر امنیتی اضافی
فراتر از تاکتیک های خاص جاوا اسکریپت، یک استراتژی پیشگیری از XSS کامل شامل این اقدامات حیاتی است:
- همیشه در سمت سرور اعتبار می یابد.[۱۰] اعتبار مشتری-side را می توان دور زد.
- [در این باره] از عبارت های مناسب برای پاسخ به HTTP استفاده کنید.[۱۰] [۱۰] [۱۰] [۳] [۳] [۳] [۳] [۳] [۳]
- کدگذاری هر بار که شما داده های کاربر را ارائه می دهید.[۱۰] موضوعات: کدگذاری برای نهادهای HTML، رمزگذاری URL، رمزگذاری رشته جاوا اسکریپت و غیره.
- حفظ وابستگی به روز کتابخانه های قابل آسیب پذیری جاوا اسکریپت (به عنوان مثال، نسخه های قدیمی تر از jQuery) یک بردار XSS مشترک هستند.استفاده از ممیزی npm یا ابزارهای مشابه.
- (فَلَهُمْهُمَهُمَهُمَهُوا وَهُمَهُوا وَهُمَهُوا مَنَّا مَنَهُمْهُمَهُوا بِهَهَهُمَهُمَهُمَهُمَهُمَهُمَهُمَهُوا مَهُمْهُوا مَهُمَهُمْهُوا مِهُمْهُوا مَهُمْهُمَهُمَهُمْهُمْهُمْهُوَهُمْهُوَهُمَهُوا مَهُوَهُمَهُوا مَهُمَهُمَهُمْهُوا مَهُوَهُمَهُمَهُوَهُوَهُوَهُوَهُوَهُوَهُوَهُوَهُوا مَ
- [در این صورت] [از [و] [از [و] [به] [و]] [از [و] [و [از [و]] [و [از [و]]] [و [از [و]]]] [و [از [و]]] [و [از [و]]] [از [و]] [از [و]]] [به [و [و]]]]]]] [از [از [و [و [و [از [از [از [و [و] [از [و [از [و [و]]]]]] [از [و [و [از [و]]]]]]]]] [و [و [و [از [از [از [از [و [و [از [از [از [و [و]]]]]]]]]]]] [از [از [از [از [از [از [از [از [از [از [از [از [از [و]] [و] [و [و [و] [و] [از [از [از [از [از [و]]] [و [و
مثال واقعی جهانی: Secure comment
یک سیستم نظر وبلاگ را در نظر بگیرید که کاربران پیام هایی را که به دیگران نشان داده شده است ارسال می کنند.یک مهاجم ممکن است سعی کند (FLT:44) را وارد کند، در اینجا یک رویکرد جاوا اسکریپت است که با backend ادغام می شود:
- [در این باره] [FLT: 1 ] [ قبل از ارسال به سرور] از استفاده کنید (اما سرور هنوز باید از آن استفاده کند).
- Server داده ها را باز می گرداند؛ backend باید HTML-encode متن نظر.
- رندر مستقیم: استفاده از و یا یک موتور قالب امن هرگز استفاده کنید با داده های کاربر خام.
function renderComment(comment) {
const item = document.createElement('div');
item.className = 'comment';
const body = document.createElement('p');
body.textContent = comment.body; // escaped by browser
item.appendChild(body);
document.getElementById('comments').appendChild(item);
}
تست دفاعی شما
پس از پیاده سازی پیشگیری، درخواست خود را با استفاده از اسکنرهای خودکار و محموله های دستی تست کنید:
- [در برابر ]
- [در این میان]
- [[ویرایش]
- [[ویرایش]
- [FLT 53]
از ابزارهای توسعه دهنده مرورگر برای بررسی DOM و اطمینان از محموله ها استفاده کنید و همچنین با چک کردن کنسول برای گزارش های نقض، اجرای CSP را آزمایش کنید.
نتیجه گیری
اسکریپت نویسی Cross-site همچنان یک تهدید جدی است، اما جاوا اسکریپت ابزار قدرتمندی برای تشخیص و پیشگیری از آن ارائه می دهد.با اطمینان از ورودی ها، نظارت بر تغییرات DOM، خروجی و ادغام با کتابخانه های قوی مانند DOMPurify، شما می توانید به طور قابل توجهی امنیت مشتری خود را سخت کنید، به یاد داشته باشید که اقدامات مشتری یک گلوله نقره نیست؛ آنها یک استراتژی دفاع عمیق را تکمیل می کنند که شامل کتابخانه های نظارت منظم، و هدر دادن زمان حسابرسی منظم است.
در این هنگام، با |ASP XSS]] و و OWASP XSS Prevention Remake Sheet مشورت کنید.