背景:我的一位同事开发了一系列基于常见本土框架的ColdFusion应用程序。有大约100个应用程序,每个都有自己的数据库。
问题:我认为使用cfqueryparam在此架构中保护查询是不可能的。也许有一个我没有想到的创造性选择,所以在我放弃之前我想要第二个意见。
数据库层
string function generateCriteria ( struct criteriaStructure ) {
var criteriaSQL = '';
if( structKeyExists(criteriaStructure,'ID')
and isValid('integer',criteriaStructure.ID)
) {
criteriaSQL &= "AND ID = '#criteriaStructure.ID#'";
}
if( structKeyExists(criteriaStructure,'NAME')
and isValid('string',criteriaStructure.NAME)
) {
criteriaSQL &= "AND NAME = '#criteriaStructure.NAME#'";
}
if( structKeyExists(criteriaStructure,'FORIEGN_ID')
and isValid('integer',criteriaStructure.NAME)
) {
criteriaSQL &= "AND FORIEGN_ID = '#criteriaStructure.FORIEGN_ID#'";
}
return criteriaSQL;
}
query function selectQuery( struct criteriaStructure ) {
<cfquery>
select * from table
where 1=1 AND #generateCriteria(criteriaStructure)#
</cfquery>
return query;
}
void function deleteQuery( struct criteriaStructure ) {
<cfquery>
delete from table
where 1=1 AND #generateCriteria(criteriaStructure)#
</cfquery>
}
void function writeQuery( struct objectStructure, struct criteriaStructure ) {
<cfquery>
update table
set fields based on objectStructure
where 1=1 AND #generateCriteria(criteriaStructure)#
</cfquery>
}
可能的网络图层代码
// get some records
criteriaStructure.FORIEGN_ID = safeText(form.foriegnKey);
getRecordsWithCertainForeignKey = selectQuery( criteriaStructure );
// update some records
criteriaStructure.NAME = safeText(url.oldName);
objectStructure.NAME = safeText(url.newName);
writeQuery( objectStructure, criteriaStructure );
CF不允许我将cfqueryparam标记放在generateCriteria函数中,因为它不在cfquery块中。但我真的不想复制每个查询功能内的标准!具有单独功能的重点是可以在一个中心位置添加标准定义。
所以我的SQL安全性依赖于魔术引号和基本的“你是一个整数吗?” generateCriteria函数中的验证。表单和URL输入也通过恶意代码剥离功能运行,这是旧版本的Nathan Dintenfass的SafeText函数:http://www.cflib.org/udf/SafeText。
还有其他我可以做的事吗?我真的很想使用cfqueryparam,但不知道如何。谢谢你的任何想法。