La maggior parte delle lingue moderne (che sono in qualche modo interpretate) hanno una sorta di funzione di valutazione . Tale funzione esegue un codice di linguaggio arbitrario, il più delle volte passato come argomento principale come una stringa (lingue diverse possono aggiungere più funzionalità alla funzione di valutazione).
Comprendo che agli utenti non dovrebbe essere consentito eseguire questa funzione ( modifica, ovvero accettare direttamente o indirettamente input arbitrari da un utente arbitrario a cui passare eval
), specialmente con software lato server, poiché potrebbero forzare il processo ad eseguire codice dannoso. In questo modo, tutorial e community ci dicono di non usare eval. Tuttavia, ci sono molte volte in cui eval è utile e utilizzato:
- Regole di accesso personalizzate agli elementi software (IIRC OpenERP ha un oggetto
ir.rule
che può usare il codice python dinamico). - Calcoli e / o criteri personalizzati (OpenERP ha campi del genere per consentire calcoli con codice personalizzato).
- Analizzatori di report OpenERP (sì, lo so che sto andando fuori di testa con roba OpenERP ... ma è l'esempio principale che ho).
- Effetti degli incantesimi di codifica in alcuni giochi di ruolo.
Quindi hanno un buon uso, purché siano usati correttamente. Il vantaggio principale è che la funzione consente agli amministratori di scrivere codice personalizzato senza dover creare più file e includerli (anche se la maggior parte dei framework che utilizzano le funzionalità eval hanno anche un modo per specificare un file, un modulo, un pacchetto, ... da cui leggere).
Tuttavia, eval è malvagio nella cultura popolare. Mi viene in mente roba come irrompere nel tuo sistema.
Tuttavia, ci sono altre funzioni che potrebbero essere dannose se in qualche modo gli utenti accedessero: scollegamento, lettura, scrittura (semantica dei file), allocazione della memoria e aritmetica dei puntatori, accesso al modello di database (anche se non si considerano casi iniettabili SQL).
Quindi, fondamentalmente, il più delle volte quando un codice non è scritto correttamente o non è visto correttamente (risorse, utenti, ambienti, ...), il codice è malvagio e può portare anche a un impatto economico.
Ma c'è qualcosa di speciale con le eval
funzioni (indipendentemente dalla lingua).
Domanda : c'è qualche fatto storico per cui questa paura diventa parte della cultura popolare, invece di prestare la stessa attenzione alle altre caratteristiche forse pericolose?
eval
, ma ha una funzione interna chiamata safe_eval
che prepara l'ambiente per impedire al codice di fare cose pericolose. Sono stati rilevati bug, poiché Python è un linguaggio abbastanza flessibile e quindi difficile da controllare.