当前位置: 首页 > news >正文

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

请大家不要非觉得在炫耀什么的心态来看文章,那就扭曲了本文章的出发点,就算我骄傲了一下,又能怎么样,若人人像我这样骄傲一下,我们的软件开发水平说不定几年就彻底超越日本、印度了,美国可能还难超越一些,这是事实,不要总是看不惯人家骄傲,我不写,谁知道?鬼知道?允许每个人发文章是博客园给予我们的权利。
 
  本文想提醒: 为什么我们的劳动不值钱?
                    程序该干啥的,就应该干啥,不要乱来。
                    架构系统,需要严谨的思想,不要眼高手低,在我们的日常工作里,需要体现出我们的水平。
                    劳动成果要好好维护、不断重构、不断改进。
                    需要有一定的能力、境界、高度,才能让某个项目、产品能有质的变化。
                    我们天天学技术,是为了把软件做得更好,不是为了学而学,需要把学来的,体现在实际项目上。
                    理想与现实往往有很多差距,其实很多不足就在我们的眼前,可能我们自己没发现。
                     我们做项目,写程序时,需要思路严谨思路严谨再严谨,否则很容易是在制造电子垃圾
 
  最近客户反馈,门户网站有安全检查要求,必须要达到某些安全检查要求,而且是今天电话打过来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个小功能节点,里程碑,有条有理的进行工作分解安排好。
将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。



本文转自 jirigala 51CTO博客,原文链接:http://blog.51cto.com/2347979/447826,如需转载请自行联系原作者

相关文章:

  • 23张非常精美的圣诞桌面壁纸分享
  • 使用iperf工具进行带宽测试
  • css在线格式化工具/js在线格式化工具
  • nginx 服务器重启命令相关
  • java jni和android java ndk
  • 示例化讲解RIP路由更新机制
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • Apache Spark Streaming 使用实例
  • GUI鼠标相关设置
  • NS3编译运行
  • webx学习总结
  • C语言如何跨文件调用函数定义中声明的变量
  • 思科网真应用解决方案
  • 使用Spring+MySql实现读写分离(一)关于windows下安装mysql5.6
  • android检测当前网络是否可用
  • Java新版本的开发已正式进入轨道,版本号18.3
  • redis学习笔记(三):列表、集合、有序集合
  • uva 10370 Above Average
  • vue-cli在webpack的配置文件探究
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 技术胖1-4季视频复习— (看视频笔记)
  • 深入浏览器事件循环的本质
  • 思否第一天
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (1)常见O(n^2)排序算法解析
  • (笔试题)分解质因式
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (四)linux文件内容查看
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • . Flume面试题
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET运行机制
  • .NET中GET与SET的用法
  • .net中的Queue和Stack
  • .pyc文件是什么?
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @selector(..)警告提示
  • @Transaction注解失效的几种场景(附有示例代码)
  • [16/N]论得趣
  • [2544]最短路 (两种算法)(HDU)
  • [C/C++]数据结构 栈和队列()
  • [cb]UIGrid+UIStretch的自适应
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • [FxCop.设计规则]8. 也许参数类型应该是基类型
  • [IDF]被改错的密码
  • [Java]快速入门二叉树,手撕相关面试题
  • [leetcode]Symmetric Tree
  • [MICROSAR Adaptive] --- Hello Adaptive World
  • [NOIP2011DAY1P1]铺地毯