Ana Karargâh Neler Yapıyoruz?
Hikayemizin Perde Arkası Beyin Kıvılcımları Bağlantıya Geçin

OWASP Top 10: Web Uygulaması Güvenlik Riskleri ve Önlemleri

Merhaba değerli okuyucular! Bugün, web uygulama güvenliğinin temel taşlarından biri olan OWASP Top 10 listesini derinlemesine inceleyeceğiz. Bu liste, en kritik web uygulama güvenlik risklerini ve bunlara karşı alınabilecek önlemleri içerir. Hazırsanız, web güvenliğinin bu önemli konusuna dalalım!

OWASP Top 10 Nedir?

OWASP (Open Web Application Security Project) Top 10, web uygulamalarında en sık karşılaşılan ve en kritik güvenlik risklerini listeleyen bir standarttır. Bu liste düzenli olarak güncellenir ve web geliştiricileri için önemli bir referans kaynağıdır.

1. Broken Access Control

Erişim kontrolü eksiklikleri, kullanıcıların yetkisiz olarak verilere erişmesine veya işlemler gerçekleştirmesine yol açabilir.

Önlemler:

  • Güçlü bir yetkilendirme sistemi uygulayın
  • Varsayılan olarak erişimi reddedin, gerektiğinde izin verin
  • JWT gibi güvenli token sistemleri kullanın

// Node.js/Express örneği
const jwt = require('jsonwebtoken');

function authMiddleware(req, res, next) {
    const token = req.header('Authorization');
    if (!token) return res.status(401).send('Access denied');

    try {
        const verified = jwt.verify(token, process.env.JWT_SECRET);
        req.user = verified;
        next();
    } catch (error) {
        res.status(400).send('Invalid token');
    }
}

app.get('/admin', authMiddleware, (req, res) => {
    if (req.user.role !== 'admin') return res.status(403).send('Access denied');
    res.send('Admin panel');
});

2. Cryptographic Failures

Kriptografik hatalar, hassas verilerin yeterince korunmamasına neden olur.

Önlemler:

  • Güçlü şifreleme algoritmaları kullanın (örn. AES-256)
  • Hassas verileri her zaman şifrelenmiş olarak saklayın
  • HTTPS kullanın ve güçlü TLS yapılandırması yapın

const crypto = require('crypto');

function encryptData(data, key) {
    const iv = crypto.randomBytes(16);
    const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);
    let encrypted = cipher.update(data);
    encrypted = Buffer.concat([encrypted, cipher.final()]);
    return iv.toString('hex') + ':' + encrypted.toString('hex');
}

3. Injection

Enjeksiyon saldırıları, güvenilmeyen verilerin komut veya sorgu olarak işlenmesine neden olur.

Önlemler:

  • Parametreli sorgular kullanın
  • Kullanıcı girdilerini doğrulayın ve temizleyin
  • ORM (Object-Relational Mapping) kullanın

// SQL Injection önlemi örneği
const mysql = require('mysql2');

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'user',
    password: 'password',
    database: 'mydb'
});

app.get('/user', (req, res) => {
    const userId = req.query.id;
    connection.query('SELECT * FROM users WHERE id = ?', [userId], (error, results) => {
        if (error) throw error;
        res.json(results);
    });
});

4. Insecure Design

Güvensiz tasarım, uygulamanın temel güvenlik prensipleri göz önünde bulundurulmadan tasarlanmasıdır.

Önlemler:

  • Güvenlik tasarım prensiplerini uygulayın (örn. least privilege)
  • Threat modeling yapın
  • Güvenlik gereksinimlerini baştan belirleyin

5. Security Misconfiguration

Güvenlik yanlış yapılandırmaları, varsayılan veya zayıf yapılandırmalardan kaynaklanır.

Önlemler:

  • Tüm sistemlerde güvenli yapılandırmaları uygulayın
  • Gereksiz özellikleri ve servisleri devre dışı bırakın
  • Düzenli güvenlik güncellemeleri yapın

// Express.js güvenlik yapılandırması örneği
const helmet = require('helmet');
app.use(helmet());

// HTTPS zorunlu kılma
app.use((req, res, next) => {
    if (!req.secure) {
        return res.redirect('https://' + req.headers.host + req.url);
    }
    next();
});

6. Vulnerable and Outdated Components

Eski veya güvenlik açığı bulunan bileşenler, tüm uygulamayı risk altına sokar.

Önlemler:

  • Düzenli olarak bağımlılıkları güncelleyin
  • Güvenlik açığı taramaları yapın
  • Sadece güvenilir kaynaklardan bileşen kullanın

// npm paketlerini güvenlik açıkları için tarama
npm audit

// Güvenlik açıklarını otomatik düzeltme
npm audit fix

