熱心網友
關于這一類問題,在網上找到類似資料,你看一下吧。希望能對你有用。如果還是搞不定,建議你用上網助手修復一下應該就可以了。3月8日博客園出現首頁不顯示內容的問題,是由于。Text程序沒有對用戶顯示名稱進行腳本過濾造成的。。Text中,還有不少地方存在這樣的問題。實際上,每個用戶輸入的并且會在頁面上顯示的內容都要進行腳本過濾,不然難免安全隱患?!?。Text中如何對用戶輸入的內容進行過濾的呢?主要通過EntryValidationHandler與CommentFormatHandler兩個類來完成的,它們在數據被提交到數據庫之前對數據進行檢查與處理。 EntryValidationHandler主要是檢查,發現不合法的內容就進行錯誤提示,不向數據庫提交,但。Text的檢查方法好像有點問題,從Word復制過來的html內容,比如:從VS。NET復制到Word再復制。Text中,。Text總是無法通過檢查,沒辦法,博客園為了方便大家,只能自己寫代碼處理,現在只是簡單過濾掉script?!ommentFormatHandler主要作用是將評論中html標記轉換成文本,這樣就避免了評論中的惡意內容。顯然,。Text中對惡意腳本的處理存在不足:1、在EntryValidationHandler中,只對文章的內容進行檢查,在。Text中文章用一個Entry實體類來表示,。Text尋Enrty。Body進行了檢查,實際上Enry類的很多屬性也要進行惡意腳本檢查與過濾。2、。Text中還有一個重要的實體類BlogConfig,BlogConfig中的很多數據是要用戶去維護的,所以對BlogConfig的某些屬性進行檢查也是必要的,博客園出現的問題,也就是由于。Text沒有這個實體類進行檢查。3、博客園中增加了高級評論功能,所以顯示評論時,要允許html代碼,而原來的。Text中是不允許html的(所以不必擔心惡意內容),但現在博客園的程序必須對評論進行處理,實際上評論也是用Enry類表示,只要對Enry類進行處理就解決了評論的問題。應該如何有效過濾惡意腳本?我想過三種方法:1、當用戶在表單中輸入數據提交時,進行檢查。但這種方法無法對Blog桌面工具發表的文章進行檢查,這類文章還要單獨處理。2、在顯示時進行過濾,這種很明顯,既麻煩又容易出現問題,只要一處忘了進行過濾,就會前功盡棄。3、在數據提交到數據庫之前進行過濾,。Text就是采用這種方法,但不足之處是在每個數據更新操作之前,都要進行檢查?!∥矣X得這三種方法都不是很有效的方法,好的方法應該在一個統一的地方對進行惡意內容進行過濾。為何不把目光關注到這兩個實體類?只要對這兩個實體類進行檢查與過濾,那不就解決問題了嗎?既然所有的操作都是圍繞這兩個實體類,只要我們對這兩個實體類中的相關屬性進行檢查與過濾,那就不擔心其他地方會出現未過濾的內容。雖然。Text有的地方顯示數據時,沒有訪問實體類,但所有更新數據的操作都是通過實體類傳遞數據的。我現在想到的一種方法是在實體類相關屬性的Get中進行處理,在Get返回之前,對屬性值進行過濾。這是一種簡單有效的方法,但不是完美的方法,我們要盡可能減少對實體類的修改。能不能用設計模式去解決這個問題,用DECORATOR模式?很多模式是針對接口與方法的,而這里的實體類是用于表示數據的,全是屬性,沒有方法。JGTM的文章A Taste of AOP from Solving Problems with OOP and Design Patterns 也是討論相關問題的,文章我還沒全部理解,但那也是針對在調用對象的方法之前進行附加的處理,而對屬性該如何處理?請大家提供一些好的思路,或者有什么簡單的辦法,請指點!文章有不妥之處,請見諒,畢竟出于一個。NET技術水平不高的作者之手。其他朋友的相關評論;a。實際上可以直接利用 mlencode(內容)將所有的轉換成相應的= 然后修改的時候就可以server。HtmlDecode(內容)來下午解碼就可以了。也省去了replace來替代。 不知道這樣子行嗎? ml是要顯示的, 目前主要是過濾script代碼。c。我認為在Entry實體類的更新操作中進行過濾是比較好的方式。d。。AOP適用于普遍情況,針對性的特別情況(尤其在有代碼的情況下)不需要使用這些復雜技術,看來是被我誤導了。:) 這種情況可以考慮在Get/Set方法內部返回/保存內容之前調用一個ValidateContent()虛方法(TEMPLATE METHOD),把對內容的驗證邏輯潛入到已有邏輯中(并可以在子類中重載改變),或者如果對所有子類的驗證邏輯都是一致的話,不實現為虛方法也可以。 BTW: 屬性其實就是一對兒方法(getter/setter),沒有什么本質的區別。e。第一樓的方法看著簡單,其實是把所有HTML都槍斃了,這還不如把內容都用XMP置標括起來呢。;)f。實際上用Decorate模式是恰當的。創建一個名為EntryDecorate(由于要求比較簡單,用Concret Decorate就好了)的類,在需要的時候,調用該類的RemoveHtml方法,實現過濾。在普通的情況下,這個EntryDecorate類是透明的。這樣可以有很好的靈活性。g?,F在假如對Entry類的每個屬性都要過濾惡意腳本, 如果通過Get/Set在增加一個方法調用來實現, 很麻煩, 如果有很多實體類, 對每個實體的屬性都要進行更改。是不是建立一個專門進行過濾的類, 在這個類中定義過濾策略, 對哪些類的哪些屬性進行過濾, 這個類相當于一個代理, 在對實體類的屬性進行訪問之前, 這個代理類負責檢查、過濾。h?,F在假如對Entry類的每個屬性都要過濾惡意腳本, 如果通過Get/Set在增加一個方法調用來實現, 很麻煩, 如果有很多實體類, 對每個實體的屬性都要進行更改。是不是建立一個專門進行過濾的類, 在這個類中定義過濾策略, 對哪些類的哪些屬性進行過濾, 這個類相當于一個代理, 在對實體類的屬性進行訪問之前, 這個代理類負責檢查、過濾。h。現在假如對Entry類的每個屬性都要過濾惡意腳本, 如果通過Get/Set在增加一個方法調用來實現, 很麻煩, 如果有很多實體類, 對每個實體的屬性都要進行更改。是不是建立一個專門進行過濾的類, 在這個類中定義過濾策略, 對哪些類的哪些屬性進行過濾, 這個類相當于一個代理, 在對實體類的屬性進行訪問之前, 這個代理類負責檢查、過濾。i。過濾策略可以結合自定義屬性定義甚至連接到外部的配置數據(可以考慮使用Regex),用RealProxy是可行的,但對于這個場合不一定是最好的。這種情況下需要改變對象的行為需要用的技術還是傳統的重構技術——尤其在你有源碼的情況下。 不過——dudu的實踐精神我是十分鼓勵和贊賞的!什么事情你不親自做一下你怎么知道就不行或者不好呢?所以還是鼓勵大家遇到問題的時候多動手、多動腦!GJGJ…… :)。