Newsgroup: it.comp.lang.perl
Titolo: sicurezza delle regexp

Non ho visto nulla di ovvio, ma corro rischi se permetto agli utenti di
fare un matching su una regexp fornita da loro? Qualcosa tipo:
return undef if ($mydata=~/$usersuppliedregexp/i);
-- 
ciao, | [Per rispondere togli "toglimi" dal mio indirizzo.]
Marco | * The Internet is full. Go away.  -- Joel Furr *

 return undef if ($mydata=~/$usersuppliedregexp/i);
Beh. Qualche precauzione devi prenderla.
Ad esempio, se la regexp non e' ben formata, il tuo programma si pianta.
Se proprio vuoi far eseguire regexp inserite dall'utente (nell'ipotesi che
l'utente sappia cosa e' una regexp), ti conviene verificarne la correttezza
chiudendola in un eval.
 eval( "" =~ /$usersuppliedregexp/ );
 return undef if $@;
 
Da evitare 
 eval "/$pattern/"
 
perche' $pattern potrebbe contenere roba che viene eseguita se interpolata.  
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

perche' $pattern potrebbe contenere roba che viene eseguita se interpolata.  
Non sono riuscito a fargli interpolare $variabili o `backticks`, devo
preoccuparmi? Con questa sintassi non vede nemmeno errori nella
regexp, quindi suppongo che sia sbagliata.


 regexp, quindi suppongo che sia sbagliata.
use Safe;
my($cpt,$result);
$cpt=new Safe;
$cpt->permit(qw(time sort));
$result=$cpt->reval($unsafe_code);
Cheers
	Alessandro
-- 
One standard to rule them all, one standard to find them,
One standard to bring them all, and in darkness bind them.
In the land of Microsoft, where the Shadow lie.
Alessandro Forghieri              
http://www.orion.it/~alf

 wrote:
: Non ho visto nulla di ovvio, ma corro rischi se permetto agli utenti di
: fare un matching su una regexp fornita da loro? Qualcosa tipo:
: return undef if ($mydata=~/$usersuppliedregexp/i);
Attenzione se usi un perl 5.005: man perlre(1), leggi il commento al
costrutto (?{ code }) e decidi se hai voglia di correre il rischio.
Probabilmente con il taint check attivato (-T) e una scansione della
stringa immessa dall'utente (al limite puoi eliminare dalla stringa le
occorrenze di (?{ code }) ), la cosa potrebbe tornare a livelli di
sicurezza accettabili.
Tieni anche conto che sempre con la 5.005 si possono alterare i flag
(imsx) usando la sintassi (?imsx-imsx:pattern) all'interno della regex.
-- 
Nando Santagata: Telemastica & infornatica
Key fingerprint = C2 D9 C0 8E D5 B7 04 97  AF E8 3F 3E AF 4E 7F 9E
finger nando (at) mail (dot) ipers (dot) net   for my PGP public key
Home: 
http://www.ipers.net/~nandos

my($cpt,$result);
Interessante, ma non credo che sia fattibile per motivi di prestazioni.
Cerchero` di filtrare le regexp all'ingresso.


(imsx) usando la sintassi (?imsx-imsx:pattern) all'interno della regex.
E quindi? Non mi sembra un problema.


 wrote:
:>Attenzione se usi un perl 5.005: man perlre(1), leggi il commento al
:>costrutto (?{ code }) e decidi se hai voglia di correre il rischio.
: A parte questo ti risultano altri pattern pericolosi? Non e` possibile
: in qualche modo interpolare una variabile dentro il pattern?
Non mi risulta sia possibile interpolare una variabile all'interno di
un'altra variabile a sua volta inserita in una regex.
Forse con un qr// ... devo dire che non ne ho esplorato a fondo le
possibilita`, ma qui e` solo teoria, dato che non e` cio` che vuoi fare.
:>Tieni anche conto che sempre con la 5.005 si possono alterare i flag
:>(imsx) usando la sintassi (?imsx-imsx:pattern) all'interno della regex.
: E quindi? Non mi sembra un problema.
Certo, non un problema di sicurezza, ma potrebbe portare a risultati
inaspettati se ad un utente venisse in mente di usare una ricerca multiline
mentre tu intendi fargli effettuare la ricerca nella sola prima riga...
OK, sono paranoico, la pianto qui.


mentre tu intendi fargli effettuare la ricerca nella sola prima riga...
Problemi suoi, io faccio =~ sull'header From. :-)
