Thread: text field constraint advice

text field constraint advice

From
Dale Sykora
Date:
PostgreSQL users,
    I would like to use a text field in a table and limit the size to
reduce the chance of denial-of-service/buffer overflow/etc.  I assume I
can define table fields similar to the following
"field_name text check (len(field) < 160)" although my syntax is
probably wrong.  Is checking text length considered a good idea?  If so,
what would be a reasonable limit?  I was thinking about 10 *
average_field_char_length (if avg value is 16 char, set limit to 160
char).  Thanks in advance for your opinions.

Thanks,

Dale



Re: text field constraint advice

From
Michael Fuhr
Date:
On Wed, Jan 26, 2005 at 12:27:17AM -0600, Dale Sykora wrote:

>     I would like to use a text field in a table and limit the size to
> reduce the chance of denial-of-service/buffer overflow/etc.  I assume I
> can define table fields similar to the following
> "field_name text check (len(field) < 160)" although my syntax is
> probably wrong.

You could use varchar(n) instead of text with a check constraint.

> Is checking text length considered a good idea?

That depends on the application and the trustworthiness of the data
source.  If you know that values should never exceed a certain
length and you want to prevent obviously bad values from being
inserted, then enforcing a length limit makes sense.

> If so, what would be a reasonable limit?  I was thinking about
> 10 * average_field_char_length (if avg value is 16 char, set
> limit to 160 char).

Again, that depends on the application.  If you're storing product
part numbers then most of them will probably fall close to the
average length, so allowing ten times the average length would be
unnecessary.  On the other hand, if you're storing product descriptions
then you might need to allow for greater variation.  Use whatever
makes sense for the type of data you're storing.

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

Re: text field constraint advice

From
Jeff Davis
Date:
On Wed, 2005-01-26 at 00:08 -0700, Michael Fuhr wrote:
> On Wed, Jan 26, 2005 at 12:27:17AM -0600, Dale Sykora wrote:
>
> >     I would like to use a text field in a table and limit the size to
> > reduce the chance of denial-of-service/buffer overflow/etc.  I assume I
> > can define table fields similar to the following
> > "field_name text check (len(field) < 160)" although my syntax is
> > probably wrong.
>
> You could use varchar(n) instead of text with a check constraint.

In this case I would advise using text instead of varchar(n). The reason
is that varchar(n) implies an intrinsic, unchangable rule that the field
never exceed a length of n. An example of that might be a state
abbreviation.

The check constraint is more able to adjust to changing needs.

In fact, I may go so far as to say that it's the application's
responsibility to verify the length (at the same time that it's escaping
the SQL special chars). The reason for that is because the database
wouldn't be corrupt or invalid in any way if the text field contained
(for example) 161 chars. So, it should really be more a matter of
security against DoS attacks, which is the domain of the application.
Also the application is the only one that knows what to do in case the
string is too long, so why bother sending it to the database to see if
it is too long?

But from a technical standpoint, it's really all the same, so he can use
whatever he feels comfortable with.

As for choosing a maximum number, you basically want it high enough that
no significant number of well-meaning people are thwarted by it (you
don't want someone with a long name being upset with you and going to a
competitor), and low enough to make an attacker realize that he's not
going to accomplish anything and go away. If the number is 1000, it
might make the attacker think he's accomplishing something and he might
hang around longer looking for other openings.

Regards,
    Jeff Davis



Re: text field constraint advice

From
"Frank D. Engel, Jr."
Date:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Well, that's all fine as long as the hacker does not connect directly
to the database server when attempting his attack.  Check it in the app
yes, but if this is really a genuine concern, it should be reinforced
by the server as an added precaution.

On Jan 26, 2005, at 3:01 AM, Jeff Davis wrote:

> In fact, I may go so far as to say that it's the application's
> responsibility to verify the length (at the same time that it's
> escaping
> the SQL special chars). The reason for that is because the database
> wouldn't be corrupt or invalid in any way if the text field contained
> (for example) 161 chars. So, it should really be more a matter of
> security against DoS attacks, which is the domain of the application.
> Also the application is the only one that knows what to do in case the
> string is too long, so why bother sending it to the database to see if
> it is too long?
- -----------------------------------------------------------
Frank D. Engel, Jr.  <fde101@fjrhome.net>

