2012-11-15 8 views
6

Un mio cliente segnala un problema strano con un codice nel proprio sistema Magento (Magento è una piattaforma di e-commerce scritta in PHP). Non ho accesso diretto al sistema per sondare e eseguire il debug, quindi ho pensato di chiedere a Stack Overflow se hai mai visto qualcosa di simile.PHP tenta di eseguire il caricamento automatico Nome classe casuale

L'errore che stanno vedendo è di tanto in tanto

Warning: include(O1ucm02owqn3iwwcx5osz2m2.php): failed to open stream: 

Con uno stack di chiamate che include

#0 /Users/theirusername/Sites/project/lib/Varien/Autoload.php(93): mageCoreErrorHandler(2, 'include(O1ucm02...', '/Users/theiruse...', 93, Array) 
#1 /Users/theirusername/Sites/project/lib/Varien/Autoload.php(93): Varien_Autoload::autoload() 
#2 [internal function]: Varien_Autoload->autoload('o1ucm02owqn3iww...') 
#3 [internal function]: spl_autoload_call('o1ucm02owqn3iww...') 
#4 /Users/theirusername/Sites/project/app/code/local/Theirname/Commercebug/Model/Observer.php(191): defined('Mage_Core_Block...') 

Da questo, posso dedurre che PHP pensa che ha bisogno di creare un'istanza di una classe denominata O1ucm02owqn3iwwcx5osz2m2. Tuttavia, non riesco a capire perché il PHP potrebbe fare questo PHP. Le linee che attivano l'errore (# 4 in stack, intorno linea 191 in Observer.php) dovrebbero essere

if(defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS")) 
{ 
    $path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS; 
} 

Queste linee non sembrano parlare di qualsiasi classe PHP chiamato O1ucm02owqn3iwwcx5osz2m2 (dico "dovrebbe essere" perché il il cliente ha implementato il codice da solo, sto lavorando con loro per ottenere una copia per cercare potenziali problemi).

Qualcuno ha idea di cosa potrebbe succedere? Si tratta di un bug/problema noto di PHP con alcune versioni e/o qualcuno ha riscontrato problemi come questo con i caricatori automatici PHP/defined/costanti di classe?

(sto lavorando con il mio cliente per determinare la versione di PHP sono in esecuzione, così come ottenere una copia dei file che hanno dispiegati per garantire che corrispondano quello che presumo sono lì.)

+1

Quali altre estensioni di terze parti stanno utilizzando? Anche quali altri moduli PHP hanno? Sembra un qualche tipo di corruzione. Usano APC o XCache o eAccelerator? Inoltre, è sempre la stessa classe richiesta o è sempre una serie di assurdità casuali? –

+2

Capita di usare Zend Guard Loader per caso? Sembra che sia troppo zelante nel cambiare i nomi di volta in volta e quindi rompendo gli script nel modo in cui descrivi lo – Jasper

+2

mi sembra il malware –

risposta

1

La funzione defined() funge da complimento alla funzione define() per le costanti con nome. Vale a dire, le costanti dichiarate con define possono essere ben controllate con defined.

Tuttavia, quel codice sta verificando un class constant, che, sebbene possibile, è meno tipico. Ho il sospetto che il controllo è innescare caricamento automatico (just as the use of class_exists can trigger autoloading.) Tuttavia, il valore passato fuori al caricatore automatico attraverso l'uso di definito è storpiato (forse consegnare a mano il hash of the z-val for the string.)

Mi chiedo se la seguente modifica otterrebbe le cose working:

// force PHP to load the class first, then let defined() check for the constant 
if(class_exists("Mage_Core_Block_Template") && defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS")) 
{ 
    $path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS; 
} 

Come ha notato Alan nel suo commento, anche Zend Guard potrebbe causare un problema.

+1

+1 dal momento che quasi tutto ciò che hai detto è accurato e un buon consiglio, eccetto per "di solito le costanti in un la classe non cambia ". I controlli esistenti esistono in particolare perché le costanti sono state aggiunte a Magento nel tempo e il mio prodotto deve supportare versioni precedenti che potrebbero non avere tali costanti. (sono sicuro che si tratta di un problema di Zend Guard che non sta giocando bene con le costanti di classe in 'defined') –

+1

Punti validi, Alan. Ho aggiornato la risposta di conseguenza.La natura poco frequente di questi tipi di controlli è ciò che volevo evidenziare come una possibile ragione per cui un insetto come questo potrebbe intrufolarsi, ma, in effetti, il mio linguaggio era inizialmente troppo forte. – AdamJonR

Problemi correlati