[Zope-DB] Using <dtml-var>s in ZSQL methods?

Ken Winter ken at sunward.org
Mon Jun 18 16:10:33 EDT 2007


Thanks Charlie & Jim ~

SQL injection is a new one on me, and I'm glad to learn about it now
(painlessly) rather than later (painfully).

~ Ken


> -----Original Message-----
> From: JPenny at ykksnap-america.com [mailto:JPenny at ykksnap-america.com]
> Sent: Monday, June 18, 2007 10:03 AM
> To: Ken Winter
> Cc: 'Zope-DB List'
> Subject: RE: [Zope-DB] Using <dtml-var>s in ZSQL methods?
> 
> >
> > I also have a broader question:  When one is composing dynamic SQL in
> Python
> > scripts, what are the pros and cons of executing them by going directly
> to
> > the database adapter (as suggested above) vs passing it in as the sole
> > argument of an "empty" ZSQL method?  By "empty" ZQL method I mean
> something
> > like:
> >
> 
> There are no pros and cons.  Only cons.
> 
> There is a good argument to be made that ZSQL methods are entirely
> a bad idea -- that only prepared statements should be supported, as it
> is far harder to break security.
> 
> But, every use of <dtml-var ...> in a ZSQL method requires that the
> argument be examined and correctly SQL-Quoted.  For example, what is
> to keep someone from entering "13225, 12337; delete from person" in
> your web form?
> 
> Further, you have greatly complicated verification and maintenance.  It
> no longer is enough to test the ZSQL method to be sure that it operates
> as expected.  You have to examine every call-point to determine what the
> SQL method is doing.  And you have to examine every argument to be sure
> that it has been quoted properly and you aren't open to SQL injection.
> 
> Charlie has already given the best answer -- use a really simple method
> like:
> delete from person where person_id = <dtml-sqlvar foo type=int>, and
> call it once for each person you have to delete.  SQL injection is
> impossible, since foo is verified to be an int just before it is used.
> 
> Now, there are times where <dtml-var ... > is unavoidable;  IN clauses and
> LIKE clauses are the principal ones.  In either case, you really need to
> verify the arguments.  At the bare minimum, look at <dtml-var ...
> sql_quote>.
> 
> 
> jim penny




More information about the Zope-DB mailing list