當我重複使用數據庫中的數據進行查詢時,是否需要使用mysqli_real_escape_string
。數據先前已被轉義,因此可以安全地將其插入數據庫。我知道在將數據插入數據庫時,反斜槓被刪除。 謝謝。插入數據後需要MySQL轉義
回答
是的,當您在另一個查詢中重新使用數據時,您必須重新轉義來自數據庫的數據。考慮逃避禮物包裝禮物。您在一個查詢中「包裝」數據庫的一些數據。它會將數據解壓並放入數據存儲區。當您稍後再次檢索該數據時,包裝消失並且數據再次「危險」。
例如考慮這樣的事情:
$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:你可以很容易地注入自己。
感謝您的詳細解釋和示例。 – Tom
這不是逃避手段。
轉義文本表示插入轉義字符,以便它可以插入到SQL字符串中並被解釋爲原始文本。
除非使用錯誤的轉義字符,否則它對實際值沒有影響。
每次將它連接成任何種類的結構化語言時,都需要正確地轉義您的文本。
使用SQL時,最好使用參數而不是串聯。
是的,你需要它。轉義僅用於使查詢在語法上有效,它們不是存儲在表中的數據的一部分。無論何時您將字符串插入查詢中,都需要將其轉義。
舉一個例子,假設你有一個全名的表,並且有一個姓爲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 ...
這也可能是更有效,因爲數據不必在數據庫和應用程序之間移動。
+1。 [這是一個很好的答案],「......如果您使用準備好的查詢*在SQL文本中使用佔位符,並使用綁定變量*提供值,則不需要......」。 (我已經看過準備好的語句的例子,其中包括SQL文本中的值,而不是綁定變量。我知道,它讓我感到不寒而慄。) – spencer7593
只要記住要正確驗證您打算使用的所有用戶輸入數據,並且不允許插入html或javascript代碼。您還需要記住XSS攻擊,而不僅僅是MySQL注入。防止xss的一個好方法是使用htmlspecialchars()將HTML字符轉換爲HTML實體。
輸入驗證與SQL格式無關。 –
當有效數據可以包含特殊字符時,驗證如何提供幫助?像O'Reilly這樣的名字是有效的,不是嗎? – Barmar
這個話題有很多誤解。
人們不斷使用不當的話語,以及來自這種混亂的真正危險。
逃逸被混淆安全
數據被混淆串
格式化正在與信任
一個困惑已對這些問題進行排序。
否則,我們仍然有一個可接受的答案,暗示使用mysql_real_escape_string
會產生一個「安全」變量。雖然不是。
'當我用一個詞時,'矮胖胖胖的人用一種鄙夷的語氣說,'這意味着我選擇它的意思 - 不多也不少。「 - 劉易斯卡羅爾,*透過望遠鏡*。 – spencer7593
- 1. 插入Cassandra時是否需要轉義數據輸入?
- 2. 從textarea插入數據時,查詢中需要轉義什麼?
- 3. MySQL插入需要的數據,然後將其發送到水晶報告
- 4. 需要插入數據庫表
- 5. neo4j數據插入需要時間
- 6. Lua mysql,需要一種方法來轉義數據
- 7. 我需要用PHP解析XML插入到mysql數據庫
- 8. 需要從網格插入到mysql數據庫
- 9. 如果數據存在,然後不要再插入它Mysql
- 10. MySQL插入然後更新表數據
- 11. '插入'後PHP-MySQL數據被交換
- 12. PHP插入到mysql後丟失數據
- 13. MySQL錯誤後插入數據時
- 14. MySQL php插入需要很長時間
- 15. MYSQL插入數據
- 16. 插入mysql數據
- 17. PHP/mySQL - 如何安全地編碼/解碼/轉義/任何需要的字符串插入數據庫之前
- 18. 需要加載圖像,然後在mysql中插入
- 19. LESS CSS中的轉義字符插入不需要的空格
- 20. 我需要清理輸入嗎? PDO和mysql轉義
- 21. 插入到Mysql數據庫後更新數據集數據
- 22. mysql - 插入觸發器後插入數據到其他表
- 23. Mysql在插入數據後插入空行(在Chrome中)
- 24. 數據未插入到數據庫......需要提醒
- 25. 插入MySQL後未定義ID
- 26. 從XML提要中插入數據到MySQL數據庫
- 27. 我需要根據條件插入行
- 28. 的MySQL插入數據
- 29. 插入數據到MySQL
- 30. MySQL數據插入錯誤
向我們顯示代碼。 –
我總是爲我所有的值使用mysqli和佔位符,所以我不必擔心轉義,因爲它全部由方法處理。 – Drew
要顯示數據,你應該使用htmlspecialchars() –