How do you set up a stack?

s713221 at student.gu.edu.au s713221 at student.gu.edu.au
Wed May 9 14:06:15 EDT 2001


kosh wrote:
> 
> Umm. While this solution will work I think there are some things that need
> to be dealt with. Mainly you need to check f for items that should not be
> in there. eval will evaulatuate any valid piece of python code so the other
> things that can be done are large. This is a fairly large security risk at
> this point I think. At the very least I would check if it has any letter
> characters and if so not run then.

Eval will (should?) only evaluate legal pythonic numeric functions. This
actually covers quite a bit, but unless you define wierd class
structures that overwrite numerical operators to do non-numerical
operations, you shouldn't have to worry too much about using eval.

Simple maths.
>>> eval("1+2")
3

Math with complex numbers (Except "i" is replaced with "j" in python.
Ask the engineers why. *sighs*)
>>> eval("(1+2j)-3j")
(1-1j)

You can also import the math module and use these functions inside the
eval statement.
>>> import math
>>> eval("1+math.sqrt(2)")
2.4142135623730949

However, all of these are dealing with numbers. I'd be interested to see
if someone did have an example of a malicious eval use. (In fact I'd be
downright anxious to know of any eval security weaknesses. *grins*)

I try to eval a non-numerical statement.
>>> eval("print 'hello'")
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<string>", line 1
    print 'hello'
        ^
SyntaxError: invalid syntax

Now I try a different statement that barfs on a different piece of
syntax.
>>> eval("if 1==1: print 'hello'")
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<string>", line 1
    if 1==1: print 'hello'
     ^
SyntaxError: invalid syntax
>>>

In order to "evaluate" or execute a string as a command, rather than an
expression, the exec command has to be used. However, if you are really
paranoid, or would like to convert the following complex number
statements "1+32i" to correct python, "1+32j", look up the re module.

Anycase, have fun. You should have a great time with the language, and
with this newsgroup.

Joal Heagney/AncientHart



More information about the Python-list mailing list