Sen htmlspecialchars()
aramak ve HTMLPurifier
veri gerekmez - Eğer gerçekten sadece burada bir sorun var ve bu URL, bir SQL enjeksiyon içermediğinden emin yapıyor - mysqli_real_escape_string()
o sıralar.
(Yerine başlıkları yönlendirme onu HTTP gibi kullanarak), bir sayfa / HTML, veri çıkışı eğer Alternatif olarak, IT YOU ÇIKIŞ ZAMAN verilere XSS karşı korumak için htmlentities()
kullanmanız gerekir. Altın kural bağlam farkındalık:
HTML entity encoding is okay for
untrusted data that you put in the
body of the HTML document, such as
inside a tag. It even sort of
works for untrusted data that goes
into attributes, particularly if
you're religious about using quotes
around your attributes. But HTML
entity encoding doesn't work if you're
putting untrusted data inside a
tag anywhere, or an event
handler attribute like onmouseover, or
inside CSS, or in a URL. So even if
you use an HTML entity encoding method
everywhere, you are still most likely
vulnerable to XSS. You MUST use the
escape syntax for the part of the HTML
document you're putting untrusted data
into.
XSS önleme derinlemesine bir başvuru için, kontrol OWASP.
Bu (XSS önlemek için ekrana, SQLi engellemek için veritabanı içine giriş için yani MySQL kaçış dizeleri çıkış için HTML kaçış dizeleri değil ikisi aynı anda) o kullanılan hemen önce (ilgili saldırılara karşı) verileri kodlamak için her zaman en iyisidir. Bu, uygulama üzerinden veri akışı izlemenize olanak sağlayan, ve veritabanındaki tüm verileri herhangi bir amaç için hazır olduğunu biliyorum. DB içine koyarak önce HTML kodlamak bu veriler varsa, un-kodlamak gerekir örneğin, bir HTTP başlık olarak kullanmadan önce.
Bu veritabanına girmeden önce verileri kodlamak gerekir, sütun adı gelecek geliştiriciler / bakıcılarına için bu yansıtan emin olun!
EDIT:
VolkerK yorumuna göre, URL çıktı XSS önlemek için en iyi yolu protokolünü kontrol etmek olacaktır - sizin izin protokolleri (muhtemelen http / https) bunu reddetmek uygun değilse:
$url = 'http://hostname/path?arg=value#anchor';
$parsedUrl = parse_url( $url );
if( $parsedUrl['scheme'] != 'http' ) {
// reject URL
} else {
$url = mysqli_real_escape_string( $mysqli, $url );
$sql = "INSERT INTO table (url) VALUES ('$url')";
// insert query
}
Bu <a href="$url">
durumlarda javascript:alert('xss')
saldırıları önleme avantajına sahiptir. htmlentities()
(gibi karakterlerin sınırlı bir alt kümesi olarak <>
kaçtı edilecek mevcut olmayan) üzerine javascript:alert('xss')
etkilemediğim Koşu, böylece kötü niyetli bir kullanıcının mümkün olacaktır alanınızda JS yürütmek.