İçeriğe geç
Kaynak kod analizi · Demo

Canlı kod analizi demosu

Örnek kodlar Hugging Face üzerinden Qwen/Qwen3.8-27B modeliyle analiz edilir. Yapay zekâ ile otomatik ön analiz örneğidir; kaynak kod analizi hizmetimizde bulgular uzmanlarca doğrulanır. Bu sayfada ziyaretçi kodu işlenmez; yalnız aşağıdaki örnekler analiz edilir.

Örnekler

Beş örnek kod, beş bilinen açık

Her örnek bilinen bir açık içerir. Canlı sonuç her örnek için bir saat saklanır; model yanıt veremezse önceden üretilmiş sonuç gösterilir.

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.

Python (Flask) · raporlar.py

Yol geçişi (path traversal)

Rapor indirme uç noktası, kullanıcının verdiği dosya adını klasör yoluna denetimsiz ekliyor.

1import os2from flask import Flask, request, send_file, abort34app = Flask(__name__)5RAPOR_KLASORU = "/srv/uygulama/raporlar"678@app.route("/rapor/indir")9def rapor_indir():10    # Örnek: /rapor/indir?dosya=2026-09-ozet.pdf11    dosya_adi = request.args.get("dosya", "")12    if not dosya_adi:13        abort(400)1415    yol = os.path.join(RAPOR_KLASORU, dosya_adi)16    if not os.path.exists(yol):17        abort(404)1819    return send_file(yol, as_attachment=True)202122@app.route("/rapor/liste")23def rapor_liste():24    dosyalar = sorted(os.listdir(RAPOR_KLASORU))25    return {"raporlar": dosyalar}262728if __name__ == "__main__":29    app.run(host="0.0.0.0", debug=True)

Analiz sonucu

önceden üretilmiş

Kodda kritik bir dizin gezinme (path traversal) açığı ve geliştirme ayarlarının üretim ortamında kullanılması nedeniyle yüksek riskli yapılandırma hataları tespit edilmiştir.

  • KritikCWE-22Satır 11, 15, 19

    Dizin Gezinme (Path Traversal) Açığı

    Kullanıcıdan gelen 'dosya' parametresi, 'os.path.join' fonksiyonu ile birleştirilmeden önce doğrulanmamaktadır. Saldırgan, '../' dizin atlaması kullanarak sistemdeki hassas dosyaları (örneğin /etc/passwd) okuyabilir.

    Öneri: Kullanıcı girdisini yalnızca güvenli karakterlerle (alphanumeric, nokta, çizgi) sınırlayın. 'os.path.realpath' kullanarak son yolun 'RAPOR_KLASORU' içinde kaldığından emin olun ve dosya uzantısını beyaz liste (whitelist) yöntemiyle kontrol edin.

  • YüksekCWE-489Satır 29

    Hata Ayıklama (Debug) Modunun Üretimde Aktif Olması

    Flask uygulaması 'debug=True' parametresiyle çalıştırılmaktadır. Bu durum, hata oluştuğunda sunucunun detaylı hata bilgilerini ve kod yapısını saldırgana ifşa etmesine neden olur ve WERKZEUG arka kapısı (RCE) riski taşır.

    Öneri: Üretim ortamında 'debug' parametresini 'False' olarak ayarlayın veya bu parametreyi tamamen kaldırın. Hata ayıklama yalnızca yerel geliştirme sırasında kullanılmalıdır.

  • OrtaCWE-668Satır 29

    Sunucunun Tüm Ağ Arayüzlerine Açık Olması

    Uygulama 'host="0.0.0.0"' ile çalıştırılmaktadır. Bu, sunucunun tüm ağ arayüzlerinden gelen isteklere açık hale gelmesine neden olur. Geliştirme sunucusu, üretim trafiği için tasarlanmamıştır ve güvenlik zafiyetleri barındırır.

    Öneri: Flask'in yerleşik sunucusunu üretim ortamında kullanmayın. Uygulamayı Nginx veya Apache gibi bir web sunucusu arkasında Gunicorn veya uWSGI gibi bir WSGI sunucusu ile çalıştırın.

  • DüşükCWE-532Satır 24, 25

    Dosya Listeleme Bilgi Sızıntısı

    /rapor/liste endpoint'i, rapor klasöründeki tüm dosya adlarını kısıtlama olmadan döndürmektedir. Bu, saldırganlara sistemdeki mevcut dosyalar hakkında bilgi sızdırır ve dizin gezinme saldırılarını kolaylaştırabilir.

    Öneri: Dosya listeleme işlemini yetkilendirme (authentication) ve yetkilendirme (authorization) kontrolleriyle koruyun. Gerekli olmayan durumlarda bu endpoint'i kaldırın veya yalnızca belirli bir kullanıcı rolüne açık hale getirin.

PHP · arama.php

Yansıyan XSS

Arama sayfası, kullanıcının arama metnini HTML çıktısına kodlamadan yazıyor.

