Fair enough, but I wonder if the coffee has yet kicked in. :-) I
don't mean
to start anything, but I really don't think I said something to
convey that
"parameterization actually escapes anything". I just said:
I'm pretty sure the validation of CFQUERYPARAM for
cfsqltype="CF_SQL_CHAR"
does more than just ensure "it's a string"
And that extra info you offer is indeed what I had in mind, so
thanks for
repeating it. I did go on to explain how CFQP causes "still has other
benefits in causing CF to send
a "prepared statement", which some use as another way to refer to
parameterization, along with "bind variables". I know you know,
that Dean.
Just being clear.
This is what we get when two people strive to be very clear all the
time!
:-)
/charlie
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Dean H.
Saxe
Sent: Friday, July 27, 2007 10:23 AM
To: [email protected]
Subject: Re: [ACFUG Discuss] cfqueryparam in a sort
Good catch Charlie... guess my morning coffee hadn't kicked in yet!
Parameterization doesn't actually escape anything. It forces the
DB to
parse the query independently of the data, produce an execution
plan and
then plug the data in at runtime. Since the execution plan exists
it cannot
be changed by the data.
This gets back to a discussion we just had elsewhere... the context
below is
using queries w/o cfqueryparam:
<snip>
Unless you use preserveSingleQuotes() for string values in a query
CF will
automatically handle quote escaping for you. So that mitigates SQL
injection in this instance.
Numeric values are subject to SQL injection and should always be
parameterized or simply validated as numeric.
Queries should never be built outside of <cfquery> to ensure automatic
string escaping. In other words, don't build the query as a string
and then
do <cfquery>#myQuery#</cfquery>, this will most likely be subject to
injection. Additionally, string values from the user should never
be placed
directly into the query when they are not surrounded by quotes
(e.g. [...]
WHERE #form.where_clause#) since these will obviously not be
escaped by CF.
Use the pattern of indirection instead.
All in all, CF is much more secure from a SQL Injection perspective
than
most programming languages when programmed well. That doesn't mean
you
should stop using <cfqueryparam>, however, since it does confer some
performance benefits.
</snip>
Dean H. Saxe, CISSP, CEH
[EMAIL PROTECTED]
"I have always strenuously supported the right of every man to his own
opinion, however different that opinion might be to mine. He who
denies
another this right makes a slave of himself to his present opinion,
because
he precludes himself the right of changing it."
-- Thomas Paine, 1783
On Jul 27, 2007, at 10:14 AM, Charlie Arehart wrote:
Yes, this is an unfortunate misunderstanding, but I do think I know
where Vivek may have been going, and it's worth discussing.
If the value being used in the CFQUERYPARAM is other than a string
(like a number), then it could make sense to think that if one is
doing the query in a CFFUNCTION and sets a datatype for the variable
coming in as a CFARGUMENT, then that will provide the protection
against non-numeric data trying to be appended in the value.
I wouldn't go so far, though, as to say then that "you don't need
CFQUERYPARAM", since it still has other benefits in causing CF to
send
a "prepared statement" which should perform better if you send more
requests that would reuse it.
But this thinking does not apply for strings: I'm pretty sure the
validation of CFQUERYPARAM for cfsqltype="CF_SQL_CHAR" does more than
just ensure "it's a string". I think it escapes single quotes and
more, which I don't think the CFARGUMENT datatype protection will do.
Anyone know more?
/charlie
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Dean H.
Saxe
Sent: Friday, July 27, 2007 8:40 AM
To: [email protected]
Subject: Re: [ACFUG Discuss] cfqueryparam in a sort
How does that provide any security? Unless you validate the data,
you
are subject to SQL injection.
Dean H. Saxe, CISSP, CEH
[EMAIL PROTECTED]
"Great spirits have often encountered violent opposition from weak
minds."
--Einstein
On Jul 27, 2007, at 8:20 AM, vivek khosla wrote:
The other way is to use cffunction in a cfc and passing the order by
as varchar/string in cfargument, this will provide security as well
performance.
<cfargument name="parameterName" type="dataType"
required="true/false" default="defaultValue">
Rgds
Vivek Khosla
-------------------------------------------------------------
Annual Sponsor FigLeaf Software - http://www.figleaf.com
To unsubscribe from this list, manage your profile @
http://www.acfug.org?fa=login.edituserform
For more info, see http://www.acfug.org/mailinglists Archive @
http://www.mail-archive.com/discussion%40acfug.org/
List hosted by http://www.fusionlink.com
-------------------------------------------------------------
-------------------------------------------------------------
Annual Sponsor FigLeaf Software - http://www.figleaf.com
To unsubscribe from this list, manage your profile @
http://www.acfug.org?fa=login.edituserform
For more info, see http://www.acfug.org/mailinglists Archive @
http://www.mail-archive.com/discussion%40acfug.org/
List hosted by http://www.fusionlink.com
-------------------------------------------------------------
-------------------------------------------------------------
Annual Sponsor FigLeaf Software - http://www.figleaf.com
To unsubscribe from this list, manage your profile @
http://www.acfug.org?fa=login.edituserform
For more info, see http://www.acfug.org/mailinglists
Archive @ http://www.mail-archive.com/discussion%40acfug.org/
List hosted by http://www.fusionlink.com
-------------------------------------------------------------