最近有人提到,我们通过表单提交将数据插入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>

CleanPhoneNumber的设置方式如下:
<cfset CleanPhoneNumber = REReplace(form.phone_number, "[^0-9]", "", "ALL") />

例如,有人告诉我使用
<cfqueryparam cfsqltype="cf_sql_varchar" value="#form.phone_number#" />

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

任何方向都会有所帮助。

最佳答案

您应该将所有表单和网址变量包装在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 了解所有数据类型。

10-02 01:33
查看更多