On Mon, 11 Jul 2005, Ron Smith wrote:

> Insecure dependency in open while running with -T switch at 
> C:/www/cgi-bin/upload_save.cgi line 42.

What do you see on line 42?

It seems to be in Store_Results():

> sub Store_Results{
>  my $data;
>  my $mime = uploadInfo($file_name)->{'Content-Type'};
>  open (STORAGE, ">$directory/$file") or die "Error: $directory/$file: $!\n"; 
> # line 42<======
>  if ($mime !~ /text/) {
>   binmode ($file_name);
>   binmode (STORAGE);
>  }
>  while (read($file_name, $data, 1024)) {
>   print STORAGE $data;
>  }
>  close STORAGE;
> }


In other words, it chokes when you try to write to the dynamically 
selected file, $directory/$file. 

Unfortunately, this is exactly the sort of thing that taint mode is 
supposed to be catching. Read the perldoc on it for details:

>From the command line, if available:

    $ perldoc perlsec

Or read it from perldoc.perl.org:

    <http://perldoc.perl.org/perlsec.html>

Hope this helps clarify things.

* ** *** ***** ******* *********** ************* *****************

On an entirely unrelated note, if you get in the habit of consistently 
indenting your code now, you'll be *much* happier a year or five from 
now when you're trying to maintain code you wrote when you started out. 
A good indenting style -- the details of how you choose to indent don't 
matter nearly as much as the fact that you do so consistently -- should 
make the structure of your code much easier to grasp at a glance. Here's 
how I might have written the subroutine in question:

    sub Store_Results{
        my ( $file_name, $directory, $file ) = @_;
        my $data;
        my $mime = uploadInfo($file_name)->{'Content-Type'};
        open (STORAGE, ">$directory/$file")
            or die "Error: $directory/$file: $!\n"; line 42<======
        if ($mime !~ /text/) {
            binmode ($file_name);
            binmode (STORAGE);
        }
        while (read($file_name, $data, 1024)) {
            print STORAGE $data;
        }
        close STORAGE;
    }

Note also that I explicitly pulled in arguments, rather than using 
globals. This will mean changing the sub call to

   Store_Results( $file_name, $directory, $file );

but writing it that way will also just serve to clarify things and make 
it easier to maintain the program when you look at it again years later.

* ** *** ***** ******* *********** ************* *****************

You don't have to follow the details of how I'm doing this if you don't 
want to, but at least choose some conventions and stick to them. Doing 
so will, I promise, save you headaches in the long run :-)



-- 
Chris Devers

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to