[DEV]AB 1
[DEV]AB
Sevdamsın 1
Sevdamsın
TuZaKK 1
TuZaKK
kaptanmikro1 1
kaptanmikro1
farkmt2official 2
farkmt2official
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Bvural41 1
Bvural41
Hikaye Ekle

[NODE JS] Input Sanitization Uygulaması

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!

nodejs.png


[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)

Geri
Üst