Newsgroup: it.comp.lang.perl
Titolo: tainting

Perche` se uso:
my $x = '(a|b)';
/^$x$/o;
$1 e` tainted, mentre se uso /^(a|b)$/ allora non lo e`?
Come rimediare?
-- 
ciao, | * The Internet is full. Go away.  -- Joel Furr *
Marco | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

Cos'è il tainting????????

Come rimediare?
*scritto senza rileggere*
Ciao,
	la seconda e' ovviamente funzionante...
per la prima dovrebbe essere una cosa del genere:
$pippo =~ /$var/
il fatto di usare "o" finale e' una ottimizzazione che porta ad un
possibile problema di sicurezza, come puoi leggere sulle FAQ del Perl
sulla sicurezza che trovi pure su 
www.perl.com
In ogni caso:
A mio avviso 
/^$x$/o
non funziona perche' $x e' una stringa che gia' contiene l'inizio e la
fine stringa ( ^ e $) quindi il match non toglie affatto i
metacaratteri. ($x stessa li contiene e col pattern matching estrai
sia in nome del file che i metacaratteri stessi...)
Ad esempio se $x coi metacaratteri e' qualcosa del tipo   
$x= "====^valore_stringa$===" 
dove gli = sono i metacaratteri nascosti.
Avviene che /^$x$/o e' un pattern matching che vuole estrarre una
sctringa del tipo:
/^====^valore_stringa$===$/
cioe' con tutti i metacarattere all'inizio della stringa... 
quindi deve essere:	/$x/
Per il discorso del "o" che ottimizza.. ti rimando alle FAQ e a
qualche libro che sia meno sintetico...
Mi astengo perche' sono stato gia' poco chiaro sopra.. figuriamoci che
posso combinare.
Spero di non aver detto cavolate.
Ciao


Serve ad evitare alcuni problemi con gli script CGI. In pratica non si
possono creare, cancellare e fare altro operazioni: tipo system() che
potrebbero esser potenzialmente pericolose.
vedi le FAQ del perl dove si parla dello swith -T .. anche su
www.perl.com
caio

 cerchero` un'altra donna dentro ai sogni di Tarzan...

fine stringa ( ^ e $) quindi il match non toglie affatto i
Eh? $x e` quella li` sopra, e comunque la regexp funziona perfettamente,
solo che il risultato e` comunque tainted.


 manuale ma non ho trovato niente.
Non sono in grado di riprodurre il problema, quindi forse non ho capito.
Ricapitolando....
 my $a = $ARGV[0];  # $a č tainted
 my $x = '(a|b)';  
 $a =~ /^$x$/o;
A questo punto, se ho capito bene, dici che $1 č, a sua volta, tainted. Se
č cosě, allora io non sono in grado di riprodurre il problema con le
versioni di perl adopero normalmente.
Max

Non sono in grado di riprodurre il problema, quindi forse non ho capito.
Ecco il mio test case:
my $a = $ARGV[0];  # $a è tainted
my @lists = qw(white black nuke goodsubj badsubj keywords);
my $listsre = '(' . join('|', @lists) . ')(?:list)?';
if ($ARGV[0] !~ /^${listsre}$/) { die }
print "YES\n" if is_tainted($1);
sub is_tainted {
    return not eval { join('', @_), kill 0; 1; };
}
Cosi`, $1 e` tainted.
Se pero` nella quarta riga sostituisco $ARGV[0] con $a, allora non lo e`
piu` e tutto funziona.


 piu` e tutto funziona.
Ah, ecco. Quindi è la combinazione di due elementi che innesca questo
comportamento "strano": regexp con interpolazione di variabile +
applicazione di regexp direttamente a elemento di @ARGV.
Ho fatto alcune prove e ho riscontrato lo stesso comportamento usando una
regexp definita con l'operatore qr// anche *senza* interpolazione di
alcuna variabile.
Riassumendo:
 my $text_regexp = '(\d+)';
 my $regexp1 = qr/$text_regexp/o;
 my $regexp2 = qr/(\d+)/;
                               # $1 tainted ?
 $ARGV[0] =~ /$text_regexp/o;   #   SI	 
 $ARGV[0] =~ /(\d+)/o;	        #   NO
 $ARGV[0] =~ $regexp1;	        #   SI
 $ARGV[0] =~ $regexp2;	        #   SI
 (@ARGV)[0] =~ /$text_regexp/o; #   NO
 my $ref = \$ARGV[0];
 $$ref =~ /$text_regexp/;       #   NO
Max