2013-07-26 45 views
0

當我重複使用數據庫中的數據進行查詢時,是否需要使用mysqli_real_escape_string。數據先前已被轉義,因此可以安全地將其插入數據庫。我知道在將數據插入數據庫時​​,反斜槓被刪除。 謝謝。插入數據後需要MySQL轉義

+0

向我們顯示代碼。 –

+0

我總是爲我所有的值使用mysqli和佔位符,所以我不必擔心轉義,因爲它全部由方法處理。 – Drew

+0

要顯示數據,你應該使用htmlspecialchars() –

回答

5

是的,當您在另一個查詢中重新使用數據時,您必須重新轉義來自數據庫的數據。考慮逃避禮物包裝禮物。您在一個查詢中「包裝」數據庫的一些數據。它會將數據解壓並放入數據存儲區。當您稍後再次檢索該數據時,包裝消失並且數據再次「危險」。

例如考慮這樣的事情:

$name = "Miles O'Brien"; 
$safe = mysql_real_escape_string($name); // name becomes Miles O\'Brien 
$sql = "INSERT INTO people (names) VALUES '$safe'"; 
$result = mysql_query($sql) or die(mysql_error()); 

現在的名字是在數據庫中,但逃避你執行了,不再禮物 - 它是由數據庫中刪除,因爲它處理查詢,所以如果你做這樣的事情:

$sql = "SELECT name FROM people" 
$result = mysql_query($sql) or die(mysql_error()); 
while($row = mysql_fetch_asssoc($result)) { 
    $name = $row['name']; // get Miles O'Brien from the DB again 

在這裏,你會從字面上檢索Miles O'Brien沒有任何逃脫。

$other_sql = "UPDATE ... WHERE name=$name"; <---INJECTION HERE 
} 

逃逸是不是你只與「外」的數據... 任何你插入一個查詢字符串數據是「外」的數據,即使你剛剛做一些事情,從數據庫中的數據只是一個幾行代碼之前。

TL; DR:你可以很容易地注入自己。

+0

感謝您的詳細解釋和示例。 – Tom

1

這不是逃避手段。

轉義文本表示插入轉義字符,以便它可以插入到SQL字符串中並被解釋爲原始文本。
除非使用錯誤的轉義字符,否則它對實際值沒有影響。

每次將它連接成任何種類的結構化語言時,都需要正確地轉義您的文本。

使用SQL時,最好使用參數而不是串聯。

3

是的,你需要它。轉義僅用於使查詢在語法上有效,它們不是存儲在表中的數據的一部分。無論何時您將字符串插入查詢中,都需要將其轉義。

舉一個例子,假設你有一個全名的表,並且有一個姓爲O'Reilly的人。您執行查詢以將此名稱變爲$lname,然後您希望在另一個查詢中使用該變量,例如

$query = "SELECT username WHERE last_name = '$lname'"; 

如果不逃串,生成的查詢將是:

SELECT username WHERE last_name = 'O'Reilly' 

正如你所看到的,報價是不正確的平衡。你需要逃避它,這樣它會:

SELECT username WHERE last_name = 'O\'Reilly' 

但是,如果你使用準備好的查詢與佔位這些參數,你不必擔心這麼多,在所有(事實上,這將是錯誤轉義綁定到佔位符的變量,因爲您將存儲反斜槓)。這通常是優選的。

另外,考慮不提取和重新存儲的任何數據,而是圍繞使用SQL本身移動數據:

INSERT INTO Table1 (last_name) 
SELECT last_name 
FROM Table2 
WHERE ... 

這也可能是更有效,因爲數據不必在數據庫和應用程序之間移動。

+0

+1。 [這是一個很好的答案],「......如果您使用準備好的查詢*在SQL文本中使用佔位符,並使用綁定變量*提供值,則不需要......」。 (我已經看過準備好的語句的例子,其中包括SQL文本中的值,而不是綁定變量。我知道,它讓我感到不寒而慄。) – spencer7593

-2

只要記住要正確驗證您打算使用的所有用戶輸入數據,並且不允許插入html或javascript代碼。您還需要記住XSS攻擊,而不僅僅是MySQL注入。防止xss的一個好方法是使用htmlspecialchars()將HTML字符轉換爲HTML實體。

+0

輸入驗證與SQL格式無關。 –

+0

當有效數據可以包含特殊字符時,驗證如何提供幫助?像O'Reilly這樣的名字是有效的,不是嗎? – Barmar

0

這個話題有很多誤解。

人們不斷使用不當的話語,以及來自這種混亂的真正危險。

逃逸被混淆安全
數據被混淆
格式化正在與信任

一個困惑已對這些問題進行排序。
否則,我們仍然有一個可接受的答案,暗示使用mysql_real_escape_string會產生一個「安全」變量。雖然不是。

+0

'當我用一個詞時,'矮胖胖胖的人用一種鄙夷的語氣說,'這意味着我選擇它的意思 - 不多也不少。「 - 劉易斯卡羅爾,*透過望遠鏡*。 – spencer7593