Valider 2f2fde74 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Evolution de sql_in() pour des raisons de securite : le format attendu pour...

Evolution de sql_in() pour des raisons de securite : le format attendu pour les valeurs est un tableau
le cas chaine continue a etre tolere pour une liste d'ids numeriques (cas ou on utilise le resultat de calcul_branche_in())
Par securite si c'est une chaine, on explode et quote chaque valeur, ce qui produira un IN sql valide mais sans resultat si on passe autre chose

Le cas d'une sous requete marchait par chance uniquement, car si une chaine etait passee elle etait potentiellement decoupee autour des virgules
Si on veut faire un IN sous requete, simplement utiliser le IN explicitement

Cette modif ne devrait pas avoir d'impact majeur car 99% des usages sont deja avec un array et les quasi seules exceptions sont les branches (sur un echantillon pifometrique)
parent 33e96afa
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+13 −8
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -1998,8 +1998,9 @@ function sql_date_proche($champ, $interval, $unite, $serveur = '', $option = tru
 * @api
 * @param string $val
 *     Colonne SQL sur laquelle appliquer le test
 * @param string|array $valeurs
 * @param array|string $valeurs
 *     Liste des valeurs possibles (séparés par des virgules si string)
 *     le format string est historique et n'est accepte que pour des ids numeriques car autrement la securite ne peut etre garantie
 * @param string $not
 *     - '' sélectionne les éléments correspondant aux valeurs
 *     - 'NOT' inverse en sélectionnant les éléments ne correspondant pas aux valeurs
@@ -2014,15 +2015,19 @@ function sql_date_proche($champ, $interval, $unite, $serveur = '', $option = tru
 *     Expression de requête SQL
 **/
function sql_in($val, $valeurs, $not = '', $serveur = '', $option = true) {
	if (is_array($valeurs)) {
	if (is_string($valeurs)) {
		if(isset($valeurs[0]) and $valeurs[0] === ',') {
			$valeurs = substr($valeurs, 1);
		}
		// on explode en tableau pour pouvoir securiser le contenu
		$valeurs = explode(',', $valeurs);
	}
	$f = sql_serveur('quote', $serveur, true);
	if (!is_string($f) or !$f) {
		return false;
	}
		$valeurs = join(',', array_map($f, array_unique($valeurs)));
	} elseif (isset($valeurs[0]) and $valeurs[0] === ',') {
		$valeurs = substr($valeurs, 1);
	}
	$valeurs = implode(',', array_map($f, array_unique($valeurs)));

	if (!strlen(trim($valeurs))) {
		return ($not ? "0=0" : '0=1');
	}