Kurgusal bir PHP profil sayfasında kullanıcı adı HTML metni, profil adresi ise HTML niteliği içinde gösteriliyor:
<?php
$name = $_GET['name'] ?? '';
$url = $_GET['url'] ?? '';
echo "<h2>$name</h2>";
echo "<a href=\"$url\">Profili aç</a>";
?>Bu kodda
nameurlYapay zekâ yalnızca
htmlspecialchars($name)Bağlama uygun düzeltme
HTML metni ve HTML niteliği için uygun karakter kümesi belirtilmeli, URL için de izin verilen şemalar açıkça kontrol edilmelidir:
<?php
$name = $_GET['name'] ?? '';
$url = $_GET['url'] ?? '';
$safeName = htmlspecialchars(
$name,
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
);
$safeUrl = null;
$parsedUrl = filter_var($url, FILTER_VALIDATE_URL);
if ($parsedUrl !== false) {
$scheme = strtolower((string) parse_url($parsedUrl, PHP_URL_SCHEME));
if (in_array($scheme, ['http', 'https'], true)) {
$safeUrl = htmlspecialchars(
$parsedUrl,
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
);
}
}
echo "<h2>{$safeName}</h2>";
if ($safeUrl !== null) {
echo "<a href=\"{$safeUrl}\">Profili aç</a>";
} else {
echo '<span>Geçersiz bağlantı</span>';
}
?>htmlspecialcharsjavascript:data:Kullanıcı verisi JavaScript, CSS veya URL gibi başka bir bağlama aktarılacaksa HTML kaçışını yeniden kullanmak doğru değildir. Özellikle kullanıcı girdisini script metnine birleştirmek yerine, mümkünse DOM API’leriyle metin olarak eklemek veya güvenli bir veri aktarım yöntemi kullanmak gerekir.
AI önerisini doğrulama adımları
Modelden yalnızca “Bu satırı kaçır” demek yerine veri akışını bağlamıyla açıklaması istenmelidir:
- Değerin hangi çıktı bağlamında kullanulduğu belirlenir: HTML metni, HTML niteliği, URL, JavaScript veya CSS.
- Her bağlam için kullanılan kaçış yönteminin yanı sıra izin verilen değerlerin doğrulanıp doğrulanmadığı kontrol edilir.
- İsim alanına ve
<b>Ali</b>"benzeri girdiler verilerek bunların çalıştırılabilir işaretleme yerine metin olarak kaldığı doğrulanır.<img src=x onerror=alert(1)> - Bağlantı alanında kabul edilir;
https://example.test/profil,javascript:alert(1), geçersiz URL ve beklenmeyen şemalar reddedilir.data:text/html,... - Üretilen çıktı tarayıcıda ve test ortamında incelenir. Kullanıcı girdisinin yeni nitelik, etiket veya script içeriğine dönüşmediği kontrol edilir.
- Aynı değişkenin başka bir şablonda ya da istemci tarafı kodunda yeniden kullanılıp kullanılmadığı aranır.
Yapay zekâ tek bir satırdaki kaçışı doğru saptasa bile değişkenin daha sonra başka bir şablona aktarıldığını, güvenilir bir kaynaktan geldiği varsayıldığını veya URL’nin farklı bir yerde yeniden oluşturulduğunu göremeyebilir. Ayrıca
filter_varBu nedenle model önerisi başlangıç incelemesi olarak kullanılmalı; bağlam envanteri, izin listeleri, negatif testler ve gerçek çıktı incelemesiyle doğrulanmalıdır. Kaçış, doğrulama ve güvenli veri aktarımı birlikte değerlendirilmediğinde görünürde düzeltilmiş bir kod hâlâ XSS riski taşıyabilir.