$ ln -s /usr/share/kjvbible /usr/manual
$ true | cat /usr/manual | grep "John 3:16"
John 3:16 For God so loved the world, that he gave his only begotten
Son, that whosoever believeth in him should not perish, but have
everlasting life.
$
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (Darwin)

iD8DBQFB95gk7aqtWrR9cZoRAvk0AJwPM0obldPGktkjJWkBC11iMrPtTQCgiQfa
WbG/Bdj+yG9DSaTbSvRUlT0=
=c4+z
-----END PGP SIGNATURE-----



___________________________________________________________
$0 Web Hosting with up to 120MB web space, 1000 MB Transfer
10 Personalized POP and Web E-mail Accounts, and much more.
Signup at www.doteasy.com


Re: text field constraint advice

From
Alex Turner
Date:
Generaly network security suggests that your database server should
not allow connections from external addresses (including for services
like ssh as well as pgsql).  iptables can help acheive this if your
servers are all on public IPs (also not a very good idea), otherwise
the best place to configure this is at your firewall/router.

Alex Turner
NetEconomist


On Wed, 26 Jan 2005 08:16:19 -0500, Frank D. Engel, Jr.
<fde101@fjrhome.net> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Well, that's all fine as long as the hacker does not connect directly
> to the database server when attempting his attack.  Check it in the app
> yes, but if this is really a genuine concern, it should be reinforced
> by the server as an added precaution.
>
> On Jan 26, 2005, at 3:01 AM, Jeff Davis wrote:
>
> > In fact, I may go so far as to say that it's the application's
> > responsibility to verify the length (at the same time that it's
> > escaping
> > the SQL special chars). The reason for that is because the database
> > wouldn't be corrupt or invalid in any way if the text field contained
> > (for example) 161 chars. So, it should really be more a matter of
> > security against DoS attacks, which is the domain of the application.
> > Also the application is the only one that knows what to do in case the
> > string is too long, so why bother sending it to the database to see if
> > it is too long?
> - -----------------------------------------------------------
> Frank D. Engel, Jr.  <fde101@fjrhome.net>
>
> $ ln -s /usr/share/kjvbible /usr/manual
> $ true | cat /usr/manual | grep "John 3:16"
> John 3:16 For God so loved the world, that he gave his only begotten
> Son, that whosoever believeth in him should not perish, but have
> everlasting life.
> $
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.2.4 (Darwin)
>
> iD8DBQFB95gk7aqtWrR9cZoRAvk0AJwPM0obldPGktkjJWkBC11iMrPtTQCgiQfa
> WbG/Bdj+yG9DSaTbSvRUlT0=
> =c4+z
> -----END PGP SIGNATURE-----
>
> ___________________________________________________________
> $0 Web Hosting with up to 120MB web space, 1000 MB Transfer
> 10 Personalized POP and Web E-mail Accounts, and much more.
> Signup at www.doteasy.com
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>

Re: text field constraint advice

From
Michael Fuhr
Date:
On Wed, Jan 26, 2005 at 01:29:53PM -0500, Alex Turner wrote:

> Generaly network security suggests that your database server should
> not allow connections from external addresses (including for services
> like ssh as well as pgsql).  iptables can help acheive this if your
> servers are all on public IPs (also not a very good idea), otherwise
> the best place to configure this is at your firewall/router.

Some people like to have constraints in the database in addition
to whatever host- or network-based security is in place.  The
thinking is that the closer the constraints are to the data, the
less likely they are to be circumvented, either intentionally or
accidentally.  Firewalls keep out unauthorized users, application
checks provide a layer of defense against bogus data from authorized
users, and constraints in the database itself prevent bad data from
being entered by misbehaving applications or by users who are
bypassing the application (e.g., somebody tweaking the data from a
psql session).  Constraints in table definitions also serve as
self-documentation.

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/