İnşaat & Yapısal Mühendislik
Nasıl Javascript'i Cross-site Şakasını Önlemek (xs) Saldırıları önlemek için nasıl kullanılır
Table of Contents
Cross-Site scripting (XSS) ve JavaScript Savunmalara Giriş
Cross-site senaryosu (XSS) en yaygın web güvenlik güvenlik güvenlik güvenliklerinden biridir, OWASP Top 10. Bir XSS saldırısı, diğer kullanıcılar tarafından görüntülenen ve önlemek için bir saldırganın yönlendirmesine izin verir.Bu makale, JavaScript'i kullanarak uygulamalarınızı XSS'den korumayı sağlar.
XSS'nin Üç Türünü Anlayın
Önlemeye başlamadan önce, XSS'nin üç birincil kategorisini anlamak önemlidir: depolanmış, yansıtılır ve DOM tabanlı. Her biri biraz farklı bir algılama ve önleme yaklaşımı gerektirir.
Stored XSS
Mağazalı (eski) XSS, kötü niyetli girişin sunucuda kalıcı olarak saklandığında (örneğin, bir veritabanında, forum post veya yorumda) ve daha sonra uygun bir şekilde sanitizasyon olmadan kullanıcılara hizmet eder.
Yanmış XSS
Yanlı XSS, kötü niyetli bir senaryonun bir web sunucusundan yansıttığı zaman gerçekleşir, genellikle bir URL parametresi veya form sunumu aracılığıyla bir kurbanı bir araya getirir ve kod hemen enjekte edilir.XSS aksine, ödeme yükü devam etmez.
DOM-Based XSS
DOM tabanlı XSS, tamamen müşteri odaklı bir kırılganlıktır. Saldırı, kurbanın tarayıcıdaki DOM ortamını modlar. Kötü niyetli kod asla sunucuya dokunmuyor; bu güvenli bir şekilde kullanıcı girişiyle ilgili JavaScript'den kaynaklanır (örneğin, [[DüzD:0).
XSS Saldırılarını JavaScript tespiti ile takip etmek
Tespit, hasar meydana gelmeden şüpheli aktivite tanımlamakla ilgilidir. JavaScript kullanıcı girişlerini izleyebilir, DOM mutasyonlarını takip edebilir ve giriş noktalarında verileri doğrulayabilir.Müşteri-ön algılaması tüm saldırıları yakalayamaz (özellikle saldırgan zanaatlar doğrudan sunucuya talep ederse), değerli bir ilk savunma hattı sağlar.
Giriş Geçerlilik ve Sanitization
Her zaman işlem yapmadan önce kullanıcı girişlerini doğrulayın ve sanitize edin.UseFLT:3), senaryo yürütmesini önlemek için. Aşağıdaki işlev şeritleri tehlikeli karakterler bir dizeden önlemek için:
function sanitizeInput(input) {
const div = document.createElement('div');
div.textContent = input;
return div.innerHTML;
}
Bu, HTML etiketleri ile ilgili herhangi bir HTML özel karakterin (örneğin, [[DÜDÜDÜSÜSÜŞÜN) kaç versiyonlarını içerir.
Suspicious Elements için DOM Mutations
Saldırılar genellikle etiketler veya olay eller enjekte eder ([[Dönemli: 9) DOM. TANITI: Ayrıntılı element eklemeleri için izleyebilirsiniz.
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 });
[FONT:0)Caution:[Dönetici:[Dönetici:0) Bloklama senaryoları, akıllı saldırganlar tarafından atılabilir ve meşru işlevselliği kırılabilir. birincil önleme mekanizması yerine bir izleme aracı olarak kullanın.
URL'yi doğrulama ve Parametreleri gönder
DOM tabanlı XSS için, URL bileşenleri güvenle kullanım [[DÜŞEKKESE:17) ve doğrudan HTML'ye değer eklemekten kaçının: executable kodu geçmek için:
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 Saldırılarını JavaScript ile önlemek
Önleme çok katmanlı bir yaklaşım gerektirir. JavaScript tek başına bir uygulamayı tamamen garanti edemez, ancak doğru geri dönüş yaptırımı ve [[0)Content Security Policy (CSP)) .
Encode All User-Controlled Data Before adding into DOM
Altın kuralı: Hiçbir zaman doğrudan DOM'ya emanet edilmemiş verileri eklemeyin. içHTML yerine güvenli DOM yöntemlerini kullanın.
(Allah’a) yemin ederim ki,
const userInput = getUserInput();
const safeText = document.createTextNode(userInput);
document.getElementById('output').appendChild(safeText);
Bir Kütüphane ile Yapmalısınız.
HTML'yi (örneğin, zengin bir metin editöründen) kesinlikle yapmanız gerekiyorsa, güvenli HTML'yi korurken güvenilir bir sanitizasyon kütüphanesine güvenir.). DOMPurify yaygın olarak kullanılan, kötü niyetli bir kütüphanedir.
// 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, girişleri, tehlikeli etiketleri ve özellikleri parlar ve geri döndürür ve yalnızca elementlere izin verir.ETHFLT:0)View DOMPurify on GitHub).
Tehlikeli JavaScript Fonksiyonlarlarından Kaçın
XSS'nin izin vermesine veya kesinlikle kontrol etmesine izin veren bazı JavaScript yöntemleri ve özellikler ünlüdür:
- [FONT:0] - kullanım veya düzgün bir şekilde cezalandırıl.
- [FONT:0] [FONT:0] [FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=)
- [FONT:0]). - kullanıcı girişi ile asla kullanılma.
- [FONT:0] - herhangi bir giriş koncatense sömürülebilir.
- [FONT:0] / [[Dönder kod[Dönetici: 1)[*|)[>
- [FONT:0] ([Dönetici: 9)))[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=)
Uygulama Content Security Policy (CSP) JavaScript üzerinden uygulamanız mı?
CSP, hangi senaryoların çalıştırabileceğini kısıtlayan bir tarayıcı mekanizmasıdır. Genellikle HTTP başlıklarıyla ayarlanır, ancak bunu asla kontrol eden bir saldırgandır.If you can also set it using aOSPFLT:34} tag or via JavaScript by dynamically creating aİLFLT:35) element. ancak, CSP'yi JavaScript'i JavaScript'i sayfada oluşturmak daha az güvenlidir çünkü zaten bir kontrole sahip bir saldırgan bunu her zaman tercih edebilir.If you must use JavaScript to implement JavaScript to implement operator by dynamically creating it very early in page
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);
Üretim için, CSP web sunucunuzda yapılandırın veya proxy.ETHFLT:0)MDN CSP belgeleri) kapsamlı bir rehberlik sağlar.
Ek Güvenlik Önlemleri
JavaScript'e özgü taktiklerin ötesinde, tam bir XSS önleme stratejisi bu kritik önlemleri içerir:
- [FONT:0)Always sunucu tarafında doğrulanır.[DDD: 1) Müşteri tarafı geçerliliği atılabilir. asla güven müşteri verilerine güvenmeyin.
- [FONT:0) uygun HTTP yanıtlarını kullanın.[[Dönetici: 9) [FONT: 9) ve özellikle de [[FONT|S][/FONT=FONT=FONT=3][/FONT=)
- [FONT:0)Output, kullanıcı verilerini her seferinde kodlar.) Context önemlidir: HTML varlıklar için kod, URL encoding, JavaScript string kodlama, vb.
- [[Döneticiler güncelleniyor.[DÜDÜDÜDÜDÜDÜSÜŞÜNCÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ
- [FONT:0) XSS koruması ile çerçeveler kullanın.[Dönetici:0) Regular ve Vue otomatik olarak varsayılan olarak çıktıktan kaçınır. Yine de, [[Ücretsizler ve İZFLT:40) veya [[DÜŞÜNDÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ
- [FONT=0) Katı bir CSP'yi (Dönetici) Değiştirin;[Dönetici:0) Eğer mümkünse, doğru olmayan veya inline senaryolar için inceler.
Gerçek Dünya Örneği: Güvenli Yorum
Kullanıcıların başkalarına gösterilen mesajları gönderdiği bir blog yorum sistemi düşünün. Bir saldırgan, geri dönüşle entegre eden bir JavaScript yaklaşımı:
- [FONT:0]Frontend teslim:[Dönetici:[Dönetici:[Döntme:0)[Dönemli teslimiyet:[Dönemli)[[[Dönemli))
- [[0)Server verileri döndürür:[Dönetici:[Dönder:0) Geri dönüş HTML-encode yorum metnini şifrelemeli.
- [FONT:0)Client formu:[[Dönetici:[Dönetici: · 1) UseurFLT:46 veya güvenli bir şablon motoru kullanın. asla ham kullanıcı verileri ile [[ŞUFONTD:47T: 377)
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);
}
Savunmalarınızı Test Etmek
Önlemeyi uygulamadan sonra, uygulamanızı otomatik tarayıcılar ve manuel ödeme yüklerini test edin. Ortak test vektörleri şunları içerir:
- (Resulüm)
- (Kırk)
- [FONT]
- [FONT][/FONT][/FONT][/FONT][/FONT][/FONT][/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT/FONT)
- (Allah’a) yemin ederim.
DOM'u incelemek ve ücret yüklerinin kaçmasını sağlamak için tarayıcı geliştirici araçları kullanın. Ayrıca, CSP uygulamasını ihlal raporları için konsolu kontrol ederek test edin.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Cross-site senaryosu ciddi bir tehdit olarak kalır, ancak JavaScript hem tespit hem de önleme için güçlü araçlar sunar.Sesleme girişleri, izleme DOM değişiklikleri, çıkıştan kaçmak ve DOMPurify gibi sağlam kütüphanelerle entegrasyon, müşterinizin öne çıkmasını önemli ölçüde zorlayabilirsiniz.Bu istemcinin dışsal önlemlerinin bir gümüş mermi olmadığını unutmayın; sunucunun yönlendirmesini içeren bir savunma stratejisini tamamlıyorlar, CSP başlıkları ve düzenli güvenlik denetimlerini içeren, sık sık sık sık sık sık sık sık sık sık kalın.
Daha fazla okuma için, [[0)OWASP XSS sayfasına bakınız[Dönetici:2) ve [FONTXSS Önleme Hile Belgesi).