Coldfusion 表单数据到数据库:防止SQL注入
最近有人提到,我们通过表单提交将数据插入SQL数据库的方法受到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,
<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在您的计算机上是必需的