Domanda

Sto lavorando a un progetto php e voglio eseguire codice recuperato da un database MySQL. Non c'è alcuna possibilità che venga iniettato codice non sicuro, quindi l'unica cosa di cui sono preoccupato è performace. Dovrei usare eval () in modo da poter eseguire direttamente il codice o analizzarlo in modo che call_user_func () lo esegua invece?

Ad esempio, se il codice che ho recuperato era " myfunc (1,2,3); anotherFunc (3,2,1); quot &;
Posso eval () direttamente per eseguire il codice.

Ma per call_user_func (), dovrei analizzare la stringa in modo che possa essere eseguita. Quindi qual è la funzione migliore da utilizzare in questo caso?

È stato utile?

Soluzione

Come regola generale, cerco sempre di stare il più lontano possibile da eval (). Questo caso, tuttavia, sembra un buon candidato per questo.

Dici " Non c'è alcuna possibilità che venga iniettato codice non sicuro " , quindi la grande domanda è: c'è una possibilità che codice non funzionante sia nel database?

In caso contrario, eval () è la soluzione, ma in caso di analisi corretta e registrazione degli errori / etc potrebbe essere una scommessa più sicura. (credo che l'utilizzo di call_user_func_array () sia più veloce in teoria, quindi qualsiasi overhead di analisi potrebbe diventare trascurabile)

Altri suggerimenti

La memorizzazione di PHP nel database è di per sé un cattivo odore di progettazione; anche se in questo caso sei abbastanza sicuro che non può mai contenere codice non sicuro, è sempre bene minimizzare il numero di ipotesi o difese come quelle che devi fare. Se memorizzi il codice PHP nel database, un attacco in cui un utente malintenzionato ottiene l'accesso al tuo database diventa rapidamente molto più grave, trasformandosi in un attacco in cui un utente malintenzionato può eseguire codice arbitrario! So che è molto improbabile che il tuo database sia compromesso in questo modo, ma è comunque buona prassi di sicurezza non lasciare che una situazione improbabile comprometta il tuo sistema più del necessario.

Molte persone concordano che eval () dovrebbe sempre, senza eccezioni, essere evitato nel codice PHP. C'è sempre un'alternativa.

In questo caso, tuttavia, penso che dovrei dire che usare eval () sarebbe la soluzione migliore per te, perché stai già memorizzando il codice PHP nel DB, quindi usando eval () non aumentare il rischio oltre.

Vorrei tuttavia raccomandarlo

  1. Si tenta di convalidare il codice prima di eval (), conservando ciò che si consente. Supponiamo che in qualche modo un utente malintenzionato sia entrato nel tuo database anche se fosse improbabile.
  2. Almeno ci pensi bene a riscrivere la tua applicazione in modo che il codice PHP non sia archiviato in un database. Se stai memorizzando strutture dati complesse, pensa invece a qualcosa come JSON o persino XML. Esistono parser sicuri per questi.

Mi dispiace se questa risposta sembra un po 'reazionaria; Mi sembra solo che questo genere di cose sia molto importante.

Penserei che l'analisi comporterebbe un sovraccarico, ma l'unico modo per essere sicuri è eseguirlo per testarlo. Provalo in entrambi i modi con varie funzioni e vedi quali sono i tuoi risultati. Usa il codice che rappresenta ciò che ti aspetti di memorizzare.

Buona fortuna!

Usa eval (). Nient'altro non vale la pena, non avrebbero effetti collaterali positivi.

Potresti dare un'occhiata all'estensione runkit , che può eseguire php in una sandbox che non ha effetto il codice corrente.

Se si suppone che il codice abbia effetto sul codice in esecuzione, selezionare eval ().

Dovresti racchiudere il codice che stai per eseguire anche in un blocco try / catch, nel caso in cui si verifichi un errore (anche se hai detto che non ci sarà, c'è una possibilità ed è la migliore pratica)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top