权限管理、用户权限系统、开源用户权限系统、信息化建设标准基础数据管理平台
代码改变世界

加强网站安全、重构公司的门户网站项目(C# VS2003)

2010-04-23 11:31  通用C#系统架构  阅读(3358)  评论(69编辑  收藏  举报

  请大家不要非觉得在炫耀什么的心态来看文章,那就扭曲了本文章的出发点,就算我骄傲了一下,又能怎么样,若人人像我这样骄傲一下,我们的软件开发水平说不定几年就彻底超越日本、印度了,美国可能还难超越一些,这是事实,不要总是看不惯人家骄傲,我不写,谁知道?鬼知道?允许每个人发文章是博客园给予我们的权利。

 

  本文想提醒: 为什么我们的劳动不值钱?

                    程序该干啥的,就应该干啥,不要乱来。

                    架构系统,需要严谨的思想,不要眼高手低,在我们的日常工作里,需要体现出我们的水平。

                    劳动成果要好好维护、不断重构、不断改进。

                    需要有一定的能力、境界、高度,才能让某个项目、产品能有质的变化。

                    我们天天学技术,是为了把软件做得更好,不是为了学而学,需要把学来的,体现在实际项目上。

                    理想与现实往往有很多差距,其实很多不足就在我们的眼前,可能我们自己没发现。

                    我们做项目,写程序时,需要思路严谨思路严谨再严谨,否则很容易是在制造电子垃圾

 

  最近客户反馈,门户网站有安全检查要求,必须要达到某些安全检查要求,而且是今天电话打过来2天就需要更新上线,任务也很紧急,这也是我们大客户之一的要求,没办法,只能硬着头皮就上。
  我刚来公司没多久,对公司的很多项目也不熟悉,由于这个项目是VS2003开发环境下开发的项目,我把这个任务交给了我们新来的一个同事。
  新来的同事也刚来公司1个月左右,也是对公司的项目不太熟悉,交接过来没多久,整个工程有上百个页面,起先是想升级到VS2008,他给我的答复是,由于这个项目工期紧张,无法再短时间内升级到VS2008上,可能会引起很多麻烦,这个提议我也能理解了,毕竟时间比较紧急。
  客户检测出来的主要问题,还是有SQL注入攻击的漏洞,虽然有些环节上也进行了处理,但是总感觉处理得不是很圆满,总有些让人放心不下。
  其他安全因素先不考试,我想SQL注入问题的本质,还是在数据库访问层,数据库访问层牢靠了,这个问题就相对好解决了。
  通过分析数据库访问层,我差点儿晕倒了,简直是让人头大啊,可以明显看出这个项目前后有5个接手换手,同一个项目,有接近5种数据库访问方法,更郁闷的是,什么数据库访问方式都用上了。
  A: 有微软的数据库访问层。(这个我想干得不错,毕竟是要相信这个是可以放心的)
  B: 有OLEDb的数据库访问方法。
  C: 有SQLDb的数据库访问方法。
  D: 有静态的数据库访问方法,也有动态方法访问数据库的,奸奸杀杀、杀杀奸奸。
  E: 有自己做的数据库连接池方法。
  F: 处了一些必要的数据库访问方法外,其他一些辅助的功能函数也都写在数据库访问类里去了,那还分层干个屁啊?干脆不分层算了嘛,该干啥的,就应该干啥呀。
  G: 完成相同功能的,不同名字的函数多如毛,不知道这个是否属于思路混乱类型的。

   以上问题是通过分析源码发现的错误,那最关键是的,解决参数化的SQL语句执行功能,新来的同事参加工作才四年左右,功夫也不是非常过硬,胆子也不够大,所以他也看着代码不知道怎么弄才可以,找了几个同事帮忙,也没能搞定,因为其他同事也有其他同事要忙的事情,毕竟这个网站先不来钱,先忙乎能来钱的项目更要紧。

  我就好奇,前后有5个以上的人维护过这个项目,怎么就没一个人把这个项目维护得还过得去呢?以前的技术总监,都在管啥呢?难道这些代码质量啥的,管都不管一下?也不指导一下?前后有那么多人,没一个人自觉的深入维护一下?

 

  那还是我来折腾一下吧。

  1:我的数据库访问层写得是相当的不错,可以考虑用我的组件,但是我的组件已经升级到2.0了,VS2008的开发环境下的,没办法用到VS2003下的1.0开发环境里去了,所以这个方法被放弃了,那只能是把我的好思想拿到这个项目里用。

  2:微软的数据库访问方法先不动原则,信任这个是好的。

  3:所有的程序修改为微软的数据库访问方法,工作量太大,受不了,上百个页面需要修正,不是1天就能修改好的。
  4:那先解决参数化的SQL语句执行方法,新写了一个数据库访问的DbHelp类,就这样项目里,又多了一个垃圾出来了一样,变成6个人的痕迹了,呵呵。

  5:这个DbHelp类里写上最有必要的几个数据库访问的函数,然后编译程序通过。
     int ExecuteNonQuery(string commandText, DbParameter[] dbParameters);
     int ExecuteNonQuery(string commandText);
     object ExecuteScalar(string commandText);
     object ExecuteScalar(string commandText, DbParameter[] dbParameters);
     DataTable Fill(string commandText);
     DataTable Fill(string commandText, DbParameter[] dbParameters);
     DataReader ExecuteReader(string commandText, DbParameter[] dbParameters);
     DataReader ExecuteReader(string commandText);
    写好这几个方法,应该足够用了,数据库访问层写那么多方法刚啥,有病啊。

  6:接下来,一个个干掉其他4个人写的函数,每干掉一个函数,编译一次项目,然后整体进行替换处理,花费了2个小时不到,替换删除了几千行以上的代码,终于把乱八七糟的数据库访问方法给全部清理干净了,心理舒服了很多。

  7:再接着,把功能相同、命名不同的函数一个个清理干净、该删除的删除、该放到其他类里的放到其他类里,该干啥的,就放在干干啥的类里,该改名字的该名字。
 
  8:再接着清理,命名不规范的变量名,整体进行替换,例如 strSQL, 看看就想吐,有的替换成 微软的commandText,有的替换成 sqlQuery 等,虽然 sqlQuery也未必是对的,但是总体上讲比恶心的 strSQL 强很多。

  9:一个个页面里的参数化问题,我写了一个标准的例子程序,这个我实在是没精力修改了,我们新来的同事工作也很认真,就叫给他慢慢的把这上百个页面,一个个修正好,他足足修改了2天,才走了一圈,把参数化的错误都修正了。

  10:在用了外壳,在 Global.asax 里的,SQL注入预防措施,尽量防止SQL注入,进行了双层的安全防护措施。

  11:测试了几个小时,典型的页面都运行正常,再发布给客户,重构工作告一段落。

  有些东西,需要有魄力、需要有突破能力,需要有全盘把握能力,才能折腾,否则,花费1个月才能修改好,那就不叫水平了,就用1-2天就可以重构多年的历史遗留问题,那才叫水平,动手能力。


  有些问题,改改的现在就改,还没到癌症晚期时就应该看看病,现在不调整,以后这个新员工辞职了,又来一个,又走一个,越改越乱,越维护越乱,那公司这么多前前后后也投入了不少钱,这次来个有力度的修改,以后接手的人,看着代码也清爽,上手也容易,理解也容易,一个项目有4-5种数据库访问方法,人家到底要用哪个呀?不是头晕啊?给将来要接手的人,铺个路吧,让他接手后,不要再觉得很恶心,写得很乱。

  只有天天仔细维护、改进的架构,才有长久的生命力,该改的错误要及时修正,一天比一天稳健,劳动成果才能有效的积累下来的,3年都不维护了,那整个系统也就废掉了,成了电子垃圾,公司的投入,这么多人,前前后后的维护辛勤劳动就这样人间蒸发了,成了电子垃圾了,为什么我们的劳动不值钱?老外的劳动就值钱?因为我们不懂得积累,劳动成果在严重浪费,管理不善也是更大的问题所在。


  思路严谨的人,才能把重构公司一个网站的详细步骤分解得先后顺序里得清楚,每个步骤的先手顺序、难度、关联、影响范围等等,分解成N个小功能节点,里程碑,有条有理的进行工作分解安排好。



C# ASP.NET 通用权限设计、通用权限管理、通用权限组件、单点登录、集中式权限管理、统一授权体系、分级管理分级授权


微信扫一扫加好友