2009-07-20 64 views
7

我正在與一個網站上的開發團隊合作。該網站將使用類。我負責爲這些類創建數據訪問層。有一種理解,所有的用戶輸入將在檢索後(從帖子或獲得)逃脫。對輸入級別(除非我親自審查每個人的代碼)幾乎沒有任何控制權,我認爲在我的一端拋出逃跑也是很酷的(就在它碰到數據庫之前)。問題是我不知道如何在不添加更多斜線的情況下使用mysql_real_escape_string。只有必要時才逃跑,這有可能嗎?

由於用戶輸入可能包含斜線,所以我無法檢查以確保其中有斜槓。我可能能夠檢查所有需要轉義的東西,並確保他們面前有斜線,但這似乎不是最好的方式。

有什麼建議嗎?

回答

7

您是否考慮過而不是轉義數據直到它到達數據訪問層?我問,因爲他們的一些陷阱與您的團隊正在採取的辦法:

  • 如果你需要顯示錶單數據的用戶(例如,重新顯示形式的錯誤消息,因爲一些驗證失敗),你需要對數據進行反轉(因爲'對HTML不是特殊的),然後重新轉義數據(因爲<是特殊的)。如果您需要將表單數據顯示給從數據庫提取的用戶,則不得執行該退避步驟(因爲它是在保存數據時由數據庫完成的),但仍必須執行HTML轉義步。如果您犯了一個錯誤並執行錯誤的程序,您會破壞數據或更糟地引入安全問題。
  • 你可以處理不同來源的不同格式的問題,通過決定所有通過你的應用程序的數據將被逃脫。因此,您的數據訪問層將從數據庫中獲取數據後重新轉義數據。但是,由於應用程序的不同部分需要稍微(或完全)不同的轉義,這很快就會導致大量脫逃/再次逃脫的廢話。從數據庫中獲取數據,轉義數據,解除轉義,轉義爲HTML,輸出數據。
  • 您的前端表單處理代碼必須對您的數據庫有深入的瞭解。例如,\'對您的數據庫意味着什麼?如何逃生'\ - 如果有的話?如果您更改過數據庫引擎,甚至更改其設置,則這些可能會改變。然後你有一堆轉義/去轉義的代碼來查找。缺少單個轉義/反轉可能會導致SQL注入。
  • 或者,您可以通過讓數據庫層執行de-escape/escape循環將應用程序標準轉義序列轉換爲數據庫,從前端代碼中獲取數據庫知識。但這似乎相當愚蠢!

還有另一種方法:讓任何一層需要數據逃脫它本身。數據總是以原始的,非轉義的形式在各​​層之間傳遞。所以你的數據訪問層做所有的數據庫轉義。您的HTML輸出代碼會執行所有HTML轉義。當您決定要生成PDF時,您的PDF代碼會執行所有PDF轉義。

  • 現在,當你做表格輸出時,它清楚該怎麼做:總是HTML轉義數據。無論它來自哪裏。永遠不要運行脫逃。
  • 現在沒有逃避/逃脫的廢話,因爲一切都是圍繞着生。只有在必要時才能逃脫。
  • 您的前端代碼不關心數據訪問層的實現。數據訪問層存儲並返回任意的字符串。
  • 您只有一個需要查看您的應用以確保您沒有SQL注入問題。
  • 您可以輕鬆使用數據庫驅動程序功能,例如佔位符。那麼即使你的數據訪問層不需要知道每個數據庫的轉義需求,數據庫驅動程序處理它。
7

如果您不知道輸入是否已被轉義,則無法添加自動決定以進行轉義。你可以嘗試分析它,但它永遠不會好,你會遇到雙反斜槓對等。

一旦發送到您的訪問層的數據應該乾淨並在一個地方處理轉義,請做出決定。如果你這樣做,其他開發人員不必擔心它(他們可能不想這麼做),並且將來移動到另一個數據庫會更容易。它還會讓您隨時自由轉向準備好的陳述。

編輯:忘記了這一點:

有超過輸入 水平難以控制的(除非我親自審查 每個人的代碼)

我認爲這是值得的痛苦讓他們如果你明確指出轉義屬於數據庫層,而不應該在其他地方完成,那麼可以自己發現它。

+3

+1'處理在一個地方逃跑'。希望我能給你+5這個;-) – Treb 2009-07-20 07:27:14

0

如果我處於你的位置,我不會懶得不能檢查每個人的代碼。即使你沒有審查用戶輸入的轉義,你仍然可能想看看他們的代碼是否有效完成。或者,也許你不是在審查,而是有人必須這樣做。

我很久以前就經歷了一個幾乎類似的設置,我們按層分割任務。一個人在模型上工作,我在控制器上工作,另一個人在視圖上工作。因爲我們非常信任每個人,所以其他人的代碼將按照我們預期的方式工作,所以我們沒有仔細檢查對方的代碼,直到我們需要合併他們的代碼爲止。發生了什麼事是我們在開發的後期發現了模型中的低效代碼。它不僅效率低下,而且不起作用!正因爲如此,我們不得不徹底檢修大量代碼,這使我們花費更多時間。

我建議您創建一個技術要求規範文檔,在其中指定用戶可接受的輸入。這份文件應該由那些將接受用戶輸入的部分編碼的人跟隨。更好的是,創建單元測試以查看是否嚴格遵守這些要求,以便您不必擔心它們要傳遞給您的數據是否無效。

另一件事...因爲你使用PHP,爲什麼不使用一個好的框架?大多數可用的框架都帶有自己的DAL,您不再需要爲逃避數據庫輸入而擔心很多(呃,沒有那麼多)。框架應該爲你做。

此外,你可能想看看'準備好的陳述'。

相關問題