房费制 它 结账BUG

声明:以下内容仅仅是对在桌子上的卡与卡表的后面,适合学生的表!

最近,我们已经开始做VB.NET系统重构版,在这里跟大家聊聊我在机房收费系统中发现的漏洞。

在机房收费系统中有这样一个窗口--结账。个人觉得结账的功能是:领导对操作员注冊退卡进行结账,简单的说就是领导来收钱,假设你是一个操作员,每天充值退卡,你要知道你这段时间都赚了多少钱。

今天要说的重点就是卡表的结账!在结账中,有一个购卡。有一个退卡。

也就是说,对于同一张卡,它注冊后须要结账一次。退卡后也须要结账一次。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcnk1MTM3MDU2MTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

让我们来看看我数据库的卡表设计:

这里我们先不要纠结卡号是否为主键,每一个字段的数据类型对不正确。今天主要讲的是图中红色框框中的东西!假设你的注冊和退卡在一张表中,假设你的卡表设计没有这四个字段,那么我能够非常肯定的告诉你,你的结账有漏洞。

以下我们就来详细的说明为什么没有这四个字段就会有漏洞:

如图。一般大家的卡表设计都是这样,仅仅有一个IsCheck字段和一个Handler字段。这样我们在结账的时候,假设有一张卡正在使用、未结账,然后我们就能在结账-购卡中把它查询出来。然后我们如今把它结账,这条记录的IsCheck字段就变成“已结账”。然后我们再对这张卡进行退卡操作!

这时的退卡就没有结账,但是我们在结账-退卡中却查询不出来!

这时为什么呢?如今我们来对照一下我们查询时使用的SQL语句:

结账-购卡

select * from T_Card where IsCheck='未结账' and [email protected]
select * from T_Card where regitsterIsCheck='未结账' and [email protected]

结账-退卡

select * from T_Card where status='不使用' and IsCheck='未结账' and [email protected]
select * from T_Card where status='不使用' and logoutIsCheck='未结账' and [email protected]

通过对照这两条SQL语句,我们就能知道,假设结账-购卡的时候就把IsCheck字段改成“已结账”那么我们结账-退卡的时候就查不出来这条记录。

说完了registerIsCheck和logoutIsCheck字段的由来,以下再说说registerHandler和logoutHandler的由来:

假设我们的卡表里面仅仅有一个Handler字段。那么假设我们在操作员1处购卡,在操作员2处退卡,那么该记录的Handler最后应该是谁呢?

通过以上的论述,相信大家对红色框中的四个字段的由来非常信服了,假设大家还有什么不懂地方,能够找我私下讨论。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-11-10 06:50:13

房费制 它 结账BUG的相关文章

房费制——报表(1)

