2013-02-06 37 views
3

在Java中,我發現直接獲取字符串並將其用作LinkedHashMap中的鍵。我甚至可以將它翻譯成JSON並返回而不會產生任何麻煩。JavaScript對象與地圖 - 如何處理特殊鍵?

我現在在使用Node.JS/JavaScript,並且有一個特殊情況沒有處理。

var makesSense = '{"__proto__":"foo","toString":"bar"}' 
var noSense = JSON.stringify(JSON.parse('{"__proto__":"foo","toString":"bar"}')) 
console.log(noSense) // outputs {"toString":"bar"} 

什麼是推薦的方式來處理__proto__和其他類似的東西。看起來toString不會造成任何麻煩,但假設我需要一致處理不可信數據。什麼是推薦的解決方案?

  • 在每個鍵之前加上一個額外的字符?如果是這樣,哪個角色最有意義?我知道它不能是一個下劃線,那麼空間呢?
  • 使用一個模塊爲我處理這個?我想要一個能夠方便處理並且沒有過多特徵的應用程序。 (有些功能雖然不錯)
  • 還有其他的東西嗎?有沒有與JSON.parse兼容的解決方案?

爲什麼這很重要?當然,沒有人真的打算輸入__proto__。但如果他們故意這樣做,會怎麼樣?他們學習我使用JavaScript,那又怎麼樣? - 除以下情況外沒有問題:

  • 軟件有一串字符串。它恰好發生這些字符串中的一個說__proto__,因爲有人在試圖破壞我的軟件。
  • 軟件使用這些字符串爲一個鍵創建一個Map,並用一些很好的數據填充Map。
  • 軟件稍後會瀏覽字符串數組,並從地圖收集信息。該映射返回空值,然後繁榮:空指針異常。
  • 軟件現在不起作用。這將有資格成爲拒絕服務之類的事情。

我知道那種情況絕對不一樣,但我不喜歡它。我不記得我使用的編程語言的所有怪癖,所以給了足夠的時間,我一定會寫這種類型的代碼。

我爲創建不受篡改的代碼感到自豪。所以,我試圖從我的軟件中消除這些針孔。

是的,這些都是超小的,但它至少值得一個StackOverflow的問題,看看人們是否有比我知道的更好的答案。我通過這種方式瞭解了很多。

+0

您試圖解決的實際問題是什麼?看起來**對我來說真的不太可能,因爲你有一個真實世界的情況,你需要使用'__proto__'和'toString'等鍵來獲取JSON。 –

+1

順便說一句,上面的代碼片段在Opera中有正確的輸出。 – Bergi

+0

@ T.J.Crowder,看我的編輯。 –

回答

0

在每個鍵之前加上一個額外的字符?如果是這樣,哪個角色最有意義?我知道它不能是一個下劃線,那麼空間呢?

我使用x,但它是任意的。只要你使用一些不太可能形成特殊屬性名稱的東西(例如在某些引擎上)__proto__toStringvalueOf(並且我不知道任何以x開頭的特殊屬性名稱),則表示您沒有問題。