Coldfusion 表单数据到数据库:防止SQL注入

Coldfusion 表单数据到数据库:防止SQL注入,coldfusion,coldfusion-9,Coldfusion,Coldfusion 9,最近有人提到,我们通过表单提交将数据插入SQL数据库的方法受到SQL注入攻击,希望得到一些建议以加强我们的安全性 以下是将表单数据插入数据库的代码: <cfquery name="InsRegistrant" datasource="#application.Datasource#" dbtype="odbc"> INSERT INTO Schedule_Registrations( schedule_id,

最近有人提到,我们通过表单提交将数据插入SQL数据库的方法受到SQL注入攻击,希望得到一些建议以加强我们的安全性

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

        <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>

在附表中插入注册信息(
附表11,
名字,
姓,
电话号码,
电子邮件,
嘉宾:,
列表类型,
注册日期时间
)
价值观(
#url.schedule_id#,
“#形式.名字#”,
“#形式.姓#”,
“#清洁电话号码#”,
“#FORM.email#”,
#与会者、嘉宾#,
#与会者列表#类型#,
#createodbcdatetime(现在())#
)                
CleanPhoneNumber的设置方式如下:

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

比如说,我被告知要使用

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

但我不知道该换什么,在哪里换。当我用这样的值替换这些值时,我会得到一个错误


任何方向都会有帮助。

您可以做一些好的实践

对于您提供的插入代码,您可以做的一件事是在插入数据之前显式检查表单字段的输入。检查空格和“.”之类的内容。您还希望确保用户不会看到您输入的错误数据中的错误消息。这对想了解表结构的人很有用

否则,将insert放在存储过程中,并在为insert或update调用存储过程之前验证输入参数

下面是一个很好的防止SQL注入攻击的方法列表。它与asp.net相关,但无论您使用何种语言,这些概念仍然适用


您应该将所有表单和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>

在附表中插入注册信息(
附表11,
名字,
姓,
电话号码,
电子邮件,
嘉宾:,
列表类型,
注册日期时间
)
价值观(
,
,
,
,
,
,
,
#createodbcdatetime(现在())#
)                

我不确定所有数据类型是否正确,请参阅以获取所有数据类型。

很抱歉,我没有重新确认这是codefusion特有的。看起来下面的答案会更有帮助。这里有一个链接可以解释他的建议。这是我想的基本方法,但有些语法是错误的。很好,谢谢!通常,ColdFusion的数据源只允许每个CFQuery使用一条sql语句,因此这也有助于sql注入攻击。Cfqueryparam无疑会让事情变得更紧张,但请注意,您现在很容易受到跨站点脚本攻击。在显示任何表单提交之前,请确保对其进行SANATIZE处理。只需澄清一下,数据库类型和驱动程序是决定是否可以在cfquery中执行多个语句的因素。MySQL支持多个语句,但是connector/j驱动程序(由CF使用)默认禁用它们。而MS SQL驱动程序在默认情况下使它们处于启用状态,ie查询则处于风险之中。这要看情况而定。但正如其他人所说,最安全的方法是防御性地编写代码并始终使用cfqueryparam。感谢您对此的澄清。仅供参考。我不认为dbtype在您的计算机上是必需的