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ı');
}
}
}