運用 `Object.defineProperty` 對 `document.cookie` 除錯
前陣子陸續發生兩次因為不合法的 cookie 值,在呼叫 API 時帶入到 HTTP request header 中,導致 API 在解析 cookie 值的時候發生錯誤,間接導致多數功能出現異常。
這篇文章會紀錄:
- 如何利用
Object.defineProperty
和console.trace
來攔截並查看是由誰來寫入document.cookie
- 延伸在
Object.defineProperty
的set
method 中,加入 cookie 值的 validation rule,避免非法的值被寫入其中,例如:,
或是"
。
查看 cookie 的值由哪一段 script 寫入
1 | function debugAccess(obj, prop) { |
在攔截器中檢驗 cookie 的值
1 | function interceptCookie() { |
結論與心得
在現實世界中,任何事情都有可能發生。在做資料的序列化時,很容易會出現發送端 serialize 完的值送給接收端後,接收端做完 deserialize 後卻發現值有問題。所以在用一些比較特殊的 serializer 時,必須要看清楚序列化的文件才是。
參考資源
這裡使用 Object.defineProperty
作為攔截器的方法,是參考 Breaking JavaScript execution when cookie is set 的這個答案提供的範例和說明。