2014-01-24 71 views
0

到現在爲止,我hapily住在一起的逃逸功能和客戶端只使用SQL命令的服務器通信的範例:準備好的語句如何在SQL級別上工作?

select * from table where name = 'O\'Hara'; 

PDO,在這裏你只需要創建一些模板,並用不同的餵養它的情況下數據,這種範例很可能被打破。否則,PDO必須自己調用轉義函數,並且實際上沒有理由使用它(與自己轉義它沒有任何區別)。

因此,如果客戶端和服務器之間的SQL通信範例被破壞,它是如何工作的?查詢是否不再作爲SQL命令發送?它是MySQL協議的一些擴展嗎? MySQL協議遠比SQL對話更豐富嗎?一般來說它是否工作,例如使用遠程服務器?與純粹的SQL命令相比,此功能是否有任何限制?

我試過通過mysql文檔,但沒有發現任何相關的。

+1

http://stackoverflow.com/questions/8263371/how-prepared-statements-can-protect-from-sql-injection-attacks/8265319#8265319 –

+0

@YourCommonSense所以呢?你能否引用該答案中的任何特定段落? – TMS

+1

相當多。但從語調來看,我懷疑這是否值得這麼麻煩。 –

回答

1

Therory

預處理語句確實上協議層的特徵,這意味着客戶端發送所述查詢模板的第一和第二中請求的參數。此外,客戶端可以發送多個數據請求 - 已經準備好 - 查詢。 (這就是爲什麼這個名字)

現實

的PDO編寫代碼的方式,它不是利用該協議的功能,它真的只是逃脫值,並與該語句替換佔位符轉義值,然後將常規SQL查詢發送到服務器。

+0

嗯,這是一個很大的失望!那麼爲什麼PDO如此推廣呢?我可以留在我那古老的逃亡世界裏,沒有任何區別。 PS:你能否引用一些資源? – TMS

+1

@Tomas PDO引入了一定程度的數據庫抽象,如果您保持與SQL標準兼容,可以幫助在幾種類型的數據庫上運行您的應用程序。此外,我認爲,即使是客戶端網站準備的語句,使您的代碼看起來更好+在應用程序中有參數和查詢分開爲您提供設計可能性 – hek2mgl

+0

嗯,這似乎不是一個真正的理由顛倒了自己的代碼:)您可以分開參數和查詢,並且在沒有PDO的情況下擁有漂亮的代碼;這只是一個設計問題:) – TMS