2012-01-11 44 views
1

我正在將我的coldfusion9查詢代碼從ms access 2003遷移到mySql。我的MySQL知識是有限的,所以這是一個初學者的問題:)遷移ms訪問mysql - 更改CF編碼(來自新手)

在我的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代碼提供了一個很好的,簡單的how-to資源(在我的在線搜索中,大部分編碼信息都假設我擁有的知識水平較高)

+0

儘管可能,數據庫驅動的Web應用程序並不與*任何*用戶提供的值進行交互 - 是非常不尋常的。任何與用戶提供的值(URL參數,表單域等等)交互的查詢都有風險。 – Leigh 2012-01-11 19:52:28

+0

好的,我明白了。我從我的閱讀中假定,每個數據庫查詢都需要受到保護。 – Betsy 2012-01-14 17:12:56

+0

不,只可以利用包含用戶提供的參數或信息的查詢。包含硬編碼字符串(如上所述)的查詢是安全的。 – Leigh 2012-01-16 18:05:44

回答

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注入的保護。

+0

Al,非常感謝你的回答 - 我在第一個示例代碼中獲得了你要去的地方,但是你在第二個代碼中失去了我:)我很想優化我的數據庫以加快緩存速度,但我不明白你使用「表格。顏色「 - 我假設這個例子假設表單的初始存在並且」藍色「是它的輸出值嗎?如果是這樣,我跟着你:) – Betsy 2012-01-14 17:11:19

+0

」form「是一個由ColdFusion自動創建的變量作用域當提交HTML表單時 – ale 2012-01-14 20:39:48

0

至少有三個好理由使用cfqueryparam

1)從安全注射或其他不良意圖的用戶。

2)查詢執行速度更快,因爲您明確指出了它們的類型。

3)它只是一個好主意,再加上類似於其他語言的功能,如

$unsafe_variable = $_POST["user-input"]; 
$safe_variable = mysql_real_escape_string($unsafe_variable); 

我們用這樣的例子遍佈DAO對象(這些都是有代碼的人身上,說氟氯化碳到數據庫)

<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的方法中。

+0

感謝您的解釋 – Betsy 2012-01-14 17:14:53