2011-06-02 69 views
4

一個知道很多人使用預先準備好的語句,單獨佔位符綁定。也就是說,他們不打算多次發表同樣的陳述,並且有不同的價值觀。他們只是覺得用這種方式使用PS更安全。使用預先準備好的語句爲佔位符綁定單獨使用?

我對MySQL的PS的理解是,SQL作爲單個傳輸發送,然後是一個或多個傳輸來發送值。因此,使用PS進行單個查詢的效率會比使用簡單查詢的效率要低,而這在單個傳輸中完成。

做安全性好處PS提供出來的效率損失?我不這麼認爲,因爲在將它們添加到SQL之前,我認爲難以正確地轉義值。

你的想法是什麼?

+0

這就是爲什麼存儲過程好得多。由於sproc已經存在於數據庫中,所以只需要一次調用 - 所以你不需要準備它。此外sprocs有參數,所以你不能注入(請不要引用WTF動態SQL示例),你只需要給你的應用程序用戶EXECUTE權限沒有選擇,插入,刪除,刪除,截斷,顯示等等等等 - 你覺得多安全它會變成? – 2011-06-03 02:06:56

回答

8

準備好的語句被編譯並存儲在DBMS上。這些語句可能被緩存和重用。

設想多次觸碰同一頁面時的好處。此外,一些數據庫引擎(例如Oracle)可能會強加嚴格的語句限制並相信我(我從經驗中知道),但您不想耗盡這些。

+2

+1:只需使用Prepared Statements即可完成所有任務。罕見的例外情況是一次僅作爲數據遷移的一部分執行的腳本。 – 2011-06-02 23:55:54

+1

爲後續查詢緩存查詢是我迄今見過的唯一引人注目的參數。 – mellowsoon 2011-06-03 01:32:10

+0

緩存準備好的語句模板多長時間? – 2011-06-03 02:07:50

6
Do the security benefits PS offer out weigh the loss in efficiency? 

我認爲是的,他們可能會這樣做。儘管使用準備好的聲明實際上效率很低,但收集一些數字證明效率低下會給您的運營帶來某種顯着障礙,這不是謹慎的嗎?如果效率不高,但您的Web服務器仍然可以處理它,那麼它是否太重要?在你能說出多少關係之前,你必須量化它們之間的差別。

事實證明,您正在權衡安全性,以避免對可能高效的模糊想法。這可能是錯誤的方式。

編輯:在回答第一個評論:

當然的參數可以變成另一種方式,你可以爭辯說,一些怎樣的評價應當成爲多少更安全準備好的發言如果完全不是查詢構建的話。但是這比量化腳本效率的問題更難以量化。

我建議大家在這方面的目標是得出一個解決方案,他們可以有合理的信心保護他們免受攻擊;當然,如果你虔誠地使用準備好的語句,或者你認真地在需要時逃避查詢變量,那麼你已經做到了。 IMO真正應該考慮的是:如何系統是我的避免SQL漏洞的方法?它提供了多大的範圍以避免錯誤發生,因爲在創建會產生問題的代碼時無法識別?

如果您每次進行數據庫查詢時都必須謹慎地記住每一個將要使用的變量並將其轉義出來,這會導致冗長的代碼,並且很可能會忽略某些變量或其他變量。切割和粘合琴絃的性質也有點不整齊。如果你有一定程度的抽象,需要你識別每個查詢變量及其類型,並且如果你不這樣做會導致查詢失敗,那麼不管是否使用準備好的語句,已經以更系統的方式做事,這有助於避免忽略其他地方的謹慎保護。

+1

我可以支持你的論點,但是你必須說服我準備好的聲明,以確保在正確逃脫的值上有更多的安全性。如果轉義值可以像PS一樣安全,那麼兩者會互相取消,而您只剩下PS可以讓更多的數據庫服務器訪問。 – mellowsoon 2011-06-03 00:35:26

+0

@mellowsoon假設每個查詢都正確地轉義了每個值,並且轉義('mysql_escape_string' - doh!)在所有情況下都能正常工作 - 也考慮到即使是'mysql_real_escape_string' [有問題](http:// ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html)(「...旨在防止SQL注入的函數用於實際觸發它。」)。是啊,不,它也只是* tidier *來使用佔位符。 – 2011-06-03 00:39:23

+1

關於mysql_real_escape_string的文章非常有趣,我很高興看到它,但是多年來我也看到類似的錯誤,這些錯誤使得準備好的語句也容易受到攻擊。就整理者而言,我仍然使用沒有準備好的陳述的佔位符。我的數據庫抽象引用了這些值,而不是單獨發送它們。 – mellowsoon 2011-06-03 01:31:04

1

我不認爲這應該是一個效率問題。我懷疑你會測量一個有意義的差異,尤其是與數據庫調用的網絡延遲和其他代碼引入的低效率相比。

單獨防範SQL注入的好處本身就值得承認價格。

我認爲這是Donald Knuth警告的微型優化的一個例子。

但不要推測或依賴你在這裏得到的意見。成爲一名科學家並獲得一些數據。如果數據支持你的情況,盡一切辦法去做。

+0

當你每秒處理5k連接時,你仍然認爲它是微型優化嗎? – mellowsoon 2011-06-03 01:33:14

相關問題