Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!
[NODE JS] Input Sanitization Uygulaması
Merhaba arkadaşlar, bu konuda kullanıcıdan gelen verilerin temizlenmesi yani input sanitization konusunu ele alacağız. Validation ile sanitization'ı karıştıran çok kişi var, aralarındaki farkı açıklayarak başlayalım.
Validation verinin kurallara uygun olup olmadığını kontrol eder ve uygun değilse reddeder. Mesela "e-posta formatında mı?" diye sorar. Sanitization ise veriyi kabul eder ama zararlı kısımlarını temizler. Mesela HTML tag'lerini çıkarır, fazla boşlukları siler, özel karakterleri encode eder. İkisi birbirinin yerine geçmez, ikisini de yapmanız lazım.
Neden bu kadar önemli diye sorarsanız, kullanıcıdan gelen hiçbir veriye güvenmeyin. Bu altın kural. Form verisi, URL parametreleri, HTTP header'ları, cookie değerleri, dosya isimleri... Hepsi manipüle edilebilir. Chrome DevTools ile veya Postman ile herhangi bir veri gönderilebilir, client-side validation tamamen atlanabilir.
Ben her projede bir sanitization katmanı oluştururum ve tüm girdiler o katmandan geçer. Hem güvenlik hem de veri tutarlılığı açısından bu yaklaşım çok işe yarar. Mesela kullanıcı adının başında ve sonunda boşluk bırakılması, e-postanın büyük harfle yazılması gibi şeyleri sanitization ile düzeltirim.
Temel Sanitization İşlemleri
JavaScript:
// npm install validator xss express-validator
const validator = require('validator');
const xss = require('xss');
class InputSanitizer {
// String temizleme
static temizString(girdi) {
if (typeof girdi !== 'string') return '';
return girdi
.trim() // Bas ve son bosluklar
.replace(/\s+/g, ' ') // Coklu bosluklar
.replace(/[\x00-\x1F\x7F]/g, ''); // Kontrol karakterleri
}
// Email temizleme
static temizEmail(email) {
if (!email) return '';
let temiz = this.temizString(email);
temiz = temiz.toLowerCase();
temiz = validator.normalizeEmail(temiz) || temiz;
return temiz;
}
// HTML temizleme (XSS koruması)
static temizHtml(girdi) {
if (!girdi) return '';
return xss(girdi, {
whiteList: {
b: [], i: [], em: [], strong: [],
a: ['href', 'target'],
p: [], br: [], ul: [], ol: [], li: []
},
stripIgnoreTag: true,
stripIgnoreTagBody: ['script', 'style']
});
}
// Sayi temizleme
static temizSayi(girdi, varsayilan = 0) {
const sayi = parseInt(girdi, 10);
return isNaN(sayi) ? varsayilan : sayi;
}
// Telefon temizleme
static temizTelefon(tel) {
if (!tel) return '';
return tel.replace(/[^0-9+]/g, ''); // Sadece rakam ve +
}
// Slug temizleme (URL-safe)
static temizSlug(metin) {
if (!metin) return '';
return metin
.toLowerCase()
.replace(/[ıİ]/g, 'i')
.replace(/[şŞ]/g, 's')
.replace(/[ğĞ]/g, 'g')
.replace(/[üÜ]/g, 'u')
.replace(/[öÖ]/g, 'o')
.replace(/[çÇ]/g, 'c')
.replace(/[^a-z0-9\s-]/g, '')
.replace(/\s+/g, '-')
.replace(/-+/g, '-')
.replace(/^-|-$/g, '');
}
// Dosya adi temizleme
static temizDosyaAdi(dosyaAdi) {
if (!dosyaAdi) return 'unnamed';
return dosyaAdi
.replace(/[^a-zA-Z0-9._-]/g, '_')
.replace(/\.{2,}/g, '.') // Path traversal engelle
.substring(0, 200); // Uzunluk limiti
}
}
// Kullanim
console.log(InputSanitizer.temizString(' Merhaba Dunya ')); // "Merhaba Dunya"
console.log(InputSanitizer.temizEmail(' USER@Gmail.COM ')); // "user@gmail.com"
console.log(InputSanitizer.temizTelefon('+90 (532) 123-45-67')); // "+905321234567"
console.log(InputSanitizer.temizSlug('Türkçe Başlık Örneği')); // "turkce-baslik-ornegi"
Bu utility class'ını her projede kullanabilirsiniz. Her veri tipine özel temizleme fonksiyonu var. String'ler için boşluk temizliği ve kontrol karakter silme, e-posta için normalize etme, HTML için XSS temizliği, slug için URL-safe dönüşüm yapıyoruz.
Express Middleware Olarak Kullanım
JavaScript:
const express = require('express');
const { body, param, query, validationResult } = require('express-validator');
const app = express();
app.use(express.json());
// Genel sanitization middleware
function genelSanitizer(req, res, next) {
// Body'deki tum string alanlari temizle
if (req.body && typeof req.body === 'object') {
for (const [key, value] of Object.entries(req.body)) {
if (typeof value === 'string') {
req.body[key] = value.trim();
}
}
}
// Query parametrelerini temizle
if (req.query) {
for (const [key, value] of Object.entries(req.query)) {
if (typeof value === 'string') {
req.query[key] = value.trim().replace(/[<>]/g, '');
}
}
}
next();
}
app.use(genelSanitizer);
// Route bazli validation + sanitization
app.post('/api/kullanici',
[
body('isim')
.trim()
.notEmpty().withMessage('Isim zorunlu')
.isLength({ min: 2, max: 50 }).withMessage('Isim 2-50 karakter')
.escape(), // HTML encode
body('email')
.trim()
.normalizeEmail()
.isEmail().withMessage('Gecersiz email'),
body('yas')
.optional()
.toInt()
.isInt({ min: 13, max: 120 }).withMessage('Gecersiz yas'),
body('bio')
.optional()
.trim()
.isLength({ max: 500 })
.customSanitizer(value => {
// Ozel temizleme: HTML tagleri cikar ama satir sonlarini koru
return value.replace(/<[^>]*>/g, '').substring(0, 500);
})
],
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ hatalar: errors.array() });
}
// Buraya geldiyse veri temiz ve gecerli
console.log('Temiz veri:', req.body);
res.json({ basarili: true });
}
);
app.listen(3000);
Ne Zaman Ne Yapmalı?
Sanitization konusunda şu prensibi benimsemenizi öneririm: veriyi kabul ederken validate et ve sanitize et, saklarken orijinal temiz halini sakla, gösterirken context'e göre encode et. HTML'de gösteriyorsanız HTML encode, URL'de kullanıyorsanız URL encode, SQL'de kullanıyorsanız parameterized query. Her context kendi encoding'ini gerektirir.
Bir de şunu ekleyeyim: over-sanitization da sorun. Kullanıcının adını Mehmet O'Brien gibi apostrof içeren bir isim olabilir. Bunu sanitize ederken apostrofü silmeyin, sadece context'e uygun encode edin. Veriyi bozmadan güvenli hale getirmek asıl sanattır.
Kolay gelsin!
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 9
- Görüntüleme
- 236
- Cevaplar
- 2
- Görüntüleme
- 143
- Cevaplar
- 8
- Görüntüleme
- 707
- Cevaplar
- 1
- Görüntüleme
- 2K
