Loop through a dict changing keys

Steven D'Aprano steve+comp.lang.python at pearwood.info
Sun Oct 16 23:31:44 EDT 2011


On Sun, 16 Oct 2011 17:41:55 -0700, Gnarlodious wrote:

> On Oct 16, 5:25 pm, Steven D'Aprano <steve
> +comp.lang.pyt... at pearwood.info> wrote:
> 
>> How do you sanitize user input?
> Thanks for your concern. This is what I now have, which merely expands
> each value into its usable type (unquotes them):
> 
> # filter each value
> try:
>    var=int(var)

Should be safe, although I suppose if an attacker passed (say) five 
hundred thousand "9" digits, it might take int() a while to generate the 
long int. Instant DOS attack.

A blunt object fix for that is to limit the user input to (say) 500 
characters, which should be long enough for any legitimate input string. 
But that will depend on your application.



> except ValueError:
>    if var in ('False', 'True'):
>       var=eval(var) # extract booleans

Well, that's safe, but slow, and it might encourage some future 
maintainer to use eval in less safe ways. I'd prefer:

try:
    {'True': True, 'False': False}[var]
except KeyError:
    pass # try something else


(To be a little more user-friendly, use var.strip().title() instead of 
just var.)



>    else:
>       var=cgi.escape(var)
> 
> This is really no filtering at all, since all CGI variables are written
> to a dictionary without checking. However, if there is no receiver for
> the value I should be safe, right?

What do you mean "no receiver"?

If you mean that you don't pass the values to eval, exec, use them in SQL 
queries, call external shell scripts, etc., then that seems safe to me. 
But I'm hardly an expert on security, so don't take my word on it. And it 
depends on what you end up doing in the CGI script.


> I am also trapping some input at mod_wsgi, like php query strings. And
> that IP address gets quarantined. If you can suggest what attack words
> to block I'll thank you for it.

That's the wrong approach. Don't block words in a blacklist. Block 
everything that doesn't appear in a whitelist. Otherwise you're 
vulnerable to a blackhat coming up with an attack word that you never 
thought of. There's one of you and twenty million of them. Guess who has 
the advantage?



-- 
Steven



More information about the Python-list mailing list