在ColdFusion方面,如何防止SQL注入?我对语言/框架很陌生。
这是我的示例查询。
<cfquery name="rsRecord" datasource="DataSource">
SELECT * FROM Table
WHERE id = #url.id#
</cfquery>
我认为传递url.id
是一种风险。
答案 0 :(得分:18)
为您的ID使用<cfqueryparam>
标记:
http://www.adobe.com/livedocs/coldfusion/6.1/htmldocs/tags-b20.htm
<cfquery name="rsRecord" datasource="DataSource">
SELECT * FROM Table
WHERE id =
<cfqueryparam value = "#url.id#"
CFSQLType = "CF_SQL_INTEGER">
</cfquery>
答案 1 :(得分:5)
<cferror>
答案 2 :(得分:3)
除 cfqueryparam 外,您还可以在页面顶部使用 cfparam ,其中包含传递给它的每个变量的SQL。这也有助于记录。
e.g。
<cfparam name="url.id" type="integer">
或更高级:
<cfparam name="url.id" type="regex" pattern="\d" default="">
由于允许使用正则表达式模式,因此这些模式非常强大:
<cfparam name="form.place" type="regex" pattern="[A-Z0-9]{1,6}|" default="">
<!--- Upper case Alpa or Numeric, 1-6 characters or empty string --->
另外,请确保在 application.cfm 或 application.cfc 中使用cferror
,以防止泄露查询表和列名。
答案 3 :(得分:0)
另一种选择是使用存储过程(如果数据库支持它们)。
http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_r-s_22.html
答案 4 :(得分:0)
使用cfqueryparam是为了防止SQL注入是好的。但是,如果要使用cfqueryparam,则不能在cfquery标记中使用cachewithin。我的另一个建议就是这样做
将此条件置于页面顶部。
&lt; CFIF IsDefined(“id”)AND NOT IsNumeric(id)&gt; &lt; cfabort showerror =“无效的查询字符串”&gt; &LT; / CFIF&GT;
在您的查询代码中,使用如下:
WHERE ID = #Val(id)#
另见,如何预防: http://ppshein.wordpress.com/2008/08/28/block-ip-in-coldfusion/