2013-12-21 25 views
-1

使用預處理語句(查詢)保存從客戶端接收到的數據。例如:如果我正在處理已保存的數據,是否應該使用預處理語句

if ($stmt = $mysqli->prepare("INSERT INTO table_1 VALUES (?, ?, ?);")) 
{ 
    $stmt->bind_param(/* data */); 
    $stmt->execute(); 
    // ... 
} 

如果在某個時間點之後我想要使用客戶端的數據,我必須再次使用準備好的語句嗎?是否有使用經典查詢的風險?例如:

if ($stmt = $mysqli->prepare("SELECT * FROM table_2 WHERE something = ?;") 
{ 
    $stmt->bind_param("s", /* Selected value from the `table_1` */); 
    $stmt->execute(); 
    // ... 
} 
+0

如果沒有用戶交互,則不必使用準備語句。 – Anam

+0

在第一個例子中是用戶交互,但在第二個例子中,我正在處理已經從客戶端保存的數據......這樣保存的數據足夠安全嗎?我不必使用準備好的陳述/清理數據?我理解它嗎? – 0101

+0

是你旁邊的其他人能夠訪問數據嗎?如果是的話,你應該使用準備聲明,否則你不必。 – Anam

回答

1

是的,你應該使用預處理語句/參數化查詢,如果查詢可以包含任何用戶輸入(如形成指定WHERE子句從用戶搜索詞)。

允許用戶在查詢中輸入的最大危險不是持續惡意數據,它是SQL injection。這可以在任何類型的查詢上完成,因此,在運行查詢(包括用戶輸入)的地方,您應該始終使用參數化的預準備語句(或者根據RDBMS規則手動轉義所有用戶輸入)。

+0

如果使用PDO,則可以使用預準備語句(客戶端),即使對不支持它們的RDBMS也是如此。 – Mike

2

您應該總是使用參數化查詢,因爲它們確保數據在數據庫級別正確轉義。這是你可以自己處理的事情,但這樣做容易出錯。

請注意,查詢必須正確參數化。只需使用prepare不一定就夠了。

請考慮您在存儲到另一個表的列中是否有撇號。如果它沒有正確逃脫,你會得到一個錯誤。

+0

我同意。通過使用參數化查詢,您絕對不會失去任何東西,因此即使您提供值,也要始終使用它們。每個參數最多需要一行代碼。 – Mike

+0

@Mike,如果你使用PDO則更容易;不需要綁定,只需傳遞一個數組來執行()。 –

+0

@BillKarwin這就是爲什麼我說「至多」。但你是對的。 – Mike