[Alan Kennedy]
>> Well, the python JSON codec provided appears to use eval, which might
>> make it *seem* unsecure.
>>
>> http://www.json-rpc.org/pyjsonrpc/index.xhtml
>>
>> But a more detailed examination of the code indicates, to this reader
>> at least, that it can be made completely secure very easily. The
>> designer of the code could very easily have not used eval, and
>> possibly didn't do so simply because he wasn't thinking in security
>> terms.

[Irmen de Jong]
> I think we (?) should do this then, and send it to the author
> of the original version so that he can make an improved version
> available? I think there are more people interested in a secure
> marshaling implementation than just me :)

I should learn to keep my mouth zipped :-L

OK, I really don't have time for a detailed examination of either the JSON spec or the python impl of same. And I *definitely* don't have time for a detailed security audit, much though I'd love to.

But I'll try to help: the code changes are really very simple. So I've edited the single affected file, json.py, and here's a patch: But be warned that I haven't even run this code!

Index: json.py
===================================================================
--- json.py     (revision 2)
+++ json.py     (working copy)
@@ -66,8 +66,10 @@

     def parseValue(self, tkns):
         (ttype, tstr, ps, pe, lne) = tkns.next()
-        if ttype in [token.STRING, token.NUMBER]:
-            return eval(tstr)
+        if ttype  == token.STRING:
+            return unicode(tstr)
+        if ttype  == token.NUMBER:
+            return float(tstr)
         elif ttype == token.NAME:
             return self.parseName(tstr)
         elif ttype == token.OP:
@@ -110,7 +112,12 @@
             while 1:
                 (ttype, tstr, ps, pe, lne) = tkns.next()
                 if ttype == token.STRING:
-                    nme =  eval(tstr)
+                    possible_ident = unicode(tstr)
+                    try:
+                        # Python identifiers have to be ascii
+                        nme =  possible_ident.encode('ascii')
+                    except UnicodeEncodeError:
+                        raise "Non-ascii identifier"
                     (ttype, tstr, ps, pe, lne) = tkns.next()
                     if tstr == ":":
                         v = self.parseValue(tkns)

I'll leave contacting the author to you, if you wish.

> I'll still have to look at Twisted's Jelly.

Hmmm, s-expressions, interesting. But you'd have to write your own s-expression parser and jelly RPC client to get up and running in other languages.

regards,

--
alan kennedy
------------------------------------------------------
email alan:              http://xhaus.com/contact/alan
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to