XSS (Cross-Site Scripting) Nedir?
XSS (Cross-Site Scripting), saldırganın bir web uygulamasına zararlı JavaScript kodu enjekte ederek bu kodun başka kullanıcıların tarayıcısında çalıştırılmasını sağlayan bir güvenlik açığıdır. XSS saldırıları doğrudan tarayıcıyı hedef alır ancak genellikle backend tarafında kullanıcı girdilerinin yeterince kontrol edilmemesi sonucu ortaya çıkar.
XSS Nasıl Oluşur?
Kullanıcıdan alınan veriler (form, URL parametresi, yorum alanları gibi) herhangi bir filtreleme veya kaçış (escape) işlemi uygulanmadan HTML içerisine gömülürse, tarayıcı bu verileri kod olarak çalıştırabilir.
XSS Neden Tehlikelidir?
XSS saldırıları ile kullanıcıların oturum bilgileri (cookie, session, token) çalınabilir, kullanıcı adına işlem yapılabilir, zararlı yönlendirmeler gerçekleştirilebilir ve kullanıcılar farkında olmadan istismar edilebilir.
XSS Türleri
- Reflected XSS: Anlık olarak response içinde çalışır.
2. Stored XSS: Veritabanına kaydedilir ve herkese çalışır.
3. DOM XSS: Frontend JavaScript kaynaklıdır.
XSS Nasıl Engellenir?
- Kullanıcı girdileri her zaman güvensiz kabul edilmelidir.
• HTML özel karakterleri escape edilmelidir (<, >, &, “, ‘).
• Güvenilir kütüphaneler (xss, dompurify) veya template engine’ler kullanılmalıdır.
• Modern framework’lerin varsayılan escape mekanizmalarından faydalanılmalıdır.
Özet
XSS, backend’de yapılan küçük bir kontrol hatasının frontend’de ciddi güvenlik problemlerine yol açmasına neden olur. Doğru filtreleme ve güvenli render yöntemleri kullanılarak etkili şekilde engellenebilir.
Şimdi bir html form tasarlayıp bu formu xss saldırısından nasıl engelleyeceğimizi Node js ile yapalım.
İlk olarak bir node js projesi oluşturuyoruz.
terminalde npm init -y komutu ile package.json oluşturuyoruz.
Daha sonra npm install express ile express frameworku kuruyoruz.
server.js isimli dosyamızı oluşturduktan sonra şimdi html form page oluşturuyoruz.
index.html isimli dosya içeriği;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Xss denem</title> </head> <body> <form method="POST" action="login"> Kullanıcı Adı: <input type="text" name="username" /> <br /> E-posta: <input type="text" name="email"> <br /> <input type="submit" name="gonder" /> </form> </body> </html>
şimdi de server.js dosyası içerisinde html form ile post edilen dataları kontrol edelim.
const express = require('express');
const app = express();
const PORT = 3000;
// formdan gelen veriyi okuyabilmek için
app.use(express.urlencoded({ extended: true }));
// basit html escape fonksiyonu (XSS ENGELLEYİCİ)
function escapeHtml(text) {
return text
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
// formu göster
app.get("/", (req, res) => {
res.sendFile(process.cwd() + "/index.html");
});
app.get("/login", (req, res) => {
res.sendFile(process.cwd() + "/index.html");
});
// form submit
app.post("/login", (req, res) => {
// kullanıcı girdisi GÜVENSİZ
const username = escapeHtml(req.body.username);
const password = escapeHtml(req.body.email);
// filtrelenmiş şekilde ekrana basılır
res.send(`
<h2>Giriş Bilgileri</h2>
<p>Kullanıcı Adı: ${username}</p>
<p>Parola: ${password}</p>
`);
});
app.listen(PORT, () => {
console.log(`Server çalışıyor: http://localhost:${PORT} `
+"adresinde yada /login ekleyerek deneyebilrisiniz"
);
});
Burada escapeHtml fonksiyonu ile kendimiz basit bir xss engelleyici yaptık. En iyi yaklaşımlardan birisi backend uygulamasına ait xss modüllerinden yararlanmaktır. Node js içerisinde xss engelleyici modül mevcuttur.
const express = require('express');
const xss = require("xss");
const app = express();
const PORT = 3000;
// formdan gelen veriyi okuyabilmek için
app.use(express.urlencoded({ extended: true }));
// formu göster
app.get("/", (req, res) => {
res.sendFile(process.cwd() + "/index.html");
});
app.get("/login", (req, res) => {
res.sendFile(process.cwd() + "/index.html");
});
// form submit
app.post("/login", (req, res) => {
// kullanıcı girdisi GÜVENSİZ
const username = xss(req.body.username);
const password = xss(req.body.email);
// filtrelenmiş şekilde ekrana basılır
res.send(`
<h2>Giriş Bilgileri</h2>
<p>Kullanıcı Adı: ${username}</p>
<p>Parola: ${password}</p>
`);
});
app.listen(PORT, () => {
console.log(`Server çalışıyor: http://localhost:${PORT} `
+ "adresinde yada /login ekleyerek deneyebilrisiniz"
);
});

Comments are closed.