避開WebForm天坑,擁抱ASP.Net MVC吧

    有鵬友在如鵬網的QQ羣中提了一個問題:html

    請問,在ASP.Net中如何隱藏一個MenuItem,我想根據不一樣的權限,對功能菜單進行隱藏,用style不行。程序員

 

    若是要僅僅解答這個問題,很好解答,答案很簡單:web

    給MenuItem設定Value,而後用從根節點開始的MenuItem父子關係構成的ValuePath路徑FindItem,而後把它從父節點中Remove掉便可。以下數據庫

            <asp:Menu ID="Menu1" runat="server">

                <Items>

                    <asp:MenuItem  Text="系統管理" Value="SysMgr" >

                        <asp:MenuItem Text="用戶管理" Value="UserMgr"></asp:MenuItem>

                        <asp:MenuItem Text="配置管理" Value="ConfigMgr" ></asp:MenuItem>

                    </asp:MenuItem>

                    <asp:MenuItem Text="新建項" Value="新建項"></asp:MenuItem>

                </Items>

            </asp:Menu>

 

            MenuItem mi = Menu1.FindItem("SysMgr/ConfigMgr");

            if (mi != null)

            {

                mi.Parent.ChildItems.Remove(mi);

            }

 

    若是隻是簡單的分享一下這個問題的話,我就不必寫一篇博客了,我想接下來分享三個問題:編程

1)爲何這種「隱藏菜單」的方案很是不安全;瀏覽器

2)爲何說ASP.net WebForm是個坑;緩存

3)爲何ASP.Net MVC應用愈來愈廣;安全

  

爲何「隱藏菜單」就是掩耳盜鈴服務器

    很多網站系統開發的時候是這樣作權限控制的:若是當前用戶沒有這個菜單的執行權限,就把菜單隱藏起來,認爲這樣就「安全」了。可是Http協議是開放的,訪問者能夠採用直接在地址欄輸入「沒有權限訪問」的頁面的地址或者製造一個模擬執行被隱藏菜單的Http請求,這樣就能夠輕鬆的訪問「沒有權限訪問」的頁面了。微信

    相似的安全漏洞還有:

1)把用戶不能夠看的數據在列表中隱藏掉,豈不知用戶能夠直接拼湊url訪問其餘數據或者刪除它不能刪除的數據;

2)作手機號驗證的時候把被驗證的手機號寫到隱藏字段中,豈不知這樣用戶就能夠先用一個真實的手機號請求驗證碼,在驗證環節再修改隱藏字段中的手機號爲一個假手機號,這樣一個假手機號進行認證了

3)普通訪問者經過http://www.rupeng.com/UserInfo/36這樣的url能夠看到本身的我的信息,若是不作控制的話,惡意訪問者就能夠用http://www.rupeng.com/UserInfo/一、http://www.rupeng.com/UserInfo/二、http://www.rupeng.com/UserInfo/3……這樣的方式一個個的把你的註冊用戶的信息所有「拖庫」下來。

    如此等等……

    正確的作法是:

1)沒有權限看的數據不只要隱藏,還要在「看數據」的頁面中進行「二次查崗」,再次檢查當前用戶是否有查看權限;

2)把這些客戶端篡改後就會對安全性有威脅的數據放到服務器端Session中;

 

    不只B/S系統有這樣的安全漏洞,不少C/S系統這樣的漏洞更多,我看到過不少C/S系統是客戶端直連數據庫,稍微懂一點編程的人能夠直接訪問數據庫「隨心所欲」。正確的作法應該是使用WCF等技術開發一箇中間層,把業務邏輯、權限控制等寫到中間層,數據庫訪問等操做都在中間層完成,對外暴露接口,客戶端程序去訪問中間層接口,並不直接訪問數據庫。

 

    對於有必定經驗的開發者來說,這點你們應該都清楚,我在這裏就再也不多說,若是有鵬友不清楚這一點的,能夠在評論中繼續交流。

 

