2010-02-06 70 views
6

我一直在讀取關於保護PHP應用程序的一些知識,在我看來mysqli_real_escape_string是將數據插入MySQL表時使用的正確函數,因爲addslashes會導致一些奇怪的事情發生聰明的攻擊者。對?Htmlentities vs addslashes vs mysqli_real_escape_string

但是,有一件事讓我感到困惑。我似乎記得在將用戶輸入的數據回送給用戶以保護其數據時,建議addslasheshtmlentities更好,但似乎addslashes是具有該漏洞的那個。這是真的,還是我記得不正確?

回答

5

您的數據有不同的上下文。將數據插入數據庫的上下文需要與呈現html/xml或甚至電子郵件的上下文不同。

進入數據庫的轉義數據應在所有新代碼中棄用,以支持預準備語句。任何告訴你的人都會對你造成很大的傷害。

根據目標,轉到瀏覽器的轉義數據需要以多種不同方式轉義。有時候htmlspecialchars是足夠的,有時你需要使用htmlentities。有時你需要數字實體。這是一個話題,你應該做一些研究,以瞭解所有的細微差別。

我生活的一般規則是驗證(不過濾,如果不正確則拒絕)輸入&轉義輸出(基於上下文)。

+0

只有在單個腳本中多次使用準備好的查詢時,精確預測語句纔會更好。否則,你要做兩次往返服務器,一次準備,一次執行。如果您已經在使用自動確保輸入驗證的代碼,我不知道爲什麼準備好的語句更好。 mysql文檔涵蓋了這一點。 http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html如果我錯了(這是可能的和可能的),請告訴我爲什麼。 – 2010-02-06 19:04:56

+2

迎接邁克。我已經多次看到這種反駁的觀點,我認爲需要休息一下。請理解,我並不反對你所說的話。然而,我在這樣的論壇中不同意這個建議。在這種情況下,我認爲安全應該比錯誤傾向性更重要。 OP沒有抱怨他的網站,而是在不同的轉義技術之間缺乏明確的定義。你會不同意從這次旅程開始的人應該走更安全的道路嗎? – 2010-02-06 19:29:35

+0

我謹此表示同意。我在問自己的表現,因爲我不確定答案。我沒有說清楚。 – 2010-02-06 19:42:20

0

您也可以使用PDO libs,它可以爲您逃避大部分轉移,以防您可能在服務器上使用PHP5。

在回顯我個人比較喜歡用htmlspecialchars,但人們可能會糾正我

11

他們是爲不同的目的不同的工具。

mysqli_real_escape_string使數據安全插入MySQL(但參數化查詢更好)。

ヶ輛,使數據安全的輸出到HTML文檔

和addslashes使數據安全的其他一些情況,但不足以對MySQL

+0

您應該發佈一個案例,其中addslashes()失敗,並且mysql_real_escape_string()將其停止。我不認爲你可以,但這裏是一個查詢,他們都失敗了: mysql_query(「select * from user where id =」。$ _ GET [id]); – rook 2010-02-06 21:13:47

+0

addslashes假設一切都是8位。 mysql_real_escape_string在編碼時考慮到字符編碼。證明:http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string – 2010-02-06 23:03:07

+0

@Eric,它已被修復。在完全打補丁的系統上試用他的漏洞,它會失敗。 – rook 2010-02-07 04:37:07

0

是,使用mysqli_real_escape_string或庫類似PDO上的所有用戶輸入。當回顯時,我使用ENT_QUOTES作爲第二個參數,因爲它將所有適用的字符轉義爲其html實體,包括引號。

0

注意:應避免在UTF-8編碼文檔中使用htmlentities()。請參閱:

講究(從phpwact.org引用):

隨着現代網絡瀏覽器和支持UTF-8,你不widespead 支持因爲所有這些 字符都可以直接表示爲UTF-8中的。更重要的是,在 一般情況下,只有瀏覽器支持HTML的 特殊字符 - 例如,普通文本 編輯器不知道HTML實體的 。根據你在做什麼,使用htmlentities可能會降低其他系統「消耗」你的內容的能力。

也(不確認,但聽起來 合理 - 從這裏匿名評論), 字符實體(東西像»或 - ) 當文檔擔任 按application/xml + xhtml的(除非你 定義不工作他們)。儘管如此,您仍然可以通過數字形式離開 。

+1

'htmlentities()'的常見用法是不渲染「怪異」字符,而是避免將潛在危險文本解析爲標記,這與編碼無關。 – 2010-02-06 20:08:12

+0

使用htmlspecialchars()可以避免潛在的危險文本。 htmlentities()具有轉換'安全'字符的開銷,它提出了我前面提到的其他問題。 – Dor 2010-02-06 21:25:30

0

爲PHP 5.2及以上的另一個有趣的解決方案是使用所述過濾器延伸:http://www.php.net/manual/en/book.filter.php

它允許您驗證和消毒的用戶輸入。有許多內置的過濾器可用,他們可以結合標誌來調整他們的行爲。 此外,hese過濾器還可用於驗證/清理整數,浮點數,電子郵件以及特定的正則表達式。

我個人已經開始在我的項目中使用它們來驗證表單並輸出用戶輸入的數據,我非常高興我做到了。雖然,當我在MySQL數據庫中插入值時,我使用準備好的查詢來增加安全性。這些解決方案可以幫助避免大多數SQL注入和XSS類型攻擊。

0

你不能有一個「逃生」功能,並期望它一直工作。有不同的攻擊需要特定的衛生程序。理解這個概念的唯一方法是編寫一些易受攻擊的代碼,然後利用它。編寫漏洞利用代碼對於理解任何安全系統至關重要。

例如此查詢是容易受到SQL注入:

$host=htmlspecialchars($_GET[host],ENT_QUOTES); 
$name=htmlspecialchars($_GET[name],ENT_QUOTES); 
mysql_query("select * from user where Host='$host' and Name='$name' "); 

利用漏洞: http://localhost/sqli_test.php?host= \ &名稱=%20sleep(20) - 201%

MySQL的最好的逃逸功能mysqli_real_escape_string (),但是這可能會失敗:

mysql_query("select * from user where id=".mysqli_real_escape_string($_GET[id])); 

利用: http://localhost/sqli_test.php?id=1%20or%20sleep(20)

實際上,照顧sql注入的最好方法是不調用轉義函數,它使用ADODB的參數化sql注入的quires。對於XSS使用htmlspecialcahrs($ var,ENT_QUTOES)。請閱讀OWASP top 10,因爲Web應用程序安全性可能會出現問題。

相關問題