2008-09-18 101 views
4

將數據驗證完全委託給數據庫引擎約束是一種好的做法嗎?防止錯誤的數據輸入

從應用程序驗證數據不會阻止無效插入從另一個軟件(可能由另一隊用其它語言編寫)。使用數據庫約束可以減少需要擔心無效輸入數據的點。

如果你把驗證無論是在數據庫和應用程序,維護變得無聊,因爲你必須更新誰知道有多少應用程序代碼,增加了人爲錯誤的可能性。

我只是沒有看到這一點做得很好,看着自由軟件項目的代碼。

回答

5

這是最好的,如果可能的話,在你的數據庫中指定的驗證規則,並使用或寫一個框架,使這些規則冒泡到您的前端。 ASP.NET動態數據幫助解決這個問題,並且有一些商業庫可以讓它更容易。

這可以爲簡單的輸入驗證(如數字或日期)和像外鍵約束的相關數據這樣做。

總之,這個想法是在一個地方定義規則(數據庫大部分時間),並在其他層中有代碼來執行這些規則。

0

我想說這可能是一種不好的做法,取決於查詢失敗時會發生什麼。例如,如果您的數據庫可能會拋出一個由應用程序智能處理的錯誤,那麼您可能會確定。

在另一方面,如果你不把任何驗證在你的應用程序,你可能不會有什麼不好的數據,但你可能有用戶認爲他們進入的東西,不會被保存。

11

在輸入時間驗證。在將其放入數據庫之前再次驗證。並有數據庫約束,以防止不良輸入。儘管如此,你仍然可以下注,壞數據仍然會進入你的數據庫,所以當你使用它時再次驗證它。

好像每一天,因爲他們做了他們在形式或更糟的所有驗證,使用Javascript,人們找到了一種方法來繞過它的一些Web應用程序被黑客攻擊。你必須警惕這一點。

偏執嗎?我?不,只是經歷過。

0

儘可能在數據庫端執行儘可能多的數據驗證,而不會影響其他目標。例如,如果速度有問題,您可能需要考慮而不是使用外鍵等。此外,某些數據驗證只能在應用程序端執行,例如,確保電子郵件地址具有有效域。

1

將邏輯留給數據庫的缺點是增加了該特定服務器上的負載。 Web和應用程序服務器相對容易向外擴展,但數據庫需要特殊技術。作爲一般規則,將盡可能多的計算邏輯放入應用程序層並儘可能簡化與數據庫的交互是一個好主意。

隨着中說,有可能是您的應用程序可能不需要擔心這樣重的可擴展性問題。如果您是某些數據庫服務器負載在可預見的將來不會成爲問題,那麼請繼續並將約束放在數據庫上。通過將驗證邏輯保存在中央位置,您完全可以正確地改進整個系統的組織和簡單性。

0

從數據庫中進行數據驗證的另一個缺點是通常你不會在每種情況下驗證相同的方式。實際上,它通常取決於應用程序邏輯(用戶角色),有時您可能想要完全繞過驗證(cron作業和維護腳本)。

1

除了SQL注入和輸入外,還有其他一些問題。每當接受用戶輸入時,您應該採取最防禦姿態。例如,用戶可能能夠將圖像鏈接輸入到文本框中,該文本框實際上是一個運行一些令人討厭的PHP腳本。

如果你設計好你的應用程序,你不應該費力地檢查所有的輸入。例如,您可以使用一個表單API來處理大部分工作,而數據庫層則完全相同。

這是漏洞的基本檢查一個很好的資源:

http://ha.ckers.org/xss.html

1

它來得太遲通過得到的數據到數據庫,爲用戶和應用程序提供有意義的驗證時間。你不希望你的數據庫做所有的驗證,因爲這會讓事情變得相當不錯,而且數據庫不能清楚地表達邏輯。同樣,隨着您的增長,您將會編寫更多的應用程序級事務來補充您的數據庫事務。

0

我發現在應用程序中進行驗證,而不是在數據庫中,效果很好。當然,所有的交互都需要通過你的應用程序。如果你有其他的應用程序可以處理你的數據,你的應用程序將需要支持某種API(希望是REST)。

0

我不認爲有一個正確的答案,這取決於您的使用。

如果您打算使用的系統非常多,可能會導致數據庫性能成爲瓶頸,那麼您可能需要將驗證責任移到易於擴展的前端多個服務器。

如果您有多個應用程序與數據庫進行交互,那麼您可能不想在多個應用程序中複製和維護驗證規則,因此數據庫可能會更好。

您可能需要一個更加清晰的輸入屏幕,當他們嘗試保存一條記錄時,不僅僅會觸及用戶的驗證警告,或許您想在輸入數據後驗證一個字段,並且會丟失焦點;或者甚至在用戶鍵入時,在驗證失敗/通過時更改字體顏色。

也與約束有關,是對可疑數據的警告。在我的應用程序中,我對數據庫有嚴格的約束(例如,有人在出生日期之前無法開始工作),但是在前端有可能是正確的,但可疑的數據警告(例如八年-old開始工作)。