Form Sunulması ile PHP FileSystem Fonksiyonlar için Değişkenler gönderme

3 Cevap php

Ben aşağıdakileri yapmak için güvenli bir yol bulmaya çalışıyorum:

  1. Kullanıcılar html forma değerini girer.
  2. Formu teslim edilir.
  3. PHP "scandir" fonksiyonu için argüman olarak sunulan değerini kullanır.

Benim teorisi mutlak yolları yasaklar ve belirli bir değer eklemek için dizin adı gerektirir php script mantığı dahil olduğunu.

Benim endişe bir hacker kendi değerini göndermek ve hassas dosyalara erişmek için benim formu kullanabilirsiniz olmasıdır.

Bu bir JQuery eklentisi için olduğunu. Kullanıcıların PHP dosyasını değiştirmek zorunda istemiyorum.

Nasıl aşağıda kod kesmek olabilir?

<?php

$foo = $_POST["some_directory"];

//validate $foo

//make sure path to directory is relative
$foo_url_test  = parse_url($foo);
if (isset($foo_url_test['scheme']) || isset($foo_url_test['host'])) {
$foo = NULL;
}

//make sure the directory name contains 'bar123'
$foo_name_test = preg_split('_[\\\\/]_', $foo);
$foo_name_test = end($foo_name_test);
$foo_name_test = strpos($foo_name_test,'bar123');
if ($foo_name_test === false) {
$foo = NULL;
}

//make sure the path does not contain '..'
$foo_dot_dot_test = strpos($foo,'..');
if ($foo_dot_dot_test == TRUE || $foo_dot_dot_test === 0) {
$foo = NULL;
}

//get files
$files_array = scandir($foo);

?>

3 Cevap

Sen realpath() bakmak isteyebilirsiniz.

$foo = realpath($foo);
if (substr($foo, 0, 8) != '/my/path') {
    return false;
}

... Ya da onun gibi bir şey.

Muhtemelen bu komut amacına daha fazla durmaya gerek ve neden bu keyfi dizinleri okumak istiyor. Bu bilgi olmadan, o erişilebilir dizinleri açık sınırlamalar olmadan, yapmak son derece tehlikeli bir şey olduğunu işaret etmek dışında bu kod güvenliği, hakkında yorum yapmak zordur.

Hatta belirli dosyaları veya dizinleri bile varsa bulmak mümkün - ben, biri için, uzaktaki bir saldırganın okumak için bir dizin belirtmek için izin verir benim sunucu için bir PHP komut dosyası yüklemek asla.

Beyaz listeye sunucu sahibi bu komut dosyası tarafından açılmasına izin kloasör bir dizi olanak php, tarafından okunan bir yapılandırma dosyasını düzenlemek için kullanıcı GEREKTİREN için güçlü bir argüman var

Update after reply from OP

Burada olan sorun, tüm "ajax" istekleri ile ve doğrudan tarayıcı yapılmış olmasıdır. Bu herhangi bir veri ajax istekte html sayfasındaki web sunucusu kümeleri kötü niyetli bir kullanıcı tarafından kılınabilir anlamına gelir. Eğer başka türlü yapmak için güvenli sürece ajax isteği, herhangi bir parametre ile herhangi bir zamanda herkes tarafından yapılabilir.

En kısa zamanda veri sizin sunucu yaprakları gibi, artık ona güvenebilirsiniz. Bu güvenli hale getirmek için en iyi yolu, sunucu tarafında izin dizinleri bir beyaz liste tutmaktır. Eğer (izin verilen listedeki bir şey altında bir alt ya da belki değil) izin listesinde olmayan bir dizin için bir istek alırsanız o zaman isteğini reddetmek ve standart bir hata yanıtını verir.

Sizin dizin adı .. öğeleri içerebilir, bu yüzden onları sınırlamak amacıyla konum geçerli çalışma dizini dışındaki bakabilirsiniz. Onlar hala sadece olsa, amaçladığınız olarak adlandırılan dizinlere bakmak mümkün olacak.

FWIW, parse_url() bir dizin adı akrabası olup olmadığını analiz etmek kullanarak gerçekten tuhaf. Neden sadece $foo[0] == '/' için görünmüyor?

(Bu tabii, bir Unix yol kongre varsayar, ancak kod zaten yapar.)