110 一般警察特考二等 刑事警察人員數位鑑識組 資料庫管理與運用 考古題詳解
第 一 題30 分
在某國家,其圖書館公會欲建置一個資料庫。
該國有數十間公立圖書館,各圖書館有其編號與名稱,此二者均不會重複。各圖書館至少有一個分館。分館編號、名稱、所在地址、設立時間,均是必須留存的紀錄。不過,不同圖書館可能有相同的分館名稱或編號,例如「夢想圖書館」、「閱悅圖書館」均有 001 號及「信義分館」;但同一圖書館不可能有相同的分館名稱或編號。
民眾均得免費至各圖書館加入會員,辦理借書證借書。各圖書館借書證不相通,但同一圖書館可在其各分館借書。要蒐集民眾的身分證字號、姓名、性別、手機、地址等資料。另外,各圖書館也會統一給每位民眾一個借書證編號,而各圖書館主要使用的是此編號。
書籍有其獨一的國際標準書號(ISBN)來辨識,當然有名稱。書籍的出版商除其名稱、地址外,各給一個編號。書籍有其作者,當然可能一本書有多位作者。對於作者,我們各給一個編號,不過只知其名字、國籍。
圖書館購置並保管書籍的複本(Book Copy)。每一書籍複本各有其獨一的索書號(Call Number)及條碼號(Bar Code)。
例如「美人記」為一部小說叢書,全集共有 10 冊。「大同圖書館」「信義分館」保有其第 4 集(ISBN 為 978-986-96855-6-6)兩個複本,其索書號分別為 857.7 1171 V4 c1、857.7 1171 V4 c2。
會員借書是刷書籍複本的條碼號,資料庫要記錄其借出時間(含日期與時、分、秒)、歸還時間、逾期罰金(借期為 21 天,每超過一天罰 10 元)。
注意:
- 同一人可能對同一書籍複本借過多次。例如李小花在 2018/10/1 借過「美人記」第 4 集 857.7 1171 V4 c1,2020/9/3 又再借一次。此情況甚至有可能發生在同一天,例如 2018/10/1 借、還、又再借上述 857.7 1171 V4 c1。
- 會員可能同一天借多本書,但是還書時不見得同時歸還。
請針對上述資訊需求,繪出實體關係圖(Entity-Relationship Diagram),必須標示出主鍵(Primary Keys),另註明除主鍵外的其他候選鍵,以及各實體參與各關係之「至少」、「至多」的對應比率次數限制。
此圖中不得有多餘的實體或關係。對實體、關係、屬性的命名,可以選擇中文、英文夾雜;必要時請另註明中英對照,以避免看不懂英文命名的意涵。
同時請注意:實體關係圖中不得漏列題目中所提及的屬性,亦不得增列題目未談到的屬性。
登入後即可作答並保存紀錄。
核心觀念
本題考查實體關係圖(ERD)的辨識與建模,重點是:
- 主鍵與候選鍵:主鍵用來唯一識別實體;候選鍵是所有能唯一識別實體的最小屬性組合。題目要求標示主鍵,並列出主鍵以外的候選鍵。
- 弱實體與複合主鍵:分館編號與名稱只在同一圖書館內不重複,因此須結合所屬圖書館的編號才能唯一識別分館。
- 基數與參與限制:以「至少、至多」標示關係兩端的參與次數;例如每間圖書館至少有一個分館,表示圖書館端的分館數下限為 1。
- 關係本身有屬性:借閱需要記錄借出、歸還時間及逾期罰金;同一會員可多次借同一複本,因此借閱不能只用會員與複本組成的鍵識別,必須納入借出時間。
本題不是選擇題,沒有選項分析。
解題方法
先將題目中的名詞整理成實體,再找出實體間的關係與限制。為符合「不得增列題目未談到的屬性」,不自行加入會員流水號、借閱流水號等欄位;重複發生的借閱以題目已有的借出時間區分。
實體、屬性與鍵
圖示約定:PK 表示主鍵;AK 表示主鍵以外的候選鍵;複合鍵以括號列出。
圖書館 Library
PK:圖書館編號
AK:圖書館名稱
分館 Branch(弱實體)
PK:(圖書館編號, 分館編號)
AK:(圖書館編號, 分館名稱)
屬性:分館編號、分館名稱、所在地址、設立時間
會員 Member
PK:(圖書館編號, 借書證編號)
AK:(圖書館編號, 身分證字號)
屬性:身分證字號、姓名、性別、手機、地址、借書證編號
書籍 Book
PK:ISBN
屬性:ISBN、書名
出版商 Publisher
PK:出版商編號
屬性:出版商編號、名稱、地址
作者 Author
PK:作者編號
屬性:作者編號、名字、國籍
書籍複本 Book Copy
PK:條碼號
AK:索書號
屬性:索書號、條碼號
借閱 Borrowing(關係實體)
PK:(圖書館編號, 借書證編號, 條碼號, 借出時間)
屬性:借出時間、歸還時間、逾期罰金
會員的借書證編號由各圖書館統一編配,且各館借書證不相通,因此跨圖書館識別會員時,需把圖書館編號納入主鍵。題目說民眾身分證字號可用來蒐集民眾資料,並以各館借書證編號作為主要使用編號;在同一圖書館內,身分證字號也能識別該會員,故列為候選鍵。
分館是弱實體:分館編號及名稱都只保證在同一圖書館內不重複,所以分館主鍵分別由「圖書館編號+分館編號」構成;以「圖書館編號+分館名稱」也能唯一識別分館,列為候選鍵。
書籍複本的索書號與條碼號各自唯一,故條碼號作主鍵,索書號列為其他候選鍵。借閱主鍵納入借出時間,可區分同一會員對同一複本的多次借閱,包括同一天借還後再次借閱的情形。
關係與參與次數限制
圖書館 (1..*) ──擁有── (1..1) 分館
圖書館 (0..*) ──辦理會員── (1..1) 會員
分館 (0..*) ──保管── (1..1) 書籍複本
書籍 (0..*) ──有複本── (1..1) 書籍複本
出版商 (0..*) ──出版── (1..1) 書籍
書籍 (1..1) ──由出版商出版── (0..*) 出版商
書籍 (1..*) ──著作── (0..*) 作者
會員 (0..*) ──借閱── (0..*) 書籍複本
上列「書籍—出版商」表示每本書由一個出版商出版;一個出版商可出版零本或多本書。「書籍—作者」為多對多:每本書至少有一位作者;題目未規定每位作者至少著作一本書,因此作者端下限為 0。
第 二 題25 分
下面三個資料庫表格分別代表賽車手(Racer)、跑車(Sports_Car)及駕駛(Drive)的資料。
Racer 表格包含賽車手資料:編號(RID)、姓名(Name)、手機(CellPhone)、評等(Rating)及年齡(Age)。評等資料值為 1 至 10 間的整數,數值越大越好。
Sports_Car 表格包含跑車資料:賽車編號(SNum)、牌照號碼(License_Num)、引擎號碼(Engine_Num)、可開的最高速度(Max_Speed)及顏色(Color)。顏色資料值如 red、green、yellow 等各種顏色。
Drive 表格包含某賽車手編號(RID)於某天(Date)開某跑車編號(SNum)的資料。Date 格式為 YYYY-MM-DD。
Racer (RID, Name, CellPhone, Rating, Age)
Sports_Car (SNum, License_Num, Engine_Num, Max_Speed, Color)
Drive (RID, SNum, Date)
請以 SQL 語言,寫出下列查詢:
(一)在 2021-06-06 當天沒開紅色跑車的賽車手姓名。(8 分)
(二)在 2021-06-17 當天開各種顏色跑車的賽車手人數。(8 分)
(三)想了解評等至少為 6、年齡至少 18 歲的賽車手,各評等賽車手族群的平均年齡;但只對滿足上述條件之各評等賽車手人數超過 3 人者有興趣,需要去統計列出。(9 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查關聯式資料庫的多表連接、集合排除、分組聚合與分組篩選:
Racer與Drive以RID連接;Drive與Sports_Car以SNum連接。WHERE用來篩選個別資料列;GROUP BY用來依欄位分組;HAVING用來篩選分組後的結果。COUNT(DISTINCT ...)可避免同一賽車手因多筆駕駛紀錄,在人數統計中被重複計算。- 「沒有開過符合條件的車」屬於反向存在判斷,可用
NOT EXISTS表達。
解題方法與 SQL
(一)2021-06-06 當天沒開紅色跑車的賽車手姓名
以 NOT EXISTS 檢查每位賽車手是否沒有任何一筆紀錄,同時符合指定日期且所開跑車為紅色。這種寫法會列出當天沒有開紅車的人,也包含當天沒有駕駛紀錄的人。
SELECT R.Name
FROM Racer AS R
WHERE NOT EXISTS (
SELECT 1
FROM Drive AS D
JOIN Sports_Car AS S
ON D.SNum = S.SNum
WHERE D.RID = R.RID
AND D.Date = '2021-06-06'
AND S.Color = 'red'
);
若同一賽車手有多筆資料,姓名可能重複;題目要求列出賽車手姓名而非駕駛紀錄,若需每個姓名只出現一次,可在 SELECT 後加上 DISTINCT。
(二)2021-06-17 當天開各種顏色跑車的賽車手人數
先連接 Drive 與 Sports_Car,限定日期後依顏色分組。每組計算不同賽車手的數量,避免同一人當天開同色跑車多次而重複計數。
第 三 題25 分
假設要設計一個犯罪的關聯式資料庫,已知屬性包含 、、、、、 六者,已知的功能相依如下:
(一)請先以功能相依的推導,找出上述功能相依的 Minimal Cover。(7 分)
(二)若上述六個屬性形成一個 Universal Relation ,請問 所有的候選鍵,並呈現你的功能相依推導。(6 分)
(三)請對此犯罪的關聯式資料庫,列出滿足第三正規化的關聯資料庫綱要設計,並說明為何滿足第三正規化。(12 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查功能相依的最小覆蓋、候選鍵判定,以及第三正規化(3NF)分解。
功能相依 表示:在關係中,任意兩筆資料只要 值相同, 值就必須相同。最小覆蓋須符合三項條件:
- 每條相依右側只有一個屬性。
- 左側沒有多餘屬性。
- 沒有可刪除的冗餘功能相依。
屬性集合 的閉包 ,是由已知功能相依可推得的所有屬性。若 ,則 是超鍵;若再沒有任何真子集是超鍵,則 是候選鍵。
3NF 的判準是:對每一個非平凡功能相依 ,至少符合下列之一:
- 是超鍵;或
- 是主屬性,也就是至少出現在一個候選鍵中。
(一)求 Minimal Cover
先將右側拆成單一屬性:
接著檢查左側多餘屬性及冗餘相依。
化簡
- 在 中, 不多餘:由 無法推出 ,由 也無法推出 。
- 在 中, 不多餘:由 無法推出 ,由 也無法推出 。
- 可由 及 推出,因此刪除。
- 可由 推出,因此刪除。
化簡
- 可由 及 推出,因此刪除。
- 可由 及 推出,因此刪除。
其餘相依皆不可刪除。例如 不可由其他相依推出; 也不可由其餘相依推出。
因此最小覆蓋為:
(二)求所有候選鍵
先觀察右側屬性:所有功能相依的右側都沒有 ,所以 不可能由其他屬性推出。每一個候選鍵都必須包含 。
計算
由 ,加入 ;再由 加入 ,由 加入 。故:
第 四 題20 分
假設某設計師設計了一個全國警察資料庫,其中包含 police 表格。可能部署的資料庫管理軟體是微軟 SQL Server,也可能是 MySQL。
當警員想檢視自己的資料時,必須輸入自己的 ID 與密碼。該設計師以 SQL 程式的字串直接結合對話框所取得的兩個字串來搜尋資料庫並回應,示意如下:
SELECT * FROM police WHERE (ID = '輸入的 ID 字串') AND (password = '輸入的密碼');
上述單引號內的「輸入的 ID 字串」表示直接由對話框取得的 ID 字串;「輸入的密碼」也是直接由對話框取得的密碼字串。
例如警員甲的 ID 是 john,密碼是 John2021AbCd5678。警員甲輸入後,程式片段會變成:
SELECT * FROM police WHERE (ID = 'john') AND (password = 'John2021AbCd5678');
請問這樣的程式寫法可能會有什麼資安風險問題?為什麼?請假設至少兩種狀況,以 SQL 程式詳細解釋為何有可能產生資安風險。
登入後即可作答並保存紀錄。
核心觀念
本題考查 SQL Injection(SQL 注入)。程式把使用者輸入直接串接進 SQL 語句,資料庫便會把輸入中的引號、運算子與註解符號當成 SQL 語法解析,而非單純的 ID 或密碼文字。
因此,攻擊者可改變 WHERE 條件的意義,造成登入驗證繞過或查詢資料外洩。實際影響範圍取決於資料庫帳號的權限。
解題方法
觀察使用者輸入會被放在 SQL 單引號內,再檢查輸入能否:
- 用單引號結束原本的字串。
- 加入新的 SQL 條件。
- 用註解符號遮蔽原本的密碼檢查或後續語句。
只要輸入能改變查詢結構,就不是一般的輸入驗證問題,而是 SQL 注入。
狀況一:注入永遠成立的條件,取得整張資料表
假設攻擊者把 ID 欄位輸入為:
') OR 1=1 --
密碼欄位可輸入任意內容。串接後的 SQL 會成為:
SELECT * FROM police
WHERE (ID = '') OR 1=1 -- ') AND (password = '任意內容');
1=1 永遠成立;-- 則將該行後續內容註解掉,因此原本的密碼檢查不會執行。查詢條件實際上等同於「ID 為空字串,或條件永遠成立」,會回傳 police 表中的所有資料。
這會繞過登入檢查,並使警員資料遭到未授權讀取。SQL Server 與 MySQL 都支援 -- 行註解;MySQL 的 -- 後方須接空白或控制字元,本例已提供空白。