我想用一個字符串,它是通過輸入在Web表單用戶的鍵名的一部分:使用用戶輸入作爲key_name安全嗎?
user_input = self.request.POST.get('foo')
if user_input:
foo = db.get_or_insert(db.Key('Foo', user_input[:100], parent=my_parent))
這安全嗎?或者我應該做一些便宜的編碼或散列?如果是,哪一個?
我想用一個字符串,它是通過輸入在Web表單用戶的鍵名的一部分:使用用戶輸入作爲key_name安全嗎?
user_input = self.request.POST.get('foo')
if user_input:
foo = db.get_or_insert(db.Key('Foo', user_input[:100], parent=my_parent))
這安全嗎?或者我應該做一些便宜的編碼或散列?如果是,哪一個?
只要你不關心惡意用戶用垃圾填滿你的數據庫,它是安全的。 get_or_insert
不會讓他們覆蓋現有的條目,只需添加新的條目。
確保你限制了它的長度(在用戶界面和收到它之後),即使你對它沒有其他驗證,所以至少他們不能只給你瘋狂的大鍵來填補數據庫很快或崩潰你的應用程序。
編輯:您剛剛評論說您確實確實知道這是一個合理的關鍵。在那種情況下,是的,這是安全的。
請記住,用戶可以大概還找出關鍵的是已經在你的數據庫的基礎上,它需要你對所提供他們迴應了多久,你仍然需要確保他們的授權查看他們請求的任何內容,或將他們限制爲少數請求,以便他們不僅可以強力檢索與您生成的密鑰鏈接的所有信息。
非常感謝您的詳細解答!我會考慮以上所有。 – zengabor
另外,並非所有鍵名都是有效的。除了長度限制外,以'__'開頭和結尾的鍵名都保留 - 例如'__key__'。 –
如果self.request.POST [「富」]不存在,你就會有一個例外 –
我想保持的例子短。當然,我在實際代碼中做了不同的處理,包括編碼,長度檢查和其他驗證。問題主要集中在使用傳入的字符串作爲關鍵字。 – zengabor