2009-06-21 132 views
1

它們比做像mysql_query("SELECT important_data FROM users WHERE password = $password")這樣的東西更容易受SQL注入的影響嗎?SQL存儲過程是否安全?

+0

這是容易被SQL注入的CLASSIC方法 - 將東西連接在一起形成一個SQL語句並且不驗證任何用戶輸入(例如對於$ password)。 – 2009-06-21 14:52:23

+1

是的,我認爲這就是reyjavikvi所說的:使用數據庫存儲過程比使用示例中構造的SQL查詢更安全。 – cheduardo 2009-06-21 15:04:26

回答

5

他們比你所做的更安全。您的查詢將原始SQL發佈到數據庫,這意味着您的參數不被視爲sql參數,而是作爲普通的舊sql。

這是我的意思。

使用存儲過程的密碼變量不能是sql,它必須是系統正在查找的一條信息。在您的例子什麼是真正發送到DB是

SELECT * FROM用戶其中password =( '您的密碼在這裏' - $密碼變量).....所以有人能做到像

SELECT *從用戶WHERE密碼=('您的密碼在這裏';選擇*從用戶 - $密碼變量)。

或更糟糕的是:

SELECT * FROM用戶WHERE密碼=( '你的密碼在這裏'; DROP DATABASE DATABASE_NAME - $ password變量)。

非動態sql存儲過程不會允許這樣做,因爲輸入參數不會作爲額外的sql執行。

參數化的SQL確實照顧到了這一點,但技術上存儲過程仍然更安全一些,因爲訪問表中的信息的用戶不需要讀取訪問權限。它只需要能夠執行存儲過程。根據您的需要,這可能會或可能不會發揮作用。

+0

所以基本上,使用存儲過程使所有輸入值不可執行,而使用原始SQL允許將數據解釋爲代碼。得到它了。 – Green 2012-10-24 17:54:25

+0

大部分是的,你可以使用參數化的sql並在那裏獲得相同的好處,並且你可以編寫存儲過程來執行動態代碼,這樣你就可以撤銷你從中獲得的安全性,但總之是肯定的。 – kemiller2002 2012-10-24 18:09:13

0

沒有安全技術。技術只能用於安全或不安全的方式。

也就是說,存儲過程需要稍微更多的創意編碼才能允許SQL注入 - 儘管如此。在我意識到的任何SQL數據庫引擎中,沒有什麼能夠阻止你連接字符串。

4

不一定,你可以在裏面做字符串連接,並且曝光會相同。如果你使用動態sql和參數變量(沒有字符串連接來產生SQL),你會得到很好的保護。

0

如果他們正確參數,你是不是在做動態SQL那麼他們更安全,你也只要您使用參數,不使用字符串連接的用戶受益於執行計劃重用

2

輸入的值,不會有SQL注入的風險。存儲過程在這方面有點「更安全」,因爲它們鼓勵你使用參數。但是,如果在你的程序做一些像

EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password 

然後你會回到原點1,並非常容易受到SQL注入。

此外,還有一種「預先準備的語句」,它不是存儲過程,但也可以使用參數。因此它們可以用來避免SQL注入。