“Yanlış Sekme” Kabusu
“Yanlış Sekme” Kabusu
Gece saat 2:00. Staging ortamında kritik bir problemi debug ediyorsunuz. DROP TABLE temporary_logs; komutunu çalıştırıyorsunuz. Sorgu anında yürütülüyor. Staging panelinizi yeniliyorsunuz. Her şey yolunda görünüyor. Sonra, PagerDuty’niz çalmaya başlıyor.
Staging ortamında değilsiniz. Üretim sekmesindesiniz.
Hepimiz burada belayı yaşadık ya da korkusunu taşıdık. Çevresel terminal renkleri, “PROD” bannerları ve salt okunur kullanıcılar olsa bile, insana bağlı hatalar veritabanı felaketlerinin #1 sebebidir. Ancak Laravel 13 sürümü ve LLM’lerin yaygınlaşması ile artık statik uyarıları aşıp daha akıllı çözümlere geçebiliriz.
Bu derinlemesine incelemede, bir AI Destekli Veritabanı Koruma sistemi tasarlayacağız. Bu sadece DROP veya DELETE için bir regex kontrolü değil. Veritabanı katmanınız için ortam bağlamını analiz eden ve OpenTelemetry ile gerçek zamanlı gözlem sağlayan bir bağlamı anlayan middleware oluşturuyoruz.
Mimari: Bağlamı Anlayan Güvenlik
Mimari: Bağlamı Anlayan Güvenlik
Geleneksel koruma yapıları ikili: kullanıcı yetkiye sahipse ya da sahip değilse. AI destekli koruma yapıları üçüncü bir durum ekler: Niyet Doğrulama.
Teknoloji Yığınları
Teknoloji Yığınları
- Laravel 13: Yeni
DatabaseQueryInterceptedolaylarından yararlanmak. - PostgreSQL: Hedef üretim veritabanı.
- OpenAI (GPT-4o): SQL niyetini ve riskini analiz etmek için.
- OpenTelemetry: Her yüksek riskli sorgunun “Karar Yolu” izini sürmek için.
İş Akışı
İş Akışı
- Intercept: Eloquent veya Sorgu Oluşturucu’dan geçen her sorgu yakalanır.
- Classify: Hafif bir yerel kontrol “Yüksek Risk” kalıplarını (DDL, kitlesel güncellemeler) belirler.
- Analyze: Yüksek riskli sorgular bir AI Ajanına ortam bağlamıyla (örn. “Bu Üretim, mevcut kullanıcı Junior Dev”) gönderilir.
- Enforce: AI bir risk puanı döner. Eğer > 0.8 ise, sorgu engellenir ve bir Slack uyarısı gönderilir.
Uygulama: Koruma Bandını Oluşturma
Uygulama: Koruma Bandını Oluşturma
1. Sorgu Kesici
1. Sorgu Kesici
Laravel 13, veritabanı yaşam döngüsüne daha ayrıntılı kancalar sunuyor. İlk olarak, bir DatabaseGuardrailServiceProvider oluşturarak başlayacağız.
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\DB;
use App\Services\Guardrail\AIAnalyzer;
use Illuminate\Database\Events\QueryExecuted;
class DatabaseGuardrailServiceProvider extends ServiceProvider
{
public function boot()
{
if (app()->environment('production')) {
DB::listen(function (QueryExecuted $query) {
$this->analyzeQuery($query);
});
}
}
protected function analyzeQuery($query)
{
$sql = strtolower($query->sql);
$riskyKeywords = ['drop', 'truncate', 'delete', 'alter'];
foreach ($riskyKeywords as $keyword) {
if (str_contains($sql, $keyword)) {
$analyzer = app(AIAnalyzer::class);
$riskReport = $analyzer->assess($query->sql, $query->bindings);
if ($riskReport->isDangerous()) {
throw new \RuntimeException(
"AI Koruma Sorgusunu Engelledi: " . $riskReport->reason
);
}
}
}
}
2. AI Analizör Servisi
2. AI Analizör Servisi
Bu servis, sorgunun neden yürütüldüğünü anlamak için OpenAI ile iletişim kurar. Sadece SQL’i göndermiyoruz; Bağlamı da gönderiyoruz.
namespace App\Services\Guardrail;
use OpenAI\Laravel\Facades\OpenAI;
class AIAnalyzer
{
public function assess(string $sql, array $bindings): RiskReport
{
$context = [
'environment' => app()->environment(),
'user_role' => auth()->user()?->role ?? 'system',
'is_console' => app()->runningInConsole(),
];
$prompt = "Bu SQL sorgusunu üretim ortamı için analiz et.
SQL: $sql
Bağlam: " . json_encode($context) . "
JSON Döndür: {risk_score: 0-1, reason: string, allow: boolean}";
$response = OpenAI::chat()->create([
'model' => 'gpt-4o',
'messages' => [['role' => 'user', 'content' => $prompt]],
'response_format' => ['type' => 'json_object'],
]);
$data = json_decode($response->choices[0]->message->content);
return new RiskReport($data->risk_score, $data->reason);
}
}
OpenTelemetry ile Gözlemleme
OpenTelemetry ile Gözlemleme
Bir sorgu engellendiğinde, o kararın neye dayandığını bilmemiz gerekiyor. AI’nin akıl yürütmesini izlemek için OpenTelemetry kullanacağız.
OpenTelemetry Entegrasyonunu Görüntülemek için Tıklayın
use OpenTelemetry\API\Trace\TracerProviderInterface;
public function assess(string $sql, array $bindings): RiskReport
{
$tracer = app(TracerProviderInterface::class)->getTracer('database-guardrail');
$span = $tracer->spanBuilder('ai_risk_assessment')->startSpan();
try {
// ... OpenAI Mantığı ...
$span->setAttribute('sql', $sql);
$span->setAttribute('risk_score', $data->risk_score);
return new RiskReport($data->risk_score, $data->reason);
} finally {
$span->end();
}
}
Tuzağa Düşme ve Kenar Durumları
Tuzağa Düşme ve Kenar Durumları
Gecikme Vergisi
Gecikme Vergisi
Her DELETE sorgusunu bir LLM’ye göndermek 500ms–2s gecikme ekler.
Çözüm: Yalnızca etkileşimli oturumlardan (Tinker, Yönetici Panelleri) veya belirli yüksek yetkili kullanıcılardan gelen sorguları yakalayın. Bunu yüksek frekanslı arka plan işleri üzerinde asla çalıştırmayın.
AI Yanılsamaları
AI Yanılsamaları
Bir LLM, karmaşık bir JOIN sorgusunu DROP olarak yanlış yorumlayabilir.
Çözüm: 0.6 ile 0.8 arasındaki puanlar için bir “İnsan Dönüşü” uygulayın. Sorguyu gerçek zamanlı olarak “Onayla” veya “Reddet” butonu ile Baş Mühendise gönderin.
Sonuç
Sonuç
2026’ya yaklaşırken, araçlarımız sistemleri kadar akıllı olmalıdır. Laravel 13, kancaları sağlıyor ve AI beyni sağlıyor. Akıllı koruma yapılarını inşa ederek, sadece felaketleri önlemekle kalmıyoruz; aynı zamanda geliştiricilerin prodüksiyonu bozmayacak şekilde hızlı hareket etmelerini sağlayan bir güvenlik kültürü yaratıyoruz.
Önemli Çıkarımlar:
Önemli Çıkarımlar:
- Bağlam Kraldır: SQL yeterli değildir; AI’nin kimin sorguyu çalıştırdığını ve nerede olduğunu bilmesi gerekir.
- Melez Yaklaşım: Hız için yerel regex kullanın, incelik için AI kullanın.
- Her Şeyi İzleyin: AI’nizin neden belirli bir güvenlik kararı verdiğini denetlemek için OpenTelemetry kullanın.
Tartışma Konusu: Hiç “yanlış sekme” felaketi yaşadınız mı? Takımınız bugün üretim veritabanı kazalarını nasıl önlüyor?
Kaynak: Orijinal Makale


