Ben sorgu dizesi ile ayarlanan bir dosya yolu dışında istenen altdizinini gitmez emin olmak istiyorum. Şu anda, ben kontrol ediyorum:
- Yol mutlak bir yol vermesini kullanıcı önlemek için, "
/
" ile başlamıyor. - Bu yol, istenen alt-klasörün dışında bir yol vererek gelen kullanıcı önlemek için, "
..
" içermez. - Yol (yani "
http://
", "ftp://
", vb) bir url kullanımını önlemek için, ":
" içermiyor. Şimdiye kadar (olası değil) bir Windows sunucu üzerinde bu komut dosyasını çalıştırmanız gerekir, bu da (yani "C:\
") bir sürücü belirtici ile başlayan mutlak yolları önleyecektir. Not: Ben bir kolon bir Unix dosya geçerli bir karakter olduğunu farkındayım, ama ben bir dosya kullanmadan asla. - Yol "
\
" ile başlamıyor. Ben bir Windows sunucu üzerinde çalışan hakkında fikrimi değiştirmek sadece durumda, bu (yani "\\someserver\someshare
") belirtilen olmaktan Windows ağ yollarını engeller. Yine, ben bir ters eğik çizgi, geçerli bir Unix dosya adı karakteri olduğunu farkındayım, ama ben de herhangi bir dosya bunu kullanarak olmayacak.
Bu kontroller yeterli mi?
Background
Ben bir kullanıcıya gösterilecek bir örnek kaynak dosyaya (sorgu dizesi yoluyla) yol alır bir PHP komut dosyası var. Bu yüzden onlara "view_sample.php?path=accounting_app/report_view.php
" veya "view_sample.php?path=ajax_demo/get_info.js
" gibi bir link verebilir.
Komut temelde böyle görünüyor:
$path = $_GET['path'];
if(path_is_valid($path) && is_file("sample/$path"))
{
header('Content-Type: text/plain');
readfile("sample/$path");
}
Benim endişe kötü niyetli bir kullanıcının url görmek ve "view_sample.php?path=../../database/connection_info.php
" gibi bir şey yapmaya çalışın ve "örnek" dizininde not bir dosyaya erişmek olduğunu ifade etti.
(path_is_valid()
fonksiyonu uygulanan olurdu) Ben yukarıda tanımlanan dört kontrolleri, kötü niyetli bir kullanıcı kilitlemek için yeterli mi? (Ayrıca, çek 1, 3 düşünüyorum, ve ben bir göreceli yol prepending yaşıyorum beri 4 temel alakasız, ama ben yapmadım eğer kontroller yeterli olur mu?)