1<?php2// Arama sayfası: arama.php?q=güvenlik3$sorgu = $_GET['q'] ?? '';4$sonuclar = [];56if ($sorgu !== '') {7    $pdo = new PDO('sqlite:/var/www/veri/makaleler.db');8    $stmt = $pdo->prepare('SELECT baslik, ozet FROM makaleler WHERE baslik LIKE ?');9    $stmt->execute(['%' . $sorgu . '%']);10    $sonuclar = $stmt->fetchAll(PDO::FETCH_ASSOC);11}12?>13<!DOCTYPE html>14<html lang="tr">15<head>16  <meta charset="utf-8">17  <title>Makale arama</title>18</head>19<body>20  <form method="get" action="arama.php">21    <input type="text" name="q" value="<?= $sorgu ?>">22    <button type="submit">Ara</button>23  </form>2425  <?php if ($sorgu !== ''): ?>26    <h2>"<?= $sorgu ?>" için <?= count($sonuclar) ?> sonuç</h2>27    <ul>28      <?php foreach ($sonuclar as $makale): ?>29        <li>30          <strong><?= htmlspecialchars($makale['baslik'], ENT_QUOTES, 'UTF-8') ?></strong>31          <p><?= $makale['ozet'] ?></p>32        </li>33      <?php endforeach; ?>34    </ul>35  <?php endif; ?>36</body>37</html>

Analiz sonucu

önceden üretilmiş

Kodda XSS açıkları tespit edildi; kullanıcı girdisi ve veritabanı çıktısı HTML'e filtrelenmeden yazılıyor.

  • YüksekCWE-79Satır 21, 26

    Kullanıcı Girdisinde XSS

    Kullanıcının 'q' parametresinden gelen girdisi, satır 21'deki form alanı ve satır 26'daki başlık metninde 'htmlspecialchars' fonksiyonu kullanılmadan doğrudan HTML'e yazılıyor. Bu durum, saldırganın script kodu enjekte etmesine olanak tanır.

    Öneri: Tüm kullanıcı girdilerini HTML çıktısına yazmadan önce 'htmlspecialchars($veri, ENT_QUOTES, 'UTF-8')' fonksiyonu ile filtreleyin.

  • YüksekCWE-79Satır 31

    Veritabanı Çıktısında XSS

    Veritabanından gelen 'ozet' alanı, satır 31'de 'htmlspecialchars' uygulanmadan doğrudan HTML'e basılıyor. Veritabanında saklı zararlı HTML/JS kodları tarayıcıda çalıştırılabilir.

    Öneri: Veritabanından gelen ve HTML çıktısında kullanılan tüm alanlar için 'htmlspecialchars' fonksiyonunu kullanın.

Java (Servlet) · TercihServlet.java

Güvensiz deserializasyon

Kullanıcı tercihleri, istemcinin gönderdiği çerezden Java serileştirmesiyle geri okunuyor.

1package com.ornek.oturum;23import java.io.ByteArrayInputStream;4import java.io.IOException;5import java.io.ObjectInputStream;6import java.util.Base64;78import javax.servlet.http.Cookie;9import javax.servlet.http.HttpServlet;10import javax.servlet.http.HttpServletRequest;11import javax.servlet.http.HttpServletResponse;1213public class TercihServlet extends HttpServlet {1415    @Override16    protected void doGet(HttpServletRequest istek, HttpServletResponse yanit) throws IOException {17        KullaniciTercihi tercih = new KullaniciTercihi();1819        Cookie[] cerezler = istek.getCookies();20        if (cerezler != null) {21            for (Cookie cerez : cerezler) {22                if ("tercih".equals(cerez.getName())) {23                    byte[] veri = Base64.getDecoder().decode(cerez.getValue());24                    try (ObjectInputStream giris = new ObjectInputStream(new ByteArrayInputStream(veri))) {25                        tercih = (KullaniciTercihi) giris.readObject();26                    } catch (ClassNotFoundException e) {27                        yanit.sendError(400);28                        return;29                    }30                }31            }32        }3334        yanit.setContentType("text/plain; charset=UTF-8");35        yanit.getWriter().println("Tema: " + tercih.getTema());36    }37}

Analiz sonucu

önceden üretilmiş

