David Garamond <[EMAIL PROTECTED]> wrote:
> david wrote:
>> sub main::open{
>>         #-- testing purpose
>>         if($_[0] =~ m#^/#){
>>                 die("Access under / not allowed\n");
>>         }else{
>>                 open(FILE,$_[0]) || die $!;
>>                 return FILE;
>>         }
>> }
>> 
>> my $fh = &open('whatever');
> 
> oh, i didn't know you could do that :-) cool. that's what i'm 
> looking for.

Don't count on it working, though. :)

First of all, exporting an open() subroutine only
affects one package.  Normally it would be the 
caller, but here it's hard-coded to main::.

This means the untrusted code would only have to do:

  package X;
  open FH, '>/not/going/to/get/checked'...

To sidestep the safety checks.

Or for a more innocuous-looking example:

  my $fh = IO::File->new('>', '/not/checked/either');

And besides, open() is not particularly easy to 
override.  You'd have to account for all of:

  open FH, $path;
  open FH, "> $path";
  open FH, ">", $path;
  open FH, ">", \$sstream;
  open FH, "command |";
  open FH, "| command";

And six corresponding versions where FH is an 
undefined scalar, not a glob reference.

And there's this oddball:

  open $path;  # morphs $path into a filehandle

But *never* this:

  my $fh = open($path);

Anyway most people end up using filesystem permissions 
for sandboxing, or chroot(), but you can try this:

  package Sandbox;

  sub import { *CORE::GLOBAL::open = \&open }

  sub open (*;$@) {
    # do your best
  }

And then invoke perl as

  $ perl -MSandbox script.pl


HTH
-- 
Steve

perldoc -qa.j | perl -lpe '($_)=m("(.*)")'

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to