2012-06-11 35 views
11

我在我的數據庫遷移文件,這些字符串/文本字段:Rails ActiveRecord驗證:字符串的最大長度?

t.string :author 
    t.string :title 
    t.string :summary 
    t.text :content 
    t.string :link 

而這些是我的問題:

  1. 每個字符串/文本屬性應該有兩個目的的最大長度的驗證,安全性(如果你不想接收幾MB的文本輸入)和數據庫(如果string = varchar,mysql的限制爲255個字符)。這是正確的還是有沒有任何理由不對數據庫中的每個字符串/文本屬性進行最大長度驗證?
  2. 如果我不關心作者和標題的確切長度,因爲他們不會太長時間不能存儲爲字符串,我應該爲每個字符串設置最大長度爲255嗎?
  3. 如果URL的最大可能長度大約爲2000個字符,將鏈接存儲爲字符串而不是文本是安全的嗎?我應該驗證鏈接屬性的最大長度,如果我已經使用regexp驗證其格式?
  4. 內容(文本)屬性應該具有最大長度,以保護數據庫不受無限長輸入的影響嗎?例如,將文本字段的最大長度設置爲100,000個合理的字符,還是這完全毫無意義且效率低下?

我明白,這些問題對某些人來說可能看起來並不重要,但仍然 - 這是對輸入的驗證,這對於任何應用程序都是必需的 - 我認爲在這裏值得相當偏執。

回答

5

這個問題很好,也許那些對rails/mysql內部知識有更多瞭解的人可以擴展更多。

1)在模型中進行驗證取決於您希望在超出限制的情況下發生故障的位置。該模型是最好的選擇,因爲它很可能會覆蓋使用該模型的大多數對象。 其他替代方法是使用maxlength屬性簡單地限制表單域。

第一個選項不適用於可選字段。

2)我不知道任何經驗法則。使用你知道的最長時間,並使它變大一點。

3)我的規則是255以上的任何東西都是文字。你可以在這裏找到更多的信息。Here

4)如果該列保存相同的內容 - 那裏可能有值。根據內容類型或用戶的不同,某些用例可能具有不同的最大長度。

以上所有內容也受到項目中數據驗證要求的嚴格程度的影響。