IMO, there's a huge difference between eval STR and eval BLOCK. You're using eval STR, and could run into problems with a poor regexp (and I'm not saying you have one). I suggest using eval BLOCK instead.

my $op = $query->param('option') || 'Login'; if ($op =~ /^(\w+)$/) { # this is good for untainting. $op = $1; } else { $op = 'NotAllowed'; } # convert $op into a modulename. (my $modname = $op) =~ s.::./.g; # since you don't allow :'s this isn' +t needed, but it's useful in the general case. $modname .= '.pm'; eval { require $modname }; die "Couldn't find class $op : $@\n" if $@; $op->perform(...);

With your original eval STR code, a carefully crafted option parmaeter, with a broken regular expression (again, yours doesn't seem to be such a case), could insert extra perl commands to run. e.g., an option of "strict;system(qw{rm -rf /})" would be disasterous. You eliminated that with your regexp, but eval BLOCK also eliminates it. IMO, with something so dangerous, it doesn't hurt to double-protect oneself. Just in case you accidentally break your regexp later, for example.

(And, as an added bonus, eval BLOCK is faster.)


In reply to Re: better ways than eval to dynamic load a module by Tanktalus
in thread better ways than eval to dynamic load a module by jbrugger

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.