今天才發現這點。我在ASP.NET 2.0的GridView中想要放一個HyperLinkField觸發Javascript Function,但一在DataNavigateUrlFormatString中加上"j avascript:"字眼,產出的HTML裡,該Link會完全消失,只剩下DataTextField的純文字。

<asp:HyperLinkField DataNavigateUrlFields="PRODID,PRODCHNAME" 
    DataNavigateUrlFormatString="j avascript:fpSelProd('{0}','{1}');void(0);" 
    DataTextField="PRODID" HeaderText="產品代碼" >
    <HeaderStyle Width="80px" />
    <ItemStyle Width="80px" HorizontalAlign="Center" />
</asp:HyperLinkField>

稍微推敲了一下,這應是ASP.NET 2.0安全強化的一環。由於HyperLinkField Url中的部分內容來自於資料庫裡的欄位,而資料內容來源有可能來自使用者的輸入,無形中可能淪為駭客發動XSS攻擊的管道(如果你還不知道什麼叫XSS,可以看這篇文章),所以ASP.NET 2.0索性一看到j avascript:就把連結移除,把這管道徹底給封了。

網路上有一些解決方案: 其中有一種是改用TemplateField,自己在後端組出<a href="j avascript:....">...</a>丟出來,但依我的看法,如果沒處理好,它還是有可能提供駭客偷渡惡意Javascript Code的機會,除非對欄位內容來源及安全性有絕對的把握,否則不建議使用。

針對這個需求,我這次的做法是在TD掛上onclick事件,再透過DOM去讀出各欄位裡的產品代碼及產品名稱,雖然囉嗦了點,但比直接將資料欄位值組成Javascript來得安全,也才不辜負了ASP.NET 2.0的一番美意。


Comments

# by Joe

看了大大不少文章,也佩服您肯花時間整理分享經驗, 難怪會獲得 MVP ,直是實至名歸 小弟最近剛好遇到一些問題,在此借用大大的版面提出討論 ,也請大大給予賜教 同樣是 GRIDVIEW 中 HyperLinkField 來連結頁面傳遞參數問題,由於專案中有中文簡繁體共用的需求,因此在charset 與 requestEncoding 都設成 UTF-8 模式,資料庫 中也以 nvarchar 來存放資料,但是當 HyperLinkField 連結時卻發生了問題,例如傳遞參數 NAME=繁體中文 , 在 IE7 的瀏覽環境下一切正常,但是IE6.1 執行request 參數時卻出現亂碼,而且還不是全亂碼,而是類似 "繁?中?" 醬的值,找一台原本有問題的機器,升級到 IE7 後又變成沒問題了,實在令人很頭大,不曉得大大有沒遇過類似的問題,能幫忙解決小弟的疑惑嘛,謝謝。

Post a comment