7. Identification and Authentication Failures

Kimlik doğrulama ve oturum yönetimi hataları, kullanıcı hesaplarının ele geçirilmesine yol açabilir.

Önlemler:

  • Güçlü şifre politikaları uygulayın
  • Çok faktörlü kimlik doğrulama kullanın
  • Güvenli oturum yönetimi mekanizmaları kullanın

// Şifre karmaşıklık kontrolü örneği
function isPasswordComplex(password) {
    const minLength = 8;
    const hasUpperCase = /[A-Z]/.test(password);
    const hasLowerCase = /[a-z]/.test(password);
    const hasNumbers = /d/.test(password);
    const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(password);

    return password.length >= minLength && hasUpperCase && hasLowerCase && hasNumbers && hasSpecialChar;
}

8. Software and Data Integrity Failures

Yazılım ve veri bütünlüğü hataları, güvenilmeyen kaynaklardan gelen kod veya verinin doğrulanmadan kullanılmasına neden olur.

Önlemler:

  • Dijital imzalar kullanın
  • Güvenilir kaynaklardan gelen güncellemeleri doğrulayın
  • CI/CD pipeline'larını güvenli hale getirin

9. Security Logging and Monitoring Failures

Yetersiz loglama ve izleme, saldırıların tespit edilmesini ve müdahale edilmesini zorlaştırır.

Önlemler:

  • Tüm güvenlikle ilgili olayları loglayın
  • Merkezi log yönetimi sistemleri kullanın
  • Anormal aktiviteleri tespit etmek için log analizi yapın

// Winston logger örneği
const winston = require('winston');

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    defaultMeta: { service: 'user-service' },
    transports: [
        new winston.transports.File({ filename: 'error.log', level: 'error' }),
        new winston.transports.File({ filename: 'combined.log' })
    ]
});

// Güvenlik olayını loglama
logger.info('Kullanıcı giriş yaptı', { userId: user.id, ip: req.ip });

10. Server-Side Request Forgery (SSRF)

SSRF, saldırganın sunucu tarafında istek yapmasına neden olur, bu da iç sistemlere erişim sağlayabilir.

Önlemler:

  • Kullanıcı girdilerini doğrulayın ve temizleyin
  • Beyaz liste yaklaşımı kullanın
  • İç ağ kaynaklarına doğrudan erişimi engelleyin

// SSRF önlemi örneği
const url = require('url');

function isValidUrl(userInput) {
    const parsedUrl = url.parse(userInput);
    const whitelist = ['api.example.com', 'data.example.com'];
    return whitelist.includes(parsedUrl.hostname);
}

app.get('/fetch-data', (req, res) => {
    const userProvidedUrl = req.query.url;
    if (!isValidUrl(userProvidedUrl)) {
        return res.status(400).send('Invalid URL');
    }
    // Güvenli URL ile işlem yap
});

Kapsamlı Güvenlik Yaklaşımı

OWASP Top 10 listesi, web uygulama güvenliğinin temel taşlarını oluşturur. Ancak unutmayın ki, güvenlik sürekli bir süreçtir ve sadece bu listeye odaklanmak yeterli değildir. Kapsamlı bir güvenlik stratejisi oluşturmak, düzenli güvenlik testleri yapmak ve güvenlik bilincini sürekli güncel tutmak çok önemlidir.

İşte genel bir güvenlik kontrol listesi sınıfı örneği:


class SecurityChecklist {
    constructor() {
        this.checks = [
            { name: 'Access Control', check: this.checkAccessControl },
            { name: 'Cryptography', check: this.checkCryptography },
            { name: 'Injection Prevention', check: this.checkInjectionPrevention },
            // Diğer kontroller...
        ];
    }

    checkAccessControl() {
        // Erişim kontrolü kontrolleri
    }

    checkCryptography() {
        // Kriptografi kontrolleri
    }

    checkInjectionPrevention() {
        // Enjeksiyon önleme kontrolleri
    }

    runAllChecks() {
        this.checks.forEach(check => {
            console.log(`Running ${check.name} check...`);
            check.check();
        });
    }
}

// Kullanım
const securityChecker = new SecurityChecklist();
securityChecker.runAllChecks();

Bu yapı, güvenlik kontrollerinizi organize etmenize ve düzenli olarak uygulamanızı gözden geçirmenize yardımcı olabilir.

Siz web uygulamalarınızda OWASP Top 10 listesindeki risklere karşı hangi önlemleri alıyorsunuz? Başka hangi güvenlik pratiklerini uyguluyorsunuz? Deneyimlerinizi ve düşüncelerinizi yorumlarda paylaşın!

Güvenli kodlamalar ve her zaman uyanık olun!