PHP URL Güvenlik Sorusu

6 Cevap php

Kullanıcıların ben aşağıdaki kod ben veritabanında saklamak önce kötü veri filtrelemek için iyi bir yol olup olmadığını merak ediyordum php mysql ve htmlpurifier kullanıyorum benim veritabanında url saklamak istiyorum?

İşte Kısmi PHP kodudur.

$url = mysqli_real_escape_string($mysqli, $purifier->purify(htmlspecialchars(strip_tags($_POST['url'])));

6 Cevap

Eğer veritabanında değeri koymak önce sadece mysqli_real_escape_string() gereklidir.

XSS karşı güvenceye almak için, htmlspecialchars() saklandığı değil önce, when it is displayed (HTML) gösterilecek tüm verilere aranmalıdır.

Eğer bir gün çıkış için HTML dışında bir formatta veri gerekebilir düşünün; Bu veritabanında saklanan önce o zaman her şeyi htmlspecialchars() denilen pişman olacaktır.

Eğer purifier ve strip_tags(), belki özel bir nedeni var kullanarak konum neden bilmiyorum ama sadece ben temizlik verilerin daha fazla katmanın "çizgisinde overkill gibi görünüyor kullanımı, daha iyi. " htmlspecialchars() zaten herhangi bir HTML zararsız yapacaktır.

SQL Injection konusunda endişeli iseniz, bu o kadar temiz ve o önleyecektir. Aksi takdirde, emin soruyorsun tam olarak ne.

Sadece veritabanında URL'leri saklamak ve bunları geri almak, sadece üzerinden dize geçen gerekiyorsa mysqli_real_escape_string kez yeterli olacaktır. Başka bir şey için gerek yok. Eğer geri bir HTML sayfası bir kullanıcı için çıkış istediğiniz zaman sadece htmlspecialchars kullanmanız gerekecektir.

Bu HTML temizler beri HTMLPurifier URL'ler, burada tüm değil ait değil.

Benim db adresler saklamak ve sadece xss temizlenir, ancak otomatik bir orm kaçtı. Bu aslında aşağı kaynar:

mysqli_real_escape_string(strip_tags($var));

Yani değişmeden url kaydedin, bu db kaydetmek için ok emin olun, sonra ilk temizleyin.

Bunu çekin ve ardından şablon kullanımı Htmlentities () sadece durumda içinde olacağını ancak çıkış yolu üzerinde html engelleyebilir içinde bir şey yoktu.

Eğer gerçekten üzerinde böyle bir şey mühendisi gerekmez.

PS. POST ile çalışıyorsanız bunu yapabilirsiniz:

$fixed = $_POST;
$fixed = array_map('strip_tags', $fixed);
$fixed = array_map('mysqli_real_escape_string', $fixed);

Sonra $ sabit dizi çalışabilirsiniz.

Sen filtreleme ve kaçan ayırt etmek gerekir. Veri alındığında bir o süzülmüş olmalıdır. Bu kötü karakterleri ve kusurlu verileri sıyırma demektir.

Uygulama filtre uzantısını kullanarak değişkenler, ve uygun filtrelere superglobal diziler verilerinizi aktarın.

Bu noktadan sonra tekrar filtre verileri kullanarak önlemek için $ _POST boşaltmak isteyebilirsiniz.

Sonra istediğiniz şekle masaj edeceğiz.

Kaçış verisi gönderiliyor ya da kaydediliyor hemen önce adım ve çıkış ortama göre yapılmalıdır.

MySQL veritabanında saklanması için mysqli_real_escape_string ile Escape. Eğer başka bir DBMS kullanırsanız, başka bir işlevi kullanmalısınız.

Daha da iyisi, kullanıcı verileri için hazırlanmış tablolar ve tutucuları kullanabilirsiniz.

HTML olarak çıkarılırken, htmlentities akıllıca olabilir. Sağlanan verilerde hiç bir HTML kodu istemiyorum. Bunu yaparsanız, HTMLPurifier gibi güvenilir bir kitaplığı kullanın.

Ben sizin örnekte olduğu gibi, bir satır kod her şeyi yapmaya çalışmayın öneririz. Okumak zor ve korumak zordur.

URL'ler için, htmlentities çıkmamış önlemek için iyi bir yoldur ve karakter. Bunlar tabii olması ve olmalıdır Doğru - tabii bu da kote olması için bayrak kullanabilirsiniz çünkü aynı zamanda, herhangi bir tırnak işaretleri kullanarak olmadığından emin kılan nedir?

Veri depolamak Ancak bu fonksiyon uygulanmamalıdır. Kullanıcıya gönderilirken zaman uygulanmalıdır.

Filtre giriş - çıkış kaçış! (Chris Schifflett teklif)

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.