最近有人提到我们通过表单提交将数据插入我们的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#" />
但我不确定要更换什么以及在哪里。当我用这样的值替换值时,我得到一个错误。
任何方向都会有所帮助..
答案 0 :(得分:5)
您应该在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
了解所有数据类型。
答案 1 :(得分:0)
您可以采取一些良好做法。
对于您提供的插入代码,您可以做的一件事是在插入数据之前显式检查表单字段的输入。检查空格和“'”之类的内容。您还希望确保用户不会从输入的错误数据中看到您的错误消息。这对想要了解表结构的人有用。
否则将插入放在存储过程中并在调用插入或更新的存储过程之前验证输入参数。
这是一个很好的列表,可以帮助您防止SQL注入攻击。它与asp.net有关,但无论您使用何种语言,这些概念仍然适用。