Nasıl GÜVENLE Zend_Reflection birlikte kullanılması için bir dosya içerir?

1 Cevap php

Ben metin editörü ile kullanmak için ctags bir genişletilmiş biçimi kümesi oluşturmak için Zend_Reflection kullanıyorum. Sorun işlemek isteyen include herhangi bir dosya olması.

Için yapıcı Zend_Reflection_File yansıtmak istediğiniz dosyanın dahil olup olmadığını görmek için denetler, ve eğer bir istisna atar:

// From Zend/Refection/File.php (94-97)
if (!$fileRealpath || !in_array($fileRealpath, get_included_files())) {
    require_once 'Zend/Reflection/Exception.php';
    throw new Zend_Reflection_Exception(
        'File ' . $file . ' must be required before it can be reflected');
} 

I only use this technique on code that I trust ama başkalarının kullanması için bir komut tüm kadar tamamlamayı istiyorum. Benim endişe herhangi bir dosya may geçerli kapsamı içine güvenli olmayan kod tanıtmak dahil olmasıdır. Örneğin, ben şunlardır istemem:

<?php
// evil.php
shell_exec('rm -rf /');

Benim ilk düşünce safe_mode kullanmak için ama bu (ve isim görünüyor öneririm olarak safe olarak) amortismana tabi tutulur.

Bir sonraki fikir, özel bir php.ini dosyası ve disable_functions direktifini kullanmak olacaktır ama (safe_mode belgelerinde belirtilen adayların dışında) Eminim Hissetmesem bu olamaz tüm gerekli fonksiyonları yakaladı.

(Tür) bir sanal PHP çalıştırmak yaparken herhangi bir yolu olup olmadığını nihayet merak ediyorum - Ben hiç yürütülen dahil herhangi bir global kodu olmadan Yansıma bilgileri yakalamak istiyorum.

Any and all thoughts appreciated. TIA.

1 Cevap

Siz de dahil olmak üzere, ya da eval-ing olmamalı, kullanıcı kodu verilir.

Edit:

"Güvenli" kod filtrelemek için çalışıyoruz Zend_Reflection kapsamı dışındadır. Yani amaçlanan kullanımı değil, ve çerçeve tarafından desteklenmiyor. Eğer giriş bazı voodoo belirteç ayrıştırma yapmak istiyorsanız, çekinmeyin, ama bu Zend_Reflection değildir.

Edit 2:

Eğer gerçekten bunu istiyorsanız, token_get_all, token_get_name bakın, ve list of parser tokens.

Eğer Zend_Reflection_File::_reflect yöntemine bakarsanız, size neler yapabileceğini bir fikir edinebilirsiniz:

<?php
$tokens = token_get_all(file_get_contents('file.php'));
foreach ($tokens as $token) {
    if (is_array($token)) {
        $type = $token[0];
        $value = $token[1];
        $line = $token[2];
    }
    switch ($type) {
        case T_FUNCTION:
            if ($value == 'shell_exec') {
                throw Exception("WTF");
            }
        // etc.
    }
}