2011-02-15 98 views
4

我們使用Spring及其內置的MappingJacksonHttpMessageConverter生成大量的JSON對象。非常棒。How to html escape values by Jackson generator

但是現在我想要html轉義我的(任何一種)對象的字符串值爲了防止XSS。

那麼,我該如何解決這個問題?我首先想到我可以編寫一個自定義對象映射器並將它放入MappkingJacksonHttpMessageConverter。但是,writeValue需要一個對象,我不希望這樣,我想讓其字段迭代。我敢打賭,傑克遜轉換器也需要這樣做。所以我想影響那部分。

現在我結束了一個SerializerProvider接口。標準實現(StdSerializerProvider)被ObjectMapper調用。因此,我想覆蓋/影響負責設置值的方法。

這可能嗎?據我所知,這很難延續。我無法重寫StdSerializerProvider以覆蓋ObjectMapper使用的方法。也許我需要重寫另一個?

或者,這可能是完全錯誤的,我需要從完全不同的角度來看待它?

有什麼想法?

哦順便說一句,自己實現SerializerProvider並創建委託給StdSerializerProvider的組合可能是可能的,但我寧願不要。 (我自己已經有問題實例化StdSerializerProvider)。

任何想法感謝!

+1

I已經創建了關於此的博客文章:http://stefanhendriks.wordpress.com/2011/02/16/prevent-cross-site-scripting-when-using-json-objects-using-esapi-and-jackson-framework- 1-7-x/ – 2011-02-16 15:02:25

回答

4

有多種方式,這取決於你如何識別東西要逃逸。一些想法:

  • 如果你想引用/逃避所有字符串,您可以定義自定義字符串串行
  • 你可以先序列化爲JSON樹(JsonNode) - ObjectMapper.convertValue(POJO,JsonNode.class) - 修改它,然後序列化爲JSON(ObjectMapper.writeValue(intermediateTree))
  • 如果您想要一個靈活的系統,您可以爲需要特殊處理的字段添加註釋,可以使用ContextualSerializers的Jackson 1.7功能;自定義序列化程序,可以根據註釋重新配置它自己。它可能看起來像是一個矯枉過正的開始,但這可以用來輕鬆指定自定義修飾符(具有Class值的註釋屬性,指示串行器可調用修改正在序列化的值的對象 - 如轉義)
1

已回答此答案,而問題是關於驗證該字符串不包含XSS並且沒有轉義。如果你想逃避絃樂,這個答案不會幫助你。

那麼驗證創建的對象(命令對象)JSR 303 Bean Validation怎麼樣?

例如對「Command Object」的String屬性使用not @NotHtml(註釋和驗證)。

當然,你有你的selfe到implment的@NotHtml(@NotJavaScript或@NotXSS)註解和驗證。

+0

這是一種可能性,但我們想逃避輸出,而不是輸入。也不是在每個領域指定要逃避什麼。除非有很好的理由不這樣做:) – 2011-02-15 17:01:33

+1

@Stefan Hendriks:你說得對,這不是一個好方法(但我相信它會起作用)。無論如何:你不應該尋找一種方法來驗證字段 - INSTEAD你應該以正確的方式跳出你的內容 - 而且不應該在輸入上進行轉義,而是當你把數據放在一個新的環境中。 (例如,沒有人會在他接收到http時輸入http輸入,而是在sql語句生成之前完成sql轉義 - 所以對於HTML轉義也是如此:當您收回時不要轉義它,但當你構建HTML響應時,JSON相同! – Ralph 2011-02-15 18:30:57