On 6 Αύγ, 08:13, John Nagle <na...@animats.com> wrote:
> On 8/4/2010 4:40 PM, Íßêïò wrote:
>
> >            cursor.execute( ''' SELECT host, hits, date FROM visitors WHERE 
> > page
> > = '%s' ORDER BY date DESC ''' % (page) )
>
> Don't do string substitution ("%") on SQL statements.  Let MySQLdb do it
> for you, with proper escaping:
>
>     cursor.execute('''SELECT host, hits, date FROM visitors WHERE page=%s
>         ORDER BY date DESC''', (page,))

Thanks i didn't know.
But you also do use '%s' here as well. Just without the quotes? Why?
How is this valid?
And also what's the comma after the (page,) ? What does the comam do?

>
> The difference is that if some external source can control "page", and
> they put in a value like
>
>         100 ; DELETE FROM visitors; SELECT * FROM visitors
>
> you just lost your data.

Thanks iam trying to test this because its very interesting and when i
try:

http://webville.gr/index.html?show=log&page="index.html ; DELETE FROM
visitors; SELECT * FROM visitors"

cgitb gives me an error

  53         except MySQLdb.Error:
   54                 print ( "Error %d: %s" % (e.args[0],
e.args[1]) )
   55         else:
   56                 #display dataset
e undefined
NameError: name 'e' is not defined
      args = ("name 'e' is not defined",)

How can i try it successfully?
Have to ssay here that i use mod_rewrite in my remote web server and
every incoming html request gets treated by counter.py with this rule

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^/?(.+\.html) /cgi-bin/counter.py?page=$1 [L,PT,QSA]

Also for the program exectuion to reach the:

cursor.execute( ''' SELECT host, hits, date FROM visitors WHERE page =
'%s' ORDER BY date DESC ''' % (page) )

statement i expect the user to:

#
=================================================================================================================
# if extra string is attached to the URL is 'log' then show excplicit
page log and exit
#
=================================================================================================================
if form.getvalue('show') == 'log':

Please help me reproduce what you suggest. I beleive its called MySQL
injection and i very like want to see this in action! :-)


-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to