报告对我真的是一个新事物.他花了很长的时间才对报告 主要的了解. 首先,VB中有一个报表的控件Grid++Report Engine5.0TypeLibrary.其次.报表的制作是通过"Grid++Report报表设计器"这个软件制作.最后.这是报表.vb与sql之间的交互. 一.报表制作步骤 下载: 我估摸是我下载太旧了,当我下载4.5版本号的时候还要自己注冊,结果后来vb中老显示未安装报表的错误信息. 当我安装5.0以上的版本号基本就没有这种问题. (下载地址:http://www

房费制——登录优化

<客房收费系统个人版>基本完成,矿U层的代码是非常非常混乱.基本上D层有几个函数,B层就相应有几个函数,U层使用相应B层中的每个函数.比方说在登录中,U层首次要使用一个函数检查username和用户password是否正确,然后再使用"加入用户上机记录"的函数.以下是登录的时序图: 登录业务比較简单,可是对于复杂的上机过程呢?U层要检查卡是否注冊.剩余金额是否充足,卡的状态是否在使用中.该卡是否如今不在线,通过这一系列检验后,还要查询学生表显示学生信息等等. 这样就造成U层

vb.net版本房收费系统改造

房费制开始重建的最终版本. 前几天.刚刚看完三层的视频,在视频中具体的解说了一个登录功能.天真的我,当时以为三层结构是那么的简单,所以我草草地做完总结之后,就非常快就開始机房收费系统的重构了.但是谁想到.当我一打开编程软件,就让我"碰了一鼻子的灰"!首先是不知道vs 怎么用,其次就是看三层的时候,登录的实例使用C#写的,而这次我们须要用VB.NET写,所以对于当中的语法是知之甚少.尽管,前段时间我看了一遍台湾讲师--曹祖胜的<VB.NET 视频>.可是他讲的差点儿都是一些底

linux内核设计模式

原文来自:http://lwn.net/Articles/336224/ 选择感兴趣内容简单翻译了下: 在内核社区一直以来的兴趣是保证质量.我们需要保证和改善质量是显而易见的.但是如何做到却不是那么简单.一个广泛的办法是找到一些成功之处来增加内核在多方面的透明性.这将使得这些方面的质量变得更加明朗,因此将改变内核质量. 采用多种形式增加透明性: checkpatch.pl脚本突出显示了从已接受代码书写风格上的背离.这将鼓励使用此脚本的人去改正格式问题.因此,通过增加风格引导的透明性,我们增加了代

linux内核的设计模式

原文来自:http://lwn.net/Articles/336224/ 选择感兴趣内容简单翻译了下: 在内核社区一直以来的兴趣是保证质量.我们需要保证和改善质量是显而易见的.但是如何做到却不是那么简单.一个广泛的办法是找到一些成功之处来增加内核在多方面的透明性.这将使得这些方面的质量变得更加明朗,因此将改变内核质量. 采用多种形式增加透明性: checkpatch.pl脚本突出显示了从已接受代码书写风格上的背离.这将鼓励使用此脚本的人去改正格式问题.因此,通过增加风格引导的透明性,我们增加了代

hdu 3001 Travelling TSP变形 三进制状压dp

// hdu 3001 TSP问题的变形 // 这次到每个点最多两次,所以可以用三进制的类推 // dp[S][u]表示当前在u点访问状态为S时所得到的最小的开销 // 采用刷表法,即用当前的状态推出它所能转移的状态 // dp[S][u] 可以到达的状态为dp[S+state[v]][v](dist[u][v]!=inf) // dp[S+state[v]][v] = max(dp[S+state[v]][v],dp[S][u]+dist[u][v]); // 其中每个点最多访问2次 // 技

Android记录一个setTextColor常见的一个bug

今天写代码 一不小心就犯了个错误.仔细检查才发现,仅记录一下,防止各位同学犯同样的错误哦 代码如下: remote.setTextColor(summaryId, R.color.news_have_read); 如上,代码无论如何都不能正常显示颜色.只好换成如下代码: remote.setTextColor(summaryId,0xfdfdfdfd); 总不能写颜色值多麻烦..还是写的color.xml中吧. 最后才发现应该这样写才最对. remote.setTextColor(summary

华为笔试练习题----解析9进制,11进制的字符串为10进制的数字输出

                                                                              解析9进制,11进制的字符串为10进制的数字输出 描述: 解析9进制,11进制的字符串为10进制的数字输出,输入的字符串有效位(0v0012345678)长度不超过8位,前面的00不算做有效位.解析后以10进制的数字输出.如果解析到非法字符串则返回-1 9进制: 9进制的数的范围:0,1,2,3,4,5,6,7,8 9进制的开始为:0V或者0

Android的BUG(三) - 广为人知的诟病:频繁重启问题

使用过Android的同学,尤其是用过山寨pad,应该对Android的重启问题印象深刻吧.Android由于其设计的复杂性,可能会使得系统在不经意时陷入异常状态,因此Android设计了一套看门狗机制,当检测到问题后,自动重启. 再说说我碰到的问题吧,刚带起Android的时候,android的重启问题异常严重,经常操作一会后,界面卡住,等待1分钟左右,重启…, trace大约如下: W/Watchdog(  813): *** WATCHDOG KILLING SYSTEM PROCESS: