coldfusion - 形成数据到数据库 : preventing SQL injection

标签 coldfusion coldfusion-9

最近有人提到我们通过表单提交向SQL数据库中插入数据的方法容易受到SQL注入(inject)攻击,希望得到一些建议来加强我们的安全。

这是将表单数据插入数据库的代码:

        <cfquery name="InsRegistrant" datasource="#application.Datasource#" dbtype="odbc">

            INSERT INTO Schedule_Registrations(
                schedule_id,
                first_name,
                last_name,
                phone_number,
                email,
                guest,
                list_type,
                datetime_registered
             )
            VALUES(
                #url.schedule_id#,
                '#FORM.first_name#',
                '#FORM.last_name#',
                '#CleanPhoneNumber#',
                '#FORM.email#',
                 #attendee.guest#,
                 <!--- Values for list types 
                    0 = NEVER USE Will cause many many problems
                    1 = Main List
                    2 = Waiting List --->                    
                 #attendee.list_type#,
                 #createodbcdatetime(now())#
             )                
        </cfquery>

CleanPhoneNumber 是这样设置的:

<cfset CleanPhoneNumber = REReplace(form.phone_number, "[^0-9]", "", "ALL") />

我被告知要使用,例如,

<cfqueryparam cfsqltype="cf_sql_varchar" value="#form.phone_number#" />

但我不确定要替换什么以及在哪里替换。当我用这样的值替换值时,出现错误。

任何方向都会有帮助..

最佳答案

您应该将所有表单和 url 变量包装在 cfqueryparam

您的查询将如下所示:

<cfquery name="InsRegistrant" datasource="#application.Datasource#" dbtype="odbc">
    INSERT INTO Schedule_Registrations(
         schedule_id,
         first_name,
         last_name,
         phone_number,
         email,
         guest,
         list_type,
         datetime_registered
     )
     VALUES(
         <cfqueryparam cfsqltype="cf_sql_integer" value="#url.schedule_id#">,
         <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.first_name#">,
         <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.last_name#">,
         <cfqueryparam cfsqltype="cf_sql_varchar" value="#CleanPhoneNumber#">,
         <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.email#">,
         <cfqueryparam cfsqltype="cf_sql_integer" value="#attendee.guest#">,
         <!--- Values for list types 
            0 = NEVER USE Will cause many many problems
            1 = Main List
            2 = Waiting List --->                    
         <cfqueryparam cfsqltype="cf_sql_integer" value="#attendee.list_type#">,
         #createodbcdatetime(now())#
     )                
</cfquery>

我不确定我得到的所有数据类型是否正确,请参阅 full documentation of cfqueryparam对于所有数据类型。

关于coldfusion - 形成数据到数据库 : preventing SQL injection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8774035/

相关文章:

coldfusion - 如何在某些 java 类或包上限制 createObject()?

coldfusion - 使用 onMissingMethod 无法访问对象变量

coldfusion - 从表单中按顺序显示 CFLoop 项目

java - 将二进制数据反序列化为对象时出现 StackOverflowError

coldfusion - 在 ColdFusion 集群上重置应用程序范围

hibernate - 如何使用 ColdFusion ORM 映射基类?

sql-server - 在变量中使用语句时,Coldfusion 更新查询会抛出错误

javascript - 具有自定义皮肤的双 slider 控件

coldfusion - 用 CFML 编写的所有 cfc 方法都需要 output=false 吗?

java - 64 位服务器上的 Payflow Pro Gateway Java SDK (ColdFusion)