我正在将我的coldfusion9查询代码从ms access 2003迁移到mySql。我的MySql知识有限,所以这是初学者的问题:)
在我的MS Access代码中,我使用了简单的cfqueries ...这是一个例子:
<cfquery name="catalog" datasource="mydatasource">
SELECT TableID, DateListed, FirstColor, SecondColor
FROM mytable
WHERE FirstColor='blue' OR SecondColor='blue'
ORDER BY DateListed DESC
</cfquery>
我从在线阅读中了解到,需要使用cfqueryparam和mySql来防止注入恶意代码。我不确定如何注入恶意代码....因为在线网站用户不通过表单与我的数据库交互,我还需要使用cfqueryparam吗?
如果是这样,你能给我一个将cfqueryparam添加到上面代码的方法的例子吗? - 或者 - 建议一个好的,简单的操作资源来编写mySql代码(在我的在线搜索中,大多数编码信息都预先假定了比我更高的知识水平)
答案 0 :(得分:2)
除了防止SQL注入之外,CFQUERYPARAM还允许您使用绑定变量,这可以提高性能,因为除了某些变量之外的相同查询只需要编译一次并且可以缓存。
从您的示例中,您可以使用cfqueryparam:
<cfquery name="catalog" datasource="mydatasource">
SELECT TableID, DateListed, FirstColor, SecondColor
FROM mytable
WHERE FirstColor=<cfqueryparam cfsqltype="cf_sql_varchar" value="blue">
OR SecondColor=<cfqueryparam cfsqltype="cf_sql_varchar" value="blue">
ORDER BY DateListed DESC
</cfquery>
然而,这并不会给你带来太大的收益。收益是在这样的情况下:
<cfquery name="catalog" datasource="mydatasource">
SELECT TableID, DateListed, FirstColor, SecondColor
FROM mytable
WHERE FirstColor=<cfqueryparam cfsqltype="cf_sql_varchar" value="#form.color#">
OR SecondColor=<cfqueryparam cfsqltype="cf_sql_varchar" value="#form.color#">
ORDER BY DateListed DESC
</cfquery>
现在,无论颜色是蓝色还是红色还是淡黄绿色,此查询都会在数据库中编译,并且在后续调用中会更快。此外,恶意用户可以将form.color
更改为blue';drop table users;
的值,并且您将受到SQL注入的保护。
答案 1 :(得分:0)
使用 cfqueryparam
至少有三个充分的理由1)来自注射的安全性或来自用户的其他不良意图。
2)查询执行得更快,因为您明确说明了它们的类型。
3)它只是一个好主意,加上类似于其他语言功能,如
$unsafe_variable = $_POST["user-input"];
$safe_variable = mysql_real_escape_string($unsafe_variable);
我们在DAO对象中使用了这样的示例(这些是具有与数据库对话的代码的cfcs)
<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.assessmentID# />
<cfqueryparam cfsqltype="CF_SQL_CHAR" value='%#arguments.searchString#%' />
<cfqueryparam cfsqltype="CF_SQL_DATE" value=#arguments.assessmentDate# />
将#arguments.varname#传递给包含SQL的方法。