JavaScript (Node.js, Express) · urunler.js
SQL enjeksiyonu
Ürün arama uç noktası, sorgu parametrelerini SQL metnine doğrudan ekliyor.
1const express = require('express');2const mysql = require('mysql2');34const app = express();5const db = mysql.createConnection({6 host: 'localhost',7 user: 'app',8 database: 'magaza',9});1011// Ürün arama: /urunler?kategori=kitap&sirala=fiyat12app.get('/urunler', (req, res) => {13 const kategori = req.query.kategori;14 const sirala = req.query.sirala || 'ad';15 const sql =16 "SELECT id, ad, fiyat FROM urunler WHERE kategori = '" +17 kategori +18 "' ORDER BY " +19 sirala;2021 db.query(sql, (hata, satirlar) => {22 if (hata) {23 return res.status(500).send(hata.message);24 }25 res.json(satirlar);26 });27});2829// Tek ürün: parametreli sorgu30app.get('/urunler/:id', (req, res) => {31 db.query('SELECT * FROM urunler WHERE id = ?', [req.params.id], (hata, satirlar) => {32 if (hata) return res.status(500).end();33 res.json(satirlar[0] ?? null);34 });35});3637app.listen(3000);Analiz sonucu
önceden üretilmiş
Kodda kritik SQL enjeksiyonu açıkları ve hata mesajı sızıntısı tespit edildi.
KritikCWE-89Satır 13, 16, 17
SQL Enjeksiyonu (kategori parametresi)
Kullanıcıdan gelen 'kategori' parametresi, parametreli sorgu kullanılmadan doğrudan SQL sorgusuna ekleniyor. Bu durum saldırganların veritabanı sorgusunu manipüle etmesine olanak tanır.
Öneri: Kullanıcı girdilerini doğrudan SQL sorgusuna eklemek yerine, parametreli sorgular (prepared statements) kullanın. Örneğin: db.query('SELECT ... WHERE kategori = ?', [kategori], ...).
KritikCWE-89Satır 14, 18, 19
SQL Enjeksiyonu (sirala parametresi)
'sirala' parametresi de doğrudan SQL sorgusuna ekleniyor. ORDER BY ifadesi parametreli sorgularda doğrudan placeholder ile desteklenmediği için, bu alan için katı bir beyaz liste (allowlist) kontrolü yapılmalıdır.
Öneri: Sıralama alanı için izin verilen değerleri (örneğin 'ad', 'fiyat') içeren bir dizi tanımlayın ve gelen değerin bu listede olup olmadığını kontrol edin. Geçersiz değerler için varsayılan bir alan kullanın.
OrtaCWE-209Satır 23
Hata Mesajı Sızıntısı
Veritabanı hata oluştuğunda, hata mesajı doğrudan istemciye gönderiliyor. Bu durum saldırganlara veritabanı yapısı veya sistem hakkında bilgi sızdırabilir.
Öneri: Üretim ortamında hata detaylarını istemciye göndermeyin. Genel bir hata mesajı döndürün ve detaylı logları sunucu tarafında tutun.