A more detailed response.

Tim Johnson wrote:
I'm using 2.6.5 on ubuntu 10.04.
I'm evaluating a very large string using a named-value formatting
scheme. The process fails with the following error message:
"""not enough arguments for format string"""

I'd take that as a fairly straightforward error message. You have N fields on the right hand side, and at least N+1 on the left hand side, for some value of N. I'm not sure why you're perplexed -- there's nothing in your post that explains why this is more difficult than a mismatch in targets vs fields provided.

In the first place, I wouldn't expect to even see this error
message, because as the python documentation says:
"""
Python calls the get-item method of the right-hand-side mapping
(__getitem__), when the righthand side is an instance object.
"""

Context and URL please. Just because you've just looked it up and have it fresh in your brain doesn't me the rest of us have too :)


As for the right-hand mapping - I'm using the following:
class Evalx:
    def __init__(self, localvals = None, globalvals = None):

Dear me... messing with globals and locals. That's always a bad sign. But let's assume this is that one time in 100 that it is actually justified...

if localvals is None: self.locals = sys._getframe(1).f_locals

Are you aware that this is non-portable and subject to change without notice?


else : self.locals = locals if globalvals is None: self.globals = sys._getframe(1).f_globals else : self.globals = globals
    def __getitem__(self,key):
        return eval(key,self.globals,self.locals)

Using eval is nearly always a bad thing. Your class is now potentially vulnerable to code injection attacks. I hope you can trust the source of the target string *and* the globals and locals functions.

(And of course just because you can trust it *today*, doesn't mean you can tomorrow. Code has a way of being reused.


the implementation looks like this:
self.content = content % Evalx()

What's self? What's content? What global and local variables do you have?

(This is just one of the many reasons why messing with globals and locals is bad... you often can't see what a piece of code does unless you know exactly what *all* the locals and globals are, not just the ones in the piece of code you're looking at.)


I would really appreciate some insights on this issue.
I don't really know how to debug this, except for to look for some
"%s" in the `content' string.

Quite.

>>> x = 42
>>> "%(x)s" % Evalx()
'42'
>>> "%(x)s %s" % Evalx()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string

It's not just %s, of course, any % target that isn't named. This includes %s %d %i %f %g %G %r %x %X plus others.



Oh, and if the security vulnerability isn't obvious already:

>>> "%(x)s %(os.system('echo \"If I can fool you into running this, I will own your PC.\"'))s" % Evalx()
If I can fool you into running this, I will own your PC.
'42 0'


This is just one of *many* ways to inject code into your string formatting operation.


--
Steven

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to