Bunu çevrimdışı hale gelen SO Documentation beta konsolide bir referans olarak çapraz yayınlayın.
Sorun
Siteler arası komut dosyası oluşturma, bir web istemcisi tarafından uzaktan kodun istenmeden yürütülmesidir. Herhangi bir web uygulaması, bir kullanıcıdan girdi alıp doğrudan bir web sayfasında çıktı alırsa kendisini XSS'ye maruz bırakabilir. Giriş HTML veya JavaScript içeriyorsa, bu içerik web istemcisi tarafından oluşturulduğunda uzaktan kod yürütülebilir.
Örneğin, 3. taraf bir JavaScript dosyası içeriyorsa:
// http://example.com/runme.js
document.write("I'm running");
Ve bir PHP uygulaması doğrudan ona aktarılan bir dize çıkarır:
<?php
echo '<div>' . $_GET['input'] . '</div>';
Denetlenmeyen bir GET parametresi içeriyorsa <script src="http://example.com/runme.js"></script>
, PHP betiğinin çıktısı şöyle olur:
<div><script src="http://example.com/runme.js"></script></div>
Üçüncü taraf JavaScript çalışır ve kullanıcı web sayfasında "Çalışıyorum" ifadesini görür.
Çözüm
Genel bir kural olarak, istemciden gelen girdilere asla güvenmeyin. Her GET, POST ve çerez değeri herhangi bir şey olabilir ve bu nedenle doğrulanmalıdır. Bu değerlerden herhangi birini verirken, beklenmedik bir şekilde değerlendirilmeyecek şekilde bu değerlerden çıkın.
En basit uygulamalarda bile verilerin hareket ettirilebileceğini ve tüm kaynakları takip etmenin zor olacağını unutmayın. Bu nedenle her zaman en iyi uygulama çıktıdan kaçmak .
PHP, bağlama bağlı olarak çıktıdan kaçmanın birkaç yolunu sunar.
Filtre İşlevleri
PHPs Filtre İşlevleri php komut dosyasına girdi veri izin arındırılmış veya valide içinde birçok yönden . İstemci girdisini kaydederken veya çıktısını alırken kullanışlıdırlar.
HTML Kodlaması
htmlspecialchars
o zaman olur, yani kendi HTML kodlamaları içine herhangi bir "HTML özel karakterler" dönüştürür değil standart HTML olarak işlenebilir. Bu yöntemi kullanarak önceki örneğimizi düzeltmek için:
<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';
Çıktı:
<div><script src="http://example.com/runme.js"></script></div>
İçeride her şey <div>
etiketi olacak değil ama bunun yerine basit bir metin düğümü olarak, tarayıcı tarafından bir JavaScript etiketi olarak yorumlanabilir. Kullanıcı güvenle görecektir:
<script src="http://example.com/runme.js"></script>
URL Kodlaması
Dinamik olarak oluşturulmuş bir URL çıktısı alırken, PHP urlencode
geçerli URL'leri güvenli bir şekilde çıktılamak için işlev sağlar . Örneğin, bir kullanıcı başka bir GET parametresinin parçası haline gelen verileri girebiliyorsa:
<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';
Kötü amaçlı girdiler kodlanmış bir URL parametresine dönüştürülür.
Özel harici kitaplıklar veya OWASP AntiSamy listelerini kullanma
Bazen HTML veya başka tür kod girişleri göndermek isteyebilirsiniz. Yetkili kelimelerin (beyaz liste) ve yetkisiz (kara liste) bir listesini tutmanız gerekir.
OWASP AntiSamy web sitesinde bulunan standart listeleri indirebilirsiniz . Her liste belirli bir etkileşim türüne uygundur (ebay api, tinyMCE, vb ...). Ve açık kaynak.
HTML'yi filtrelemek ve genel durum için XSS saldırılarını önlemek ve en az yanı sıra AntiSamy listelerini çok kolay bir şekilde kullanmak için kütüphaneler mevcuttur. Örneğin, HTML Temizleyiciniz var