Güvenli ve güvenilir bir url bir dosya yolunu dönüştürme

3 Cevap php

Ben php kullanıyorum ve ben bir url için mutlak yolunu dönüştürmek için aşağıdaki kodu var.

function make_url($path, $secure = false){
    return (!$secure ? 'http://' : 'https://').str_replace($_SERVER['DOCUMENT_ROOT'], $_SERVER['HTTP_HOST'], $path);
}

Benim soru temelde, yerleri ve sunucular arasında taşınabilir güvenlik / güvenilirlik açısından bunu yapmak için daha iyi bir yolu var mıdır?

3 Cevap

HTTP_HOST variable is not a reliable or secure value aynı zamanda istemci tarafından gönderilen ediliyor gibi. Yani kullanmadan önce onun değerini doğrulamak için emin olun.

Ben bu bir tarayıcıya yazdırılan bir url, ... olabilir ki kötü dosyanın tam dizin yolunu açığa ve potansiyel bir kırık link yaratıyor olduğunu, çünkü güvenlik etkilendiği olacak sanmıyorum.

Bu bir HTML belgesi olarak basılmış olup olmadığını küçük bir yan not olarak, ben size girdi $ yol, bir [komut] etiketi (XSS) gibi bir şey içeren sadece-durumda ... Htmlentities gibi bir şey olsa çıkışını geçiyor sanırım.

Biraz daha güvenilir olsa da bu hale getirmek için, ben bazen set değil ya, 'DOCUMENT_ROOT' eşleşen tavsiye etmem, ya da maç (örneğin Apache yeniden yazma kuralları engel başlattığınızda). Olmaz

Ben yeniden yazmak için ise, ben sadece 'HTTP_HOST' her zaman yazdırılır emin olur ...

function make_url($path, $secure = false){
    return (!$secure ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].str_replace($_SERVER['DOCUMENT_ROOT'], '', $path);
}

... Ve mümkünse sadece yol geçer, böylece arama kodu güncellemek, bu yüzden bile (yol 'DOCUMENT_ROOT' eşleşmiyor ne olur yani) 'DOCUMENT_ROOT' kaldırarak dikkate gerek yok .. .

function make_url($path, $secure = false){
    return (!$secure ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$path;
}

Bu işlevi var ... neden sorusunu kalkıyor hangisi?

Benim web sitelerinde, ben sadece ayarlar komut yürütme uzaklaştırmak tanımlanmış bir değişken var:

$GLOBALS['webDomain'] = 'http://' . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');
$GLOBALS['webDomainSSL'] = $GLOBALS['webDomain'];

O (fonksiyonları gibi) her yerde ulaşılabilir böylece ben GLOBALS kullanabilirsiniz ... ama sen de yapma düşünebilirsiniz Nerede bir sabit Eğer bu değer değişmez biliyorum eğer (ben bazen daha sonra bu değerleri değiştirmek, (define) site geniş yapılandırma dosyası, örneğin, ben web sitesi için bir HTTPS / SSL sertifikası varsa).

Ben bu yanlış bir yaklaşım olduğunu düşünüyorum.

Bir HTML URL'ler göreli konumları desteklemek. Yani <A href="filename.php">link</a> corrent sayfası olarak URL aynı yolu olan bir sayfaya başvurmak için yapabileceğiniz vardır. Ayrıca <a href="/dir/filename.php">link</a> aynı web sitesine tam bir yol sağlamak için yapabilirsiniz. Bu iki hileler demek web sitenizin kod gerçekten çalışan URL'ler sağlamak için nerede olduğunu bilmek gerekmez.

Eğer http://www.example.com/testing/site.php tek http://www.example.com/dev/site.php üzerine et ve başka olabilir bu yüzden olduğunu söyledi, bazı hileler gerekebilir. Dizin öneki kullanılıyor hangi anlamaya bazı kod gerekir, ama bunu yapmak için bir yapılandırma değeri kullanabilirsiniz. Hangi Ben (alt) sitenin yapılandırmasında, değil sürüm kontrollü kod ait bir ortalama değer!