Re: Secure "where in(a,b,c)" clause. - Mailing list pgsql-general

From Steve Atkins
Subject Re: Secure "where in(a,b,c)" clause.
Date
Msg-id 489BBE14-12C8-41CA-9F41-EA6CF0465A6C@blighty.com
Whole thread Raw
In response to Secure "where in(a,b,c)" clause.  ("William Temperley" <willtemperley@gmail.com>)
Responses Re: Secure "where in(a,b,c)" clause.  (Tino Wildenhain <tino@wildenhain.de>)
List pgsql-general
On Apr 3, 2008, at 9:50 AM, William Temperley wrote:
> Hi All
>
> I hope this isn't a FAQ, but does anyone have any suggestions as to
> how to make a query that selects using:
> "where in(<comma delimited list>)"
> secure from an sql injection point of view?
>
> I have grid of tiles I'm using to reference geographical points.
> These tiles are identical to the tiling system google maps uses. My
> google maps application works out the tiles it wants to display as a
> list of tile names, and sends this list to a php script.
>
> This works very well, however I'm currently directly concatenating a
> sql query:
>
> select st_collect(the_geom) from tiles where tilename in
>    (<comma delimited list>))
>
> Which leaves my application vulnerable to sql injection.
>
> As the length of the comma delimited list is highly variable I don't
> think I can use a prepared query to increase security.


I count the number of values that I want to put in the IN () clause,
then create a query string with the right number of bind variables
in the in clause, then bind the values.

So for {1, 3, 5} I'd use "select * from foo where bar in (?, ?, ?)"
and for
{1,5,7,9,11} I'd use "select * from foo where bar in (?, ?, ?, ?, ?)"

Then, in perl-speak, I prepare that string into a query, loop through
all my values and bind them one by one, then execute the query.

Cheers,
   Steve


pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: [HACKERS] ANALYZE getting dead tuple count hopelessly wrong
Next
From: "Rodrigo E. De León Plicet"
Date:
Subject: Re: Secure "where in(a,b,c)" clause.