On 9/8/06, Owen <[EMAIL PROTECTED]> wrote:

I have a cgi script that processes a form in which the following line of code 
is found

$name =~ s/[`\\"_|!\$\.\^]//g; #remove likely malicious bad characters

Just wondering if there is a better way to do this as I suspect I am a little 
naive.

Need to pass only the low ascii set [A..Za..z] and the ' for names like 
O'Reilly. Maybe I should return the form

unless ($name =~ /[A..Za..z\']){return to form}

Any advice welcomed



TIA



Owen


Owen,

See the resorces John mentioned. To answer you're question more
specifically, though: your list is pretty limited. '*', '$' and
particularly ';' can be nasty, too, and I'm sure there are still some
we've forgottena better option would be:

   $ name =~ s/[^[:alpha:]' .-]//g;
   quotemeta($name);

Better, though, would be to use the taint switch. This has a couple of
advantages. First of all, it forces you to catch all the places
tainted data may be entering your script, not just the obvious ones.

Second, it forces you to extract the substring values you want from
the user input before you use it. looking for the specific things you
want to allow is almost always a more secure route that trying to
figure out the complete set of all the possible values you don't want
and trying to ignore them.

   die "I'm watching you" unless $name =~ /([[:alpha:]' .-]+)/;
  $goodname =~ quotemeta($1);

HTH,

-- jay
--------------------------------------------------
This email and attachment(s): [  ] blogable; [ x ] ask first; [  ]
private and confidential

daggerquill [at] gmail [dot] com
http://www.tuaw.com  http://www.downloadsquad.com  http://www.engatiki.org

values of β will give rise to dom!

Reply via email to