Literal Escaped Octets

Chason Hayes chasonh at hotmail.com
Wed Feb 8 18:53:41 EST 2006


On Wed, 08 Feb 2006 00:57:45 -0500, Steve Holden wrote:

> Chason Hayes wrote:
>> On Tue, 07 Feb 2006 01:58:00 +0000, Steve Holden wrote:
>> 
>> 
>>>Chason Hayes wrote:
>>>
>>>>On Mon, 06 Feb 2006 13:39:17 +0000, Steve Holden wrote:
>>>
>>>[...]
>>>
>>>>>The URL you reference is discussing how you represent arbitrary values 
>>>>>in string literals. If you already have the data in a Python string the 
>>>>>best advise is to use a parameterized query - that way your Python DB 
>>>>>API module will do the escaping for you!
>>>>>
>>>>>regards
>>>>> Steve
>>>>
>>>>
>>>>Thanks for the input. I tried that with a format string and a
>>>>dictionary, but I still received a database error indicating illegal
>>>>string values. This error went away completely when I used a test file
>>>>consisting only of text, but reproduced everytime with a true binary file.
>>>>If you can let me know where I am wrong or show me a code snippet with a
>>>>sql insert that contains a variable with raw binary data that works,
>>>>I would greatly appreciate it.
>>>>
>>>
>>>I tried and my experience was exactly the same, which made me think less 
>>>of PostgreSQL.
>>>
>>>They don't seem to implement the SQL BLOB type properly, so it looks as 
>>>though that rebarbative syntax with all the backslashes is necessary. Sorry.
>>>
>>>regards
>>>  Steve
>> 
>> 
>> with regards to escaping data parameters I have found that I have to
>> specifically add quotes to my strings for them to be understood by
>> pstgresql. For example
>> 
>> ifs=open("binarydatafile","r")
>> binarydata=ifs.read()
>> stringdata=base64.encodestring(binarydata)
>> 
>> #does not work
>> cursor.execute("insert into binarytable values(%s)" % stringdata)
>> 
>> #need to do this first
>> newstringdata = "'" + stringdata + "'"
>> 
>> then the select statment works.
>> Is this expected behavior? Is there a better way of doing this?
>> 
>> thanks for any insight
> 
> Yes, parameterize your queries. I assume you are using psycopg or 
> something similar to create the database connection (i.e. I something 
> that expects the "%s" parameter style - there are other options, but we 
> needn't discuss them here).
> 
> The magic incantation you seek is:
> 
> cursor.execute("insert into binarytable values(%s)", (stringdata, ))
> 
> Note that here there are TWO arguments to the .execute() method. The 
> first is a parameterized SQL statement, and the second is a tuple of 
> data items, one for each parameter mark in the SQL.
> 
> Using this technique all necessary quoting (and even data conversion 
> with a good database module) is performed inside the database driver, 
> meaning  (among other things) that your program is no longer vulnerable 
> to the dreaded SQL injection errors.
> 
> This is the technique I was hoping would work with the bytea datatype, 
> but alas it doesn't. ISTM that PostgreSQL needs a bit of work there, 
> even though it is otherwise a very polished product.
> 
> regards
>   Steve

That was it. Thanks for your great help.

Chason




More information about the Python-list mailing list