房费制 它 结账BUG
声明:以下内容仅仅是对在桌子上的卡与卡表的后面,适合学生的表!
最近,我们已经开始做VB.NET系统重构版,在这里跟大家聊聊我在机房收费系统中发现的漏洞。
在机房收费系统中有这样一个窗口--结账。个人觉得结账的功能是:领导对操作员注冊退卡进行结账,简单的说就是领导来收钱,假设你是一个操作员,每天充值退卡,你要知道你这段时间都赚了多少钱。
今天要说的重点就是卡表的结账!在结账中,有一个购卡。有一个退卡。
也就是说,对于同一张卡,它注冊后须要结账一次。退卡后也须要结账一次。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcnk1MTM3MDU2MTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
让我们来看看我数据库的卡表设计:
这里我们先不要纠结卡号是否为主键,每一个字段的数据类型对不正确。今天主要讲的是图中红色框框中的东西!假设你的注冊和退卡在一张表中,假设你的卡表设计没有这四个字段,那么我能够非常肯定的告诉你,你的结账有漏洞。
以下我们就来详细的说明为什么没有这四个字段就会有漏洞:
如图。一般大家的卡表设计都是这样,仅仅有一个IsCheck字段和一个Handler字段。这样我们在结账的时候,假设有一张卡正在使用、未结账,然后我们就能在结账-购卡中把它查询出来。然后我们如今把它结账,这条记录的IsCheck字段就变成“已结账”。然后我们再对这张卡进行退卡操作!
这时的退卡就没有结账,但是我们在结账-退卡中却查询不出来!
这时为什么呢?如今我们来对照一下我们查询时使用的SQL语句:
结账-购卡:
select * from T_Card where IsCheck='未结账' and handler=@handler
select * from T_Card where regitsterIsCheck='未结账' and registerHandler=@handler
结账-退卡:
select * from T_Card where status='不使用' and IsCheck='未结账' and handler=@handler
select * from T_Card where status='不使用' and logoutIsCheck='未结账' and logoutHandler=@handler
通过对照这两条SQL语句,我们就能知道,假设结账-购卡的时候就把IsCheck字段改成“已结账”那么我们结账-退卡的时候就查不出来这条记录。
说完了registerIsCheck和logoutIsCheck字段的由来,以下再说说registerHandler和logoutHandler的由来:
假设我们的卡表里面仅仅有一个Handler字段。那么假设我们在操作员1处购卡,在操作员2处退卡,那么该记录的Handler最后应该是谁呢?
通过以上的论述,相信大家对红色框中的四个字段的由来非常信服了,假设大家还有什么不懂地方,能够找我私下讨论。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
房费制 它 结账BUG的更多相关文章
- 房费制 之 登录BUG
声明:以下内容只有当你登录到一个username同时,学生不能申请多次登录. 说是BUG,事实上这也不是一个BUG,仅仅是想出一个办法,解决一个大家好多人都没有解决的问题.以下就给大家 ...
- 房费制VB版本(一个)——系统分析
首先.我们先回答两个个问题: 1.机房收费系统"是什么"? 2.机房收费系统应该"干什么"? 我的回答 ...
- linux内核设计模式
原文来自:http://lwn.net/Articles/336224/ 选择感兴趣内容简单翻译了下: 在内核社区一直以来的兴趣是保证质量.我们需要保证和改善质量是显而易见的.但是如何做到却不是那么简 ...
- vb.net版本房收费系统改造
房费制开始重建的最终版本. 前几天.刚刚看完三层的视频,在视频中具体的解说了一个登录功能.天真的我,当时以为三层结构是那么的简单,所以我草草地做完总结之后,就非常快就開始机房收费系统的重构了.但是谁想 ...
- 【BUG】12小时制和24小时制获取当天零点问题
[BUG]12小时制和24小时制获取当天零点问题 最近在写定时服务的时候,要获取当天的零点这个时间,但是是这样获取的 DateTime dt = DateTime.Parse(DateTime.Now ...
- 线上应用bug跟踪查找-友盟统计
线上的应用只要用心点点都能发现些bug,连微信,QQ也不列外.但是bug中最严重的算是闪退了,这导致了用户直接不能使用我们的app. 我们公司是特别注重用户反馈和体验的,我们会定期打电话咨询用户的使用 ...
- atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug
atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug 1. core.setProperty(o, "materialId&qu ...
- iOS开发 爱特开发技术bug总结
#pragma mark 每天总结学习两小时 效率 和 每天学习 研究底层 多进去看看 // .................................................... ...
- 一段网上java常见escape和unescape方法的BUG
escape编码和unescape编码,就是将一个字符转换为16进制unicode编码,前面加%字符进行标识. 此处不再多做解释,参考这里:http://www.jb51.net/article/23 ...
随机推荐
- Trie图和Fail树
Trie图和AC自动机的区别 Trie图是AC自动机的确定化形式,即把每个结点不存在字符的next指针都补全了.这样做的好处是使得构造fail指针时不需要next指针为空而需要不断回溯. 比如构造ne ...
- .net数据根据字段进行分类(linq语句)
var items = List<实体>; var models = items.GroupBy(r => r.分类字段).ToDictionary(d => d.Key, d ...
- 完美去除WPF按钮的边框
主页面背影图片, 添加5个功能按钮,并设置按钮的Background和BorderBrush为Transparent,好像没有问题,运行效果 不仅有一个发光的边框,而且当鼠标经过时,按钮就不在透明, ...
- hadoop的一些名词解释
在网上收集了一些mapreduce中常用的一些名词的解释,分享一下: Shuffle(洗牌):当第一个map任务完成后,节点可能还要继续执行更多的map 任务,但这时候也开始把map任务的中间输出交换 ...
- 转载:ecshop自定义销量
转自:http://www.phpally.com/ecshop%E8%87%AA%E5%AE%9A%E4%B9%89%E9%94%80%E9%87%8F/ 本补丁以假乱真,对网站销售有一定帮助,计算 ...
- Windows Phone开发(15):资源
原文:Windows Phone开发(15):资源 活字印刷术是我国"四大发明"之一,毕昇在发明活字印刷术之后,他很快发现一个问题,随着要印刷资料的不断增加,要用到的汉字数目越来越 ...
- C语言 cgi(3)
1cs3157 – Advanced ProgrammingSummer 2014, Project 1, 150 pointsJune 17, 2014Follow these step-by-st ...
- InnoDB行格式(compact,redundant)对照
InnoDB行格式分两种格式(COMPACT,redundant)默觉得COMPACT compact的存储格式为 首部为一个非NULL的变长字段长度列表,并且是依照列的顺序逆序放置的,当列的长度小于 ...
- Java泛型中extends和super的理解(转)
E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定 ...
- Google Maps Android API v2 (4)- 地图类型
地图类型 地图内的谷歌地图的Android API的种类有很多.地图的类型管辖地图的整体代表性.例如,地图集通常包含政治地图,专注于显示边界和道路地图,显示了一个城市或地区的所有道路. Android ...