機房收費系統 之 結賬BUG

傻丫頭與科技發表於2014-08-22
宣告:以下內容只對將卡表和退卡表放在同一張表的同學適用!


    最近大家都已經開始做VB.NET機房收費系統重構版,在這裡跟大家聊聊我在機房收費系統中發現的漏洞。


    在機房收費系統中有這樣一個窗體--結賬。個人認為結賬的功能是:領導對操作員註冊退卡進行結賬,簡單的說就是領導來收錢,如果你是一個操作員,每天充值退卡,你要知道你這段時間都賺了多少錢。


    今天要說的重點就是卡表的結賬!在結賬中,有一個購卡,有一個退卡。也就是說,對於同一張卡,它註冊後需要結賬一次,退卡後也需要結賬一次。




讓我們來看看我資料庫的卡表設計:

                                                


        這裡我們先不要糾結卡號是否為主鍵,每個欄位的資料型別對不對。今天主要講的是圖中紅色框框中的東西!如果你的註冊和退卡在一張表中,如果你的卡表設計沒有這四個欄位,那麼我可以很肯定的告訴你,你的結賬有漏洞。

下面我們就來具體的說明為什麼沒有這四個欄位就會有漏洞:
                                                 
        如圖,一般大家的卡表設計都是這樣,只有一個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最後應該是誰呢?




       通過以上的論述,相信大家對紅色框中的四個欄位的由來很信服了,如果大家還有什麼不懂地方,可以找我私下討論。

    





相關文章