On Wed, Mar 12, 2003 at 08:33:47PM +0000, Brian McCauley ([EMAIL PROTECTED]) said 
something similar to:
> Kevin Meltzer <[EMAIL PROTECTED]> writes:
> 
> > I'm also, specifically, not convinced this change is the best:
> > 
> > -    $text =~ s/\$(\w+)/${$1}/g;  # no /e needed
> > +    $text = '@{[ system "rm -rf /" ]}'
> 
> That should not be seen as a single change.
> 
> One bit has been removed.
> 
> Unrelated to that, another bit has been inserted.

So, it doesn't state "suppose you have untrusted data" and then a few
lines later shows the system() example? Looks that way to me.
 
> > Especially, since that is a poor use of system(),
> 
> I cannot see how it can be relevant that the fact that something an
> attacker may do is poor style.

The attacker is going to hard-code 'system "rm -rf /"' into the code? 
 
> > and -T should catch it.
> 
> Aggh!
> 
> You've got the wrong end of the stick.  -T will completely prevent

You keep referring to a stick. I don't have a stick here with me.

> externally sourced strings from being used in eval().  But this whole
> FAQ is about using externally sourced strings in eval().  It doesn't
> say so explicitly in the question, but in practice the strings to be
> interpolated come from a file or database of message templates.  It
> therefore does not make sense to say that -T will protect you.  (And
> IIRC DBI doesn't taint by default anyhow).

And again, your example shows a hard coded Bad Thing. I didn't see
anything in the code example where this data is obtained from an
untrusted source, aside the person writing the code. I believe if I
took data from a file saying 'system "rm -rf /"' and tried to run it,
-T would catch it.
 
> > So, as Robert said, "People still learn perl poorly, and still write
> > things "the old bad way" that needs to be fixed."
> 
> I didn't understand the relevance of it then.  I don't understand the
> relevance when you repeat it.

Sorry, then I won't quote it again.  

> > Anyways, I wouldn't mind seeing the patch reworked, even if in smaller
> > bits at a time to get it "just right".
> 
> Personally I'd settle for "a damn sight better than it was" but in
> defference to that request here's my latest attempt to incorporate
> your suggestions into answer.  I'm not going to express it as a patch
> at this stage as that seems to have caused confusion:
> 
>        How can I expand/interpolate variables in text strings?
> 
>        You can process a string through Perl's interpolation
>        engine like this:
> 
>            $text = 'this has a $foo in it...\n  ...and a $bar';
>            # Assume $text does not contain "\nEND\n"
>            chop ( $text = eval "<<END\n$text\nEND\n" );
>            die if $@;
> 
>        This will not work, and for good reason, if $text is com-
>        ing form a tainted source.  For explanation of how $text
>        could contain arbitrary Perl code see ``How do I expand
>        function calls in a string?'' in this section of the FAQ.
> 
>        If $text is coming from a source external to the Perl
>        script (typically a file) and you would content to trust

"typically a file, database, or CGI input" maybe
"and you would content to trust" ?? typo?

>        executable code from that source then you simply make the
>        source untainted.  This is no more or less dangerous than

You would untaint the 'content' or 'data', no? I'd also suggest a "see
perlsec" somewhere in here.

>        using "do()".
> 
>        If you do not trust the source that much then you can
>        limit and launder the parts of the string that are passed
>        to eval() something like this:
> 
>            $text =~ s/(\$\w+)/$1/eeg; # needed /ee, not /e
> 
>        This still gives unrestricted access to your scalar vari-
>        ables.  It is often better to use a hash:
> 
>            %user_defs = (
>                foo  => 23,
>                bar  => 19,
>            );
>            $text =~ s/\$(\w+)/$user_defs{$1}/g;
> 
>        For other variations on the theme of text templates see
>        the sprintf() function and numerous modules on CPAN.

I think this is much better. But, I've said my peace, chimmed in,
tossed about $.06 out there :)

Cheers,
Kevin

-- 
[Writing CGI Applications with Perl - http://perlcgi-book.com]
I write the music I like. If other people like it, fine, they can go buy the
albums. And if they don't like it, there's always Michael Jackson for them to
listen to. -- Frank Zappa (about his music from the Yellow Shark)

Reply via email to