2014-04-09 39 views
0

我在當前項目中使用了幾次以下類型的代碼來清除一些表。因爲我不明白我正在使用PDO。不使用準備好的語句截斷表是否安全?

$clearResult = $db->query('TRUNCATE TABLE table_name'); 

我目前經歷和更新一些我以前的劇本,以確保他們都充分利用準備好的發言和寫的方式來減少(希望停止)SQL注入。

感謝您的任何見解。

問候

喬恩

+3

您不必使用預處理語句,因爲沒有用戶輸入。 –

+3

準備好的語句適用於需要多次使用不同參數運行相同的基本查詢,或需要使用placehodlers插入動態數據或需要綁定變量以獲得結果的情況。你不會用不同的參數多次運行這個查詢,沒有外部數據要粘貼到查詢中,也沒有返回的數據。所以......不,你不需要準備好的聲明。 –

+0

太棒了......非常感謝大家......如果我能打勾你們所有的答案,我會......歡呼喬恩。感謝您澄清準備好的陳述以及答案。我的代碼和未來的代碼對它來說都是更好的...現在愛上PHP很多,現在3個月後... – Parzival

回答

2

沒有,有在實際查詢沒有用戶輸入的,所以沒有注射的風險。

您必須確保用戶無法觸發截斷,除非他們被授權。

1

確定是否應使用準備好的語句不是SQL操作。爲防止SQL注入,當允許綁定參數的查詢中涉及任何變量時,應使用預準備語句。這並不僅限於用戶輸入,任何變量都應該是一個綁定的參數,不管它來自哪裏。

在您的示例中,查詢不需要任何變量,因此使用預準備語句沒有安全性優勢。

即使您的table_name來自用戶輸入或變量,預準備語句也不是解決方案,因爲它不可能綁定表名。

+0

請解釋downvote。 – MrCode

1

準備好的語句對截斷查詢不起作用。

使用用戶輸入運行查詢時,PDO準備語句很有用,因爲它們允許您使用綁定參數等功能來清理用戶輸入。

它們對優化多次運行的查詢也很有用。

你可能需要閱讀了關於PHP文檔準備語句中一點點 - PHP documentation for prepared statements

很多更成熟的數據庫都支持準備 語句的概念。他們是什麼?它們可以被認爲是應用程序想要運行的SQL的編譯模板 ,可以使用可變參數來定製 。準備報表提供 兩大好處:

該查詢只需要解析(或準備)一次,但可以使用相同或不同的參數多次執行 。當 準備好查詢時,數據庫將分析,編譯並優化其執行查詢的計劃。對於複雜的查詢,如果需要用不同的 參數多次重複相同的查詢,則該過程可能會花費足夠的時間,以致明顯地減慢應用程序的速度 。通過使用準備好的語句,該應用程序避免了重複分析/編譯/優化循環的 。這意味着準備好的 語句使用更少的資源,從而運行得更快。

參數 準備語句不需要引用;驅動程序自動 處理這一點。如果應用程序專門使用預準備語句,開發人員可以確保不會發生SQL注入(但是,如果查詢的其他部分正在使用未轉義的 輸入構建,則仍然可以執行SQL注入),但是 。編寫的語句如此 非常有用,它們是PDO將爲不支持它們的 驅動程序模擬的唯一功能。這確保了應用程序將能夠使用相同的數據訪問範例,而不管數據庫的 功能如何。