Injection (Enjeksiyon)

Genel Bakış

Bu güvenlik açığı, kullanıcı girdilerinin yeterince doğrulanmadan işlenmesinden kaynaklanır. Yani, saldırganların kötü niyetli kodları uygulamanıza enjekte edebilmesi durumunda ortaya çıkar.

Yaygın Örnekler

1. SQL Injection (SQL Enjeksiyonu)

Örnek: Kullanıcı girdisinin SQL sorgularına doğrudan eklenmesi.

// Kötü örnek
const query = `SELECT * FROM users WHERE username = '${username}'`;
db.query(query);

// İyi örnek
const query = 'SELECT * FROM users WHERE username = ?';
db.query(query, [username]);

2. Command Injection (Komut Enjeksiyonu)

Örnek: Kullanıcı girdisinin sistem komutlarına doğrudan eklenmesi.

// Kötü örnek
const command = `ls ${userInput}`;
exec(command);

// İyi örnek
const { execFile } = require('child_process');
execFile('ls', [userInput], (error, stdout, stderr) => {
    if (error) {
        console.error(`Hata: ${error}`);
        return;
    }
    console.log(stdout);
});

Korunma Yöntemleri

  • Parametreli sorgular kullanın
  • Girdi doğrulama yapın
  • ORM kullanın
  • Escape karakterleri uygulayın
  • Hata mesajlarını gizleyin

Örnek Kod

Güvenli Sorgu Örneği

const { Pool } = require('pg');
const pool = new Pool();

class UserRepository {
    async findUser(username) {
        const query = `
            SELECT id, username, email 
            FROM users 
            WHERE username = $1
        `;
        
        try {
            const result = await pool.query(query, [username]);
            return result.rows[0];
        } catch (error) {
            console.error('Veritabanı hatası:', error);
            throw new Error('Kullanıcı bulunamadı');
        }
    }
}