避开WebForm天坑,拥抱ASP.Net MVC吧
有鹏友在如鹏网的QQ群中提了一个问题:
请问,在ASP.Net中如何隐藏一个MenuItem,我想根据不同的权限,对功能菜单进行隐藏,用style不行。
如果要仅仅解答这个问题,很好解答,答案很简单:
给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/1、http://www.rupeng.com/UserInfo/2、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最新课程
避开WebForm天坑,拥抱ASP.Net MVC吧的更多相关文章
- 不用asp.net MVC,用WebForm照样可以实现MVC(请看最后一句话)
在<避开WebForm天坑,拥抱ASP.Net MVC吧>这篇博客中我讲到了ASP.net WebForm由于一些先天的“诱导犯罪”的缺陷,现在用ASP.net MVC的公司越来越多.但是 ...
- 不用asp.net MVC,用WebForm照样能够实现MVC
在<避开WebForm天坑,拥抱ASP.Net MVC吧>这篇博客中我讲到了ASP.net WebForm由于一些先天的"诱导犯罪"的缺陷,如今用ASP.net MVC ...
- ASP.NET MVC与WebForm区别
[转贴一] 使用ASP.NET MVC框架,创建默认项目,第一直观感觉就是地址都是Rewrite过的.对源码和配置文件稍加分析不难看出,MVC使用了httpModules来拦截地址请求,具体用到了Sy ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总
MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从 ...
- [知识库分享系列] 四、ASP.NET MVC and Winform
知识库分享系列: [知识库分享系列] 三.Web(高性能Web站点建设) [知识库分享系列] 二..NET(ASP.NET) [知识库分享系列] 一.开篇 分享介绍本篇分享两个知识库节点,分别为“AS ...
- ASP.NET MVC 教程汇总
自学MVC看这里——全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要 ...
- 全网最全ASP.NET MVC 教程汇总
全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MV ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总(转)
自学MVC看这里——全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要 ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总【转】
自学MVC看这里——全网最全ASP.NET MVC 教程汇总 http://www.cnblogs.com/powertoolsteam/archive/2015/08/13/4667892.html ...
随机推荐
- ActionBarSherlock环境搭建
1.在官网http://actionbarsherlock.com/下载ActionBarSherlock包解压到. 2.创建自己的Android工程: 3.File -> New -> ...
- Python执行命令行
背景 我们知道,虽然会破坏平台独立性,但是有的时候需要在代码里面调用命令行来获取一些信息,那么了解在 Python 中如何执行命令行至关重要 使用介绍 Python 中使用命令行可以通过 subpro ...
- 不容错过!2016年度优秀UI/UX设计文章
本文整理了一些2016年度最受欢迎的文章,例如有关UI / UX设计的理论知识,书籍和工具,如何做出更好的设计的方法和建议,以及新的设计趋势. 1. 2017年用户体验设计趋势 我们期待着2017年用 ...
- 自动化-Appium
1.手把手教你 Android 标准 APP 的四大自动化测试法宝:https://testerhome.com/topics/5846 2.中文 Appium API 文档:https://test ...
- DbExpressionBinding requires an input expression with a collection ResultType. 参数名: input
使用linq多表连接遇到的问题: 解决方案:注释为出错代码,更改使用GroupBy解决问题 context.ERG_TipOffsInfo.GroupBy(x => x.Data,(Data,C ...
- Win7 64位命令行编译cuda及设置Windows显卡响应时间
在开始菜单中找到Visual Studio 2013 >> Visual Studio Tools 选择86或64版本的VC命令提示符环境,我用的 VS2013 x86 Native To ...
- JS 前端格式化JSON字符串工具
JSON格式化工具,简易实现.作为技术宅,直接上代码,供大家使用.前提:一定要引入jquery哦. <!DOCTYPE html> <html lang="en" ...
- PerconaXtraBackup 压缩备份集
压缩备份集 stream模式支持且只支持:tar 和 xbstream 两种格式,后者是xtrabackup提供的专有格式,解包时需要同名的专用命令处理 innobackupex --defaults ...
- jquery实现手风琴效果
html----accordion.html <!DOCTYPE html> <html lang="en"> <head> <meta ...
- QT 第三方串口库COM10以上无法读取问题
当COM口的端口号高于9时,也就是说从COM10往后,serialPortName赋值就不能跟COM1~~COM9一样,C++中COM大于9时,COM前面需要加上\\.\COM. 如,serialPo ...