| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | <?phprequire_once(__DIR__.SLASH.'..'.SLASH.'WidgetElement.class.php');class Treatment extends WidgetElement{	public $source;	public $TABLE_NAME = 'statistic_treatment';	public $javascript = 'function(){stats_element_init("treatment");}';	public $icon = 'fas fa-code';	public $typeLabel = 'Code';	function __construct(){		parent::__construct();		$this->fields['source'] = 'longstring';		$this->fieldMapping = $this->field_mapping($this->fields);	}		function editor(){		if($this->source == '') $this->source = '//tableau des données du précédent élement'.PHP_EOL.'return $data; ';		$html = '<label>					<i class="fas fa-code"></i> Code				</label> - <small>Données disponibles dans <strong>$data</strong>, filtres dans <strong>$filters</strong></small>				<div class="prev-custom-treatment float-right btn btn-small mb-2 ml-2" onclick="stats_element_preview(this,function(){$(\'#output-tab\').click()});"><i class="fas fa-play-circle"></i> Exécuter</div>				<div id="server-status" class="d-inline-block float-right"></div>				<div class="clear"></div>				<textarea id="source">'.$this->source.'</textarea>';		return $html;	}	function preview($data = array(),$filters = array()){		$response = array('data'=>array());		ob_start();		$source = html_entity_decode($this->source,ENT_QUOTES);		$forbidden = self::forbidden($source);		if(count($forbidden)!=0) throw new Exception("Mot clés interdits: ".implode(',',$forbidden));					eval('$method = function($data,$filters){'.$source.'};');	    		    $output = ob_get_clean();	    if($output!='') throw new Exception(strip_tags($output));	    		$response['data'] = $method($data,$filters);				return $response;	}	//Fonction de sécurisation du eval, evite toutes les fonctions non spécifiées ci dessous et toutes les intrcutions type include, class...	public static function forbidden($source){				$ignore_terms = array();		////Ajoute des fonctions autorisées dans les traitements statistiques ex : 	$ignore_terms[] = 'Plugin::need'; $ignore_terms[] = 'Business::amount';		Plugin::callHook('statistic_allowed_macro',array(&$ignore_terms));		$source = str_replace($ignore_terms,'',$source);				$tokens = token_get_all('<?php '.$source.' ?>');				$forbiddens = array();		$allowed_functions_generic = array(		    'ucfirst',		    'strto.*',		    'str_.*',		    'date',		    'intval',		    'count',		    'time',		    'array_.*',		    'base64_*',		    '.sort',		    'asort',		    'sort',		    'addslashes',    		    'json_decode',		    'json_encode',		    'implode',		    'explode',		    'utf8_decode',		    'utf8_encode',		    'html_entity_decode',		    'htmlspecialchars',		    'strip_tags',		    'is_null',		    'is_int',		    'substr',		    'max',		    'true',		    'false',		    'null',		    'strlen',		    'round',		    'in_array',		    'is_numeric'		);		$allowed_functions_specific = array(		    '__ROOT__',		    'PLUGIN_PATH',		    'SLASH',		    'html_decode_utf8',		    'Dictionary',		    'fullName',		    'loadAll',		    'getById',		    'bySlug',		    'slugToArray',		    'id',            		    'label',        		    'value',		    'color',		    'Partner',		    'Product',		    'number_format',		    'display_price',		    'ranking',		    'function'		);		$allowed_functions = array_merge($allowed_functions_generic, $allowed_functions_specific);				foreach($tokens as $i=>$token){			if(is_string($token))continue;   		  	list($id, $text,$line) = $token;		 		  	if(in_array($id, array(T_FUNCTION,T_FUNC_C,T_EVAL,T_STRING))){		  		$allowed = false;		  		foreach ($allowed_functions as $function) {		  			preg_match('/'.$function.'/i', $text, $matches);		  			if(count($matches)!=0){		  				$allowed = true;		  				break;		  			}		  		}		  		if(!$allowed) $forbiddens[] = $text.' L'.$line.token_name($id);		    }		    if(in_array($id, array(			    	T_INCLUDE,			    	T_EXTENDS,			    	T_CLONE,			    	T_EXIT,			    	T_GLOBAL,			    	T_HALT_COMPILER,			    	T_IMPLEMENTS,			    	T_INCLUDE_ONCE,			    	T_REQUIRE,			    	//T_REQUIRE_ONCE,			    	T_IMPLEMENTS			    )			)){   				$forbiddens[] = $text.' L'.$line;		    }		}		return $forbiddens;	}}?>
 |