【问题标题】:Coldfusion, secure cfc's from SQL injection attacksColdfusion,保护 cfc 免受 SQL 注入攻击
【发布时间】:2011-08-26 19:32:06
【问题描述】:

我有一堆通过 CFC 将数据发布到数据库的外部表单。

我做的是

  1. 创建带有回发的表单
  2. 在回发中创建一个对象并将表单数据映射到该对象 (cfc)
  3. 使用 CFparam 对类型进行验证并存储在 THIS 中。范围
  4. 调用自定义方法来扫描字符串以消除攻击(似乎效果很好)
  5. 要插入的 Cfquery。

我可以或应该做些什么来保护应用程序免受插入时的 SQL 攻击?我在 select 语句中使用 CFqueryParam,我是否也应该在 insert 语句中使用?

一个简单的 CFC 示例:

<!--- Instance Veriables ---> 
<cfparam name="THIS.firstPrintedField" type="string" default="#NullString#" />
<cfparam name="THIS.SecondPrintedField" type="string" default="#NullString#" />
<cfparam name="THIS.participantFullName" type="string" default="#NullString#" />
<cfparam name="THIS.studentStatus" type="string" default="#NullString#" />
<cfparam name="THIS.dob" type="date" default="#NullDate#" />
<cfparam name="THIS.readAndUnderStood_Day" type="string" default="#NullString#" />
<cfparam name="THIS.readAndUnderStood_Month" type="string" default="#NullString#" />
<cfparam name="THIS.readAndUnderStood_Year" type="string" default="#NullString#" />
<cfparam name="THIS.agreeToTerms" type="boolean" default="#NullBool#" /> 
<cfparam name="THIS.guardianFirstName" type="string" default="#NullString#" />
<cfparam name="THIS.guardianMiddleName" type="string" default="#NullString#" />
<cfparam name="THIS.guardianLastName" type="string" default="#NullString#" />
<cfparam name="THIS.DateTimeSubmited" type="date" default="#NullDate#" />

<cffunction access="public" name="addRecords" returntype="boolean">
    <cftry> 
        <!--- Sanitize the string properties --->
        <cfset Sanitize() />
        <cfquery datasource="#DSN#" name="qryAddRecords">
            INSERT INTO mod_OutdoorProgram_Waivers
            (
                firstPrintedField
                ,SecondPrintedField
                ,participantFullName
                ,studentStatus
                ,dob
                ,readAndUnderStood_Day
                ,readAndUnderStood_Month
                ,readAndUnderStood_Year
                ,agreeToTerms
                ,guardianFirstName
                ,guardianMiddleName
                ,guardianLastName
            )
            VALUES
            (
                '#THIS.firstPrintedField#'
                ,'#THIS.SecondPrintedField#'
                ,'#THIS.participantFullName#'
                ,'#THIS.studentStatus#'
                ,'#THIS.dob#'
                ,'#THIS.readAndUnderStood_Day#'
                ,'#THIS.readAndUnderStood_Month#'
                ,'#THIS.readAndUnderStood_Year#'
                ,'#THIS.agreeToTerms#'
                ,'#THIS.guardianFirstName#'
                ,'#THIS.guardianMiddleName#'
                ,'#THIS.guardianLastName#'
            )
        </cfquery>
        <cfcatch><cfreturn false /></cfcatch>
    </cftry>
        <cfreturn true />       
</cffunction>

【问题讨论】:

  • 为了说得非常清楚,请遵循 DefyGravity 的建议,永远不要使用不使用 &lt;cfqueryparam /&gt; 的动态值编写查询。

标签: sql-server-2008 coldfusion sql-injection cfc


【解决方案1】:

cfqueryparam 应该在任何地方使用,因为它是 ColdFusions sql 注入漏洞的解决方案。

【讨论】:

  • +1 是显而易见的答案....仅供参考,某些数据库不允许您在 SELECT 语句中使用 CFQUERYPARAM。
【解决方案2】:

另外,如果您确定要发布到您的 CFC 的站点,您可以使用一些逻辑来保护它们,以仅接受来自该特定站点/IP 地址的连接...只需再采取一步,以免人们搞砸用你的代码...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多