爲何說ASP.net WebForm是個坑

    對我有一些瞭解的朋友會知道,這幾年我一直在.Net技術圈倡導一個理念「不作只會拖ASP.Net WebForm控件的菜鳥」,不知道和我這點努力是否是有關係,目前國內重度使用ASP.Net WebForm的公司愈來愈少,更多的公司開始輕量級的使用ASP.net WebForm或者直接乾脆轉向使用ASP.net MVC

    固然並非說「ASP.net WebForm很差」,由於照樣有不少不錯的系統是使用ASP.net WebForm開發出來的,我這裏想說的是「ASP.net WebForm容易被誤用」,說的嚴重點「ASP.Net很容易誘導犯罪」。

 

   就像若是你選擇了一個大美女跟你共處一室,你作了順從心裏可是違反了法律的事情,這不是大美女的責任,你不能譴責「誰讓她穿的那麼暴露,都是她的責任」,是你的錯就要你來承擔。若是你當初選擇跟鳳姐共處一室,我相信你更多的是跟她討論《故事會》、《知音》等古典文學話題。

    同理,有人能把ASP.Net WebForm用的「坐懷不亂」,但更多的人用ASP.Net WebForm的時候容易「往後再說」 。那麼ASP.Net WebForm有哪些誘導你們犯罪的地方呢?

    ASP.net WebForm設計的初衷就是微軟想複製VB、WinForm等技術的成功路線。 

    若是直接使用Win32 API進行Windows程序開發,你須要面對消息循環、消息機制、結構體、句柄等等各類複雜的問題,而使用VB、WinForm等技術,只要明白「控件、屬性、方法、事件」這幾個概念,就能夠拖拖拽拽的開發一個系統出來。

 

 

   一樣的,進行Web開發的時候程序員也須要理解Http協議、Cookie等細節的複雜東西,微軟想用WebForm這樣一種相似WinForm的拖控件的傻瓜化開發方式把程序員再次解放出來。可是事與願違,Web系統的安全性、效率等的要求決定了「把開發人員變傻瓜化」這樣一條路是走不通的,Web程序員必須明確的知道生成的每個html字符的意義、瀏覽器和服務器之間的通信細節,才能開發出安全、高效的Web系統出來。

 

    而ASP.net WebForm把底層東西都封裝好了,html的生成、請求的處理都是在內部神奇的偷偷完成的。對於不求甚解的初學者,秉承着「能實現就行」的心態,用ASP.net WebForm的這些神奇的控件開發出了速度緩慢、漏洞百出的系統。並且因爲不知道ASP.net WebForm是怎麼生成那樣一坨坨的html代碼以及怎麼樣處理咱們的請求的,因此一旦遇到問題,就只能去社區中「求大牛賜予我一個神奇的控件」、「求大牛賜予我一段神奇的代碼能夠神奇的解決我神奇的問題」。對於想精確的控制生成的Html、精確的控制請求處理過程的程序員來說,ASP.net WebForm就又有點自做聰明的幫咱們作不少事情,束手束腳,有時候這些控件太智能,也會讓高手一不留神犯錯。

 

 

   若是是開發一個簡單的、安全性要求不高的Web系統,ASP.net WebForm也能快速開發出來知足要求了,可是若是要想開發複雜的、訪問量比較大的、對安全性很重視的Web系統,必定要謹慎,儘可能不重度用ASP.net WebForm,要麼只是把aspx當成模板引擎用,要麼就像如鵬網同樣使用ASP.net MVC來進行開發。

 

爲何ASP.Net MVC應用愈來愈廣

   上面我提到了Web開發者必須有能力對「請求、處理、響應」的整個過程進行控制,必須明白生成的Html是什麼回事、必須明白每一個請求是怎麼發出去的,很顯然ASP.Net WebForm這條路走錯了。而Struts、ROR等這些輕量級的框架則發展愈來愈好(固然也不知道Sun公司哪根筋抽了,居然在原本已經很好的Java世界中搞了一個模仿WebForm的JSF框架出來,還把它搞成了Java標準,無奈乎沒人Diao這個標準庫。這就是傳說的「倒行逆施」吧。)

 

 

 

    所以開源世界開始製造ASP.net的第三方MVC框架,好比移植自Struts的NStruts;我在如鵬網在線編程訓練營的.Net培訓課程中也用「HttpHandler+Razor模板引擎」搭建了一個MVC框架;剛剛還模仿Java中的「Servlet+RequestDispatcher+JSP」MVC作法搞了一個只用asp.net webform、徹底不用第三方庫的「HttpHandler+Server.Transfer+aspx」MVC框架,頗有意思,稍後我會在個人微信朋友圈寫文章分享一下這個你們一眼就能夠看懂、同時又「很MVC」的框架。個人微信號是:yzk369

 

    不過微軟社區的特色是「你們都不信任第三方框架,只有微軟官方出的你們才用」,因此NStruts之類的都沒有獲得普遍應用。還好微軟公司及早認識到了這一點,研發出了集Struts、ROR等優勢於一身的ASP.Net MVC。業務代碼和UI分離,程序員能夠在View模板對生成的Html進行精細化的控制,Controller只管對客戶端的請求進行處理,整個開發過程清晰明瞭。沒有了討厭的IsPostBack、沒有了DataBind、沒有了精神病似得OnDeleted和OnDeleting、沒有了然並卵的「頁面生命週期」……


   請求→處理→響應,就是這麼簡潔! 

   乾淨利落,漂亮的不像實力派!

 

    不過,因爲各類緣由,目前仍是有一些項目、一些開發人員在使用ASP.net MVC,我準備近期搞一次ASP.net MVC的免費網絡公開課,給你們講一講。爲了公開課能更好的知足你們的需求,我設計了一個調查問卷,收集一下你們的想法。公開課時間肯定以後也會通知你們。調查問卷的地址:https://www.wenjuan.com/s/m67fq2/ 

 

如鵬網.Net培訓班正在報名,有網絡的地方就能夠參加如鵬網的學習,學完就能高薪就業,點擊此處瞭解

 

    三年前只要懂「三層架構」就能夠說「精通分層架構」;如今則須要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值錢;

    三年前只要會SQLServer就能夠說本身「精通數據庫開發」;如今則需還須要掌握MySQL等開源數據庫才能說是「.Net開源」時代的程序員;

    三年前只要會進行用戶上傳內容的安全性處理便可;如今則須要熟悉雲存儲、CDN等才能在雲計算時代遊刃有餘;

    三年前只要掌握Lucene.Net就會說本身「熟悉站內搜索引擎開發」;如今你們都用ElasticSearch了,你還用Lucene.Net就太老土了;

    三年前發郵件仍是用SmtpClient;如今作大型網站發郵件必須用雲郵件引擎;

    三年前緩存就是Context.Cache;如今則是Redis、Memcached的天下;

    如鵬網再次引領.Net社區技術潮流!點擊此處瞭解如鵬網.Net最新課程

相關文章
相關標籤/搜索