我很好奇当你传递一个列表时,maxlength属性如何在CFQUERYPARAM中工作.maxlength是否适用于整个列表的长度(即长度为"1,2,3,4,5,6"= 11)?或者maxlength是否适用于列表中的每个项目?
我找不到任何这方面的文件.
我正在努力成为一名优秀的CF Web开发人员,并使用<cfqueryparam>
所有FORM或URL元素来实现我的SQL查询.
在这种情况下,我试图允许用户动态控制ORDER BY子句.
<cfquery datasource="MyDSN" name="qIncidents">
SELECT IncidentID, AnimalID, IntakeDate, DxDate, OutcomeDate
FROM Incidents
WHERE ShelterID = <cfqueryparam cfsqltype="cf_sql_integer" value="#Arguments.ShelterID#">
ORDER BY <cfqueryparam cfsqltype="cf_sql_varchar" value="#SortBy#">
</cfquery>
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到以下错误:
由ORDER BY编号1标识的SELECT项包含一个变量,作为标识列位置的表达式的一部分.只有在引用列名的表达式进行排序时,才允许使用变量.
有关如何安全地做到这一点的任何建议?
我主要CFQUERYPARAM
用来防止SQL注入.由于查询查询(QoQ)不接触数据库,是否有任何逻辑上的理由在其中使用CFQUERYPARAM?我知道这不匹配的值cfsqltype
,并maxlength
会抛出异常,但是,这些值应该已经在此之前进行验证,并显示(从UX观点)友好的信息.
我正在努力提高应用程序的安全性.每当我从用户(无论是通过POST还是GET)接收应该是整数的数据时,我都会适当地验证.但通常数据是VARCHAR,有时可以包含HTML.
在这种情况下,如何保护我的数据库免受SQL注入?
是否 <cfqueryparam value="#form.textInput#" cfsqltype="cf_sql_varchar">
保护查询不在VARCHAR值中发送恶意SQL语句?
我们虔诚地cfqueryparam
在SQL查询中使用.
我的一些前辈在使用直接值而不是变量时似乎有点过分热心.
是不是
record_is_deleted_bt = <cfqueryparam cfsqltype="cf_sql_bit" value="0">
Run Code Online (Sandbox Code Playgroud)
矫枉过正?我的意思是,没有机会进行SQL注入,我不认为在这里使用绑定变量可以提高数据库性能.这样做是否合情合理
record_is_deleted_bt = 0
Run Code Online (Sandbox Code Playgroud)
?
cfqueryparam
除了习惯使用它之外,在这种情况下使用是否有任何优势?有缺点吗?
我有以下查询在16毫秒 - 30毫秒运行.
<cfquery name="local.test1" datasource="imagecdn">
SELECT hash FROM jobs WHERE hash in(
'EBDA95630915EB80709C69089315399B',
'3617B8E6CF0C62ECBD3C48DDF8585466',
'D519A38F09FDA868A2FEF1C55C9FEE76',
'135F94C3774F7719CFF8FF3A275D2D05',
'D58FAE69C559273D8427673A08193789',
'2BD7276F209768F2FCA6635659D7922A',
'B1E3CFBFCCFF6F5B48A849A050E6D424',
'2288F5B8A797F5302E8CA24323617236',
'8951883E36B5D38A4643DFAA0396BF13',
'839210BD564E30BE1355D1A6D4EF7081',
'ED4A2CB0C28B608C29576819CF7BE19B',
'CB26925A4874945B810707D5FF0B91F2',
'33B2FC229F0CC797A02AD163CDBA0875',
'624986E7547DBAC0F47B3005CFDE0A16',
'6F692C289BD805CEE41EF59F83F16F4D',
'8551F0033C617BD9EADAAD6CEC4B3E9E',
'94C3C0A74C2DE085FF9F1BBF928821A4',
'28DC1A9D2A69C2EDF5E6C0E6368A0B3C'
)
</cfquery>
Run Code Online (Sandbox Code Playgroud)
如果我执行相同的查询但使用cfqueryparam它运行500ms - 2000ms.
<cfset local.hashes = "[list of the same ids as above]">
<cfquery name="local.test2" datasource="imagecdn">
SELECT hash FROM jobs WHERE hash in(
<cfqueryparam cfsqltype="cf_sql_varchar" value="#local.hashes#" list="yes">
)
</cfquery>
Run Code Online (Sandbox Code Playgroud)
该表大约有60,000行."hash"列是varchar(50)并且具有唯一的非聚集索引,但不是主键.数据库服务器是MSSQL 2008.Web服务器正在运行最新版本的CF9.
知道为什么cfqueryparam会导致性能轰炸吗?无论我刷新页面多少次,它每次都会以这种方式运行.如果我将列表配对只有2或3个哈希值,它仍然表现不佳,如150-200ms.当我取消cfqueryparam时,性能如预期.在这种情况下,有可能进行SQL注入,因此使用cfqueryparam肯定会更好,但是从索引列中找到2条记录不应该花费100毫秒.
编辑:
我们使用的hash()
是非UUIDS或GUIDS 生成的哈希.散列由a生成,hash(SerializeJSON({ struct }))
其中包含要在映像上执行的一组操作的计划.这样做的目的是它允许我们在插入之前和查询之前知道该结构的确切唯一ID.这些哈希充当已经存储在DB中的结构的"索引".除了哈希之外,相同的结构将散列到相同的结果,这对UUIDS和GUIDS来说是不正确的.
该查询正在5个不同的CF9服务器上执行,并且所有这些服务器都表现出相同的行为.对我来说,这排除了CF9缓存某些东西的想法.所有服务器都连接到完全相同的DB,因此如果发生缓存,则必须是数据库级别.
例如#Trim(FORM.fromfirstname)#周围的"#"是什么?我正在添加<cfqueryparam...>
标签,我想知道是否还需要报价?
<CFQUERY NAME="account" DATASOURCE="#APPLICATION.centralDSN#">
SELECT *
FROM users
WHERE (firstname =<CFQUERYPARAM VALUE="#Trim(FORM.fromfirstname)#">)
AND (lastname = <CFQUERYPARAM VALUE="#Trim(FORM.fromlastname)#">)
AND (email = '#Trim(FORM.fromemail)#')
</CFQUERY>
Run Code Online (Sandbox Code Playgroud)
这是一个不使用该WHERE
子句引号的:
<CFIF getUser.RecordCount>
<CFQUERY NAME="cUser" DATASOURCE="#APPLICATION.centralDSN#">
UPDATE users
SET mailing_list = <CFIF IsDefined("FORM.mailing_list")>#FORM.mailing_list#<CFELSE>0</CFIF>
WHERE user_id = #getUser.user_id#
</CFQUERY>
</cfif>
Run Code Online (Sandbox Code Playgroud)
编辑:如果他们什么都不做,保持它们没有坏处,对吗?在另一个文件中,我找到了像
to="#ListFirst(EnglishEmailList)#"
cc="#ListRest(EnglishEmailList)#"
Run Code Online (Sandbox Code Playgroud)
所以如果他们已经在那里我会留下他们?
考虑以下:
<cfquery name="aQuery" datasource="#aSource#">
SELECT aColumn
FROM aTable
WHERE bColumn = <cfqueryparam value="#aVariable#" cfsqltype="#aSqlType#" />
AND cColumn = 'someConstant'
AND dColumn is null
</cfquery>
Run Code Online (Sandbox Code Playgroud)
如果我改变
AND cColumn = 'someConstant'
Run Code Online (Sandbox Code Playgroud)
至
AND cColumn = <cfqueryparam value="someConstant" cfsqltype="#aSqlType#" />
Run Code Online (Sandbox Code Playgroud)
是否有潜在的性能提升?是否有可能伤害表现?
如果我这样做(使用cfqueryparam)AND dColumn is null
怎么办?
我的发现尚无定论.
如果这很重要,请假设ColdFusion9和Oracle db 11g.
编辑:
我只想重申一下,我问的是cfqueryparam标签是专门用于常量和/或空值以及性能再现(如果有的话).
从Coldfusion 8连接到MS SQL 2008数据源时,我应该将什么Coldfusion cfsqltype用于设置为"uniqueidentifier"的SQL列.
<cfquery name="user" datasource="#ds#">
SELECT id, username
FROM users
WHERE id = <cfqueryparam cfsqltype="WHAT_CF_SQL_TYPE_HERE?" value="#arguments.id#">
</cfquery>
Run Code Online (Sandbox Code Playgroud)
谢谢!
因此,如果我有一个cfqueryparam,并且SQL中的数据类型是TEXT,我使用哪个CFSQL类型?或者我是否按照以下关于uniqueidentifiers的链接?或者将数据类型更改为varchar/longvarchar更好?
cfqueryparam ×10
coldfusion ×10
sql ×4
cfquery ×2
coldfusion-9 ×2
cfml ×1
coldfusion-8 ×1
list ×1
maxlength ×1
null ×1
oracle11g ×1
performance ×1
sql-server ×1
t-sql ×1
text ×1
types ×1