2011-04-21 105 views
0

每當我使用的查詢,我需要登錄到數據庫(因爲我沒有ODBC設置做)ColdFusion的查詢

<cfquery name="rsUser" datasource="dbname" username="admin" password="adminpass"> 
    SELECT * 
    FROM dbo.UsersView 
    WHERE UserID = #session.userid# 
</cfquery> 

我不喜歡的部分是具有用戶名和密碼每次我查詢時都可見。我可以使用#parameter#,但這只是一個小改進。任何其他想法都缺乏在服務器上設置ODBC?

+0

從數據庫管理員的角度來看,您還應該檢查並確保每個網站都使用自己的用戶,並且只能訪問自己的數據庫。這樣,如果有人設法破解SQL注入或其他任何方式,他們只能對該網站做任何事情。 – 2011-04-25 13:58:57

回答

6

如果您使用的是數據源,則不需要提供用戶名和密碼,它們在設置數據源時提供。如果您沒有在CF管理員中設置數據源,那麼您必須使用用戶名和密碼屬性,但也必須提供數據庫服務器信息。

因此,簡而言之,只需提取您的用戶名和密碼,你應該沒問題。

此外,最好使用傳遞到查詢中的值(在本例中爲session.userid)。 cfqueryparam不僅可以幫助保護您免受SQL注入攻擊等安全問題的侵害,還可以通知db服務器創建一個準備好的語句,該語句將在隨後的查詢調用中重用,從而提高查詢的性能。

+0

哈,這是有效的。我是cf新手,因爲它很明顯... – Daniel 2011-04-21 21:19:23

+0

大+1你應該始終使用cfqueryparam,特別是在最終用戶可以修改的範圍內。 – 2011-04-21 21:51:48

+0

fyi ..對於CF9,如果將「this.datasource」設置爲您的Application.cfc中的DSN,那麼您甚至不需要在cfquery標記中傳遞數據源。 http://forta.com/blog/index.cfm/2009/6/20/Look-No-Datasource – eapen 2011-04-22 02:48:28

2

有時候人們不喜歡把他們的用戶名和密碼放到CF Admin中,並且有一個簡單的方法,就是將數據源信息放到Application.cf(c | m)中。

如果使用Application.cfm只是做了在Application.cfm

Application.dsn = { 
    datasource = 'mydatasource', 
    username = 'myusername', 
    password = 'mypassword' 
} 

某處以下如果使用的Application.cfc將相同的代碼到你的onApplicationStart方法。然後在查詢中只使用以下

<cfquery name="myquery" attributeCollection="#Application.dsn#"> 
    SELECT * FROM mytable 
</cfquery> 

正如你可以看到這使你的代碼好和易於管理的,如果你的DSN變化,你只需要改變它在一個地方。

+0

正如OP所指出的,參數化用戶名和密碼只比將其放入每個查詢中稍微好一些。將此信息放入管理設置比將它放在源代碼中要安全得多。 – 2011-04-24 16:42:22

+0

我同意它比放入每個查詢稍微好一點,但如果您因任何原因無法訪問CF管理員,它仍然是一個解決方案。 – 2011-04-25 13:57:19

+0

我的觀點是,它被原始的海報所提及和激怒,所以它不是一個有用的答案。 – 2011-04-25 14:01:23