Kod, kullanıcı kontrolündeki bir çerezden Base64 ile çözülen veriyi doğrudan Java nesne serileştirme (deserialization) ile işliyor. Bu durum, saldırganın özel olarak hazırlanmış bir çerez değeri göndererek sunucuda uzaktan kod çalıştırmasına (RCE) olanak tanıyan kritik bir güvenlik açığına yol açar.

  • KritikCWE-502Satır 23–25

    Güvensiz Nesne Serileştirme (Insecure Deserialization)

    Satır 23-25'te, istemci tarafından sağlanan 'tercih' çerezinin değeri Base64'den çözüldükten sonra doğrudan ObjectInputStream ile okunmaktadır. Saldırgan, bu çereze kendi oluşturduğu, zararlı bir 'gadget' zinciri içeren serileştirilmiş bir nesne enjekte edebilir. Bu nesne sunucuda deserialization sırasında çalıştırılarak uzaktan kod çalıştırılmasına (RCE) neden olabilir.

    Öneri: Kullanıcı girdisini doğrudan nesne serileştirme için kullanmayın. Bunun yerine, güvenli bir veri formatı olan JSON veya XML kullanın ve bu veriyi bir nesne haritalayıcı (örneğin Jackson veya Gson) ile güvenli bir sınıfa (KullaniciTercihi) dönüştürün. Eğer nesne serileştirme zorunluysa, ObjectInputStream yerine ObjectInputFilter (Java 9+) veya bir ObjectInputStream sarmalayıcı kullanarak yalnızca beklenen sınıfların (allowlist) deserialization'ına izin verin.

C# (ASP.NET Core) · Program.cs

Sunucu taraflı istek sahteciliği (SSRF)

Bağlantı önizleme uç noktası, kullanıcının verdiği her adrese sunucudan istek atıp yanıtı geri döndürüyor.

1using System.Net.Http;23var builder = WebApplication.CreateBuilder(args);4builder.Services.AddHttpClient();5var app = builder.Build();67// Bağlantı önizleme: /onizleme?adres=https://ornek.com/makale8app.MapGet("/onizleme", async (string adres, IHttpClientFactory fabrika) =>9{10    if (!Uri.TryCreate(adres, UriKind.Absolute, out var hedef))11    {12        return Results.BadRequest("Geçersiz adres");13    }1415    var istemci = fabrika.CreateClient();16    istemci.Timeout = TimeSpan.FromSeconds(10);1718    var yanit = await istemci.GetAsync(hedef);19    var icerik = await yanit.Content.ReadAsStringAsync();2021    var baslik = "";22    var bas = icerik.IndexOf("<title>", StringComparison.OrdinalIgnoreCase);23    var son = icerik.IndexOf("</title>", StringComparison.OrdinalIgnoreCase);24    if (bas >= 0 && son > bas)25    {26        baslik = icerik.Substring(bas + 7, son - bas - 7);27    }2829    return Results.Json(new30    {31        adres = hedef.ToString(),32        durum = (int)yanit.StatusCode,33        baslik,34        ilkKisim = icerik.Length > 500 ? icerik[..500] : icerik,35    });36});3738app.Run();

Analiz sonucu

önceden üretilmiş

Kod, kullanıcıdan gelen URL'yi doğrulayarak sunucudan istek atmakta ve yanıtı döndürmektedir. Bu yapı, Server-Side Request Forgery (SSRF) açıklarına yol açmaktadır.

  • KritikCWE-918Satır 8, 10, 18

    Sunucu Tarafı İstek Sahteciliği (SSRF)

    Kullanıcıdan gelen 'adres' parametresi, yalnızca geçerli bir mutlak URI olup olmadığını kontrol edilmektedir. Ancak, bu kontrol, isteğin iç ağ kaynaklarına (örneğin 127.0.0.1, 169.254.169.254, 10.x.x.x) veya farklı protokollere (file://, gopher://) yönlendirilmesini engellemez. Saldırgan, bu uç noktayı kullanarak sunucunun iç ağındaki servisleri tarama veya bulut ortamında meta veri servislerine erişim sağlama gibi yetkisiz eylemler gerçekleştirebilir.

    Öneri: İzin verilen alan adları (allowlist) veya IP aralıkları (denylist) kullanarak hedef URL'yi doğrulayın. Özellikle iç ağ IP adreslerini (RFC 1918, loopback, link-local) ve bulut meta veri servislerini açıkça reddedin. Ayrıca, yalnızca HTTP ve HTTPS protokollerine izin verin.

  • OrtaCWE-79Satır 22, 26, 29

    Güvensiz HTML Çıkarma (XSS Riski)

    Uzak sunucudan alınan HTML içeriğinden <title> etiketi içindeki metin, herhangi bir sanitizasyon (temizleme) işlemine tabi tutulmadan doğrudan JSON yanıtına eklenmektedir. Bu veri, istemci tarafında (frontend) HTML olarak render edilirse, sakıncalı JavaScript kodlarının çalıştırılmasına (Cross-Site Scripting) neden olabilir.

    Öneri: Çıkarılan 'baslik' metnini HTML entity'leri olarak kodlayın veya güvenli bir HTML temizleme kütüphanesi (örneğin HtmlSanitizer) kullanarak potansiyel script etiketlerini ve olay işleyicilerini (event handlers) kaldırın.

Kaynak kod analizi hizmetimizde kodunuz üçüncü taraf yapay zekâ servislerine gönderilmez; bulgular uzmanlarımızca doğrulanır ve raporlanır.

Kaynak kod analizi talep edin