Larry Wall wrote in perl.perl6.internals :
> Do bear in mind that Perl can execute bits of code as it's compiling,
> so if a bit of code is untrustworthy, you shouldn't be compiling it
> in the first place, unless you've prescanned it to reject C<use>,
> C<BEGIN>, and other macro definitions, or (more usefully) have hooks
> in the compiler to catch and validate those bits of code before
> running them.  Doesn't do you much good to disallow
> 
>     eval 'system "rm -rf /"';
> 
> at run time if you don't also catch
> 
>     BEGIN { system "rm -rf /"; }
> 
> at compile time...

That's mostly what Perl 5's Safe is doing. Hence my previous comment.

The major flaw with this approach is that it's probably not going to
prevent
    eval 'while(1){}'
or
    eval '$x = "take this!" x 1_000_000'
or my personal favourite, the always funny 
    eval 'CORE::dump()'
unless you set up a very restrictive set of allowed ops.

(in each case, you abuse system resources: CPU, memory or ability to
send a signal. I don't know how to put restrictions on all of these
in the general case...)

Reply via email to