好主意!没有标签的cfqueryparam-strength验证

时间:2014-09-30 14:34:37

标签: sql security coldfusion xss sql-injection

背景:我的一位同事开发了一系列基于常见本土框架的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,但不知道如何。谢谢你的任何想法。

0 个答案:

没有答案