110 經濟部聯招(台電、中油、台水、台糖)新進職員 資訊 國營事業聯招 (資訊管理、程式設計)B 考古題詳解
第 一 題15 分
資訊系統的安全威脅與日俱增,企業必須採取有效的防護措施,才能避免因為發生資安問題所造成的損失。資訊系統包含硬體、軟體、資料、程序及人員等 5 項元件,其中硬體及軟體可藉由 5 個資訊技術防護措施進行安全防護,請詳細說明之?(15 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查資訊系統的安全防護,以及硬體、軟體面對未授權存取、惡意程式、網路攻擊與資料竊取時所採用的資訊技術控制措施。
資訊系統的安全目標通常包括:
- 機密性(Confidentiality):避免資料遭未授權人員取得。
- 完整性(Integrity):避免資料或程式遭未授權竄改。
- 可用性(Availability):確保硬體、軟體與服務能正常運作。
針對硬體及軟體,常見的五項資訊技術防護措施如下:
- 身分認證與存取控制
- 防火牆
- 防毒與反惡意程式
- 入侵偵測與入侵防禦
- 加密技術
解題方法
本題要求「詳細說明五個防護措施」,作答時應採取「防護措施名稱+防護原理+實際功能+可防範的威脅」的方式逐項說明,並將措施與機密性、完整性、可用性相互連結,答案即可完整涵蓋配分重點。
五項資訊技術防護措施
一、身分認證與存取控制
身分認證是確認使用者、設備或程式是否為合法對象;存取控制則是在確認身分後,依照權限決定其可使用的資源與操作範圍。
常見作法包括:
- 帳號與密碼
- 多因素認證
- 晶片卡、憑證
- 指紋、臉部辨識等生物特徵辨識
- 角色型存取控制(RBAC)
- 最小權限原則
例如,系統管理員可以安裝軟體與修改系統設定,一般員工只能使用業務系統,不能直接存取作業系統核心檔案。
此措施可防止:
- 冒用他人帳號
- 未授權登入
- 一般使用者任意修改軟體
- 內部人員超越職務權限存取系統
密碼不應以明文儲存,應使用雜湊及適當的加鹽機制保存;權限設定也應定期檢視,離職人員帳號須立即停用。
二、防火牆(Firewall)
防火牆部署於內部網路與外部網路之間,依據來源位址、目的位址、通訊埠號、通訊協定及連線狀態等規則,允許或阻擋網路封包。
防火牆的主要功能包括:
- 阻擋未授權的外部連線
- 限制內部主機對外連線
- 控制特定服務與通訊埠
- 區隔不同安全區域
- 記錄網路連線與異常流量
例如,只允許外部使用者連線至公開網站的 HTTPS 服務,封鎖不必要的遠端管理埠,可降低駭客掃描與入侵的機會。
防火牆可分為封包過濾型、狀態檢查型、代理伺服器型及次世代防火牆等。企業也可利用 DMZ 將對外服務主機與內部重要系統隔離。
但防火牆主要控制網路流量,無法單獨防止合法帳號遭竊用,也無法完全阻止使用者自行安裝的惡意程式,因此必須搭配其他防護措施。
三、防毒與反惡意程式軟體
防毒軟體及反惡意程式軟體用來偵測、阻擋、隔離與移除病毒、蠕蟲、木馬程式、勒索軟體、間諜軟體及其他惡意程式。
主要偵測方式包括:
- 特徵碼比對
- 啟發式分析
- 行為分析
- 即時監控
- 沙箱分析
- 雲端威脅情報比對
其防護範圍涵蓋:
- 作業系統檔案
- 應用程式
- 電子郵件附件
- USB 隨身碟
- 下載檔案
- 記憶體及執行中的程序
防毒軟體必須定期更新病毒特徵碼及程式版本,並配合作業系統修補、使用者教育與應用程式白名單,才能降低零時差攻擊及勒索軟體造成的損害。
此措施主要維護軟體與資料的完整性及系統的可用性,但無法取代防火牆、存取控制及備份機制。
四、入侵偵測與入侵防禦系統(IDS/IPS)
入侵偵測系統(IDS)負責監控主機或網路流量,發現可疑行為時發出警報;入侵防禦系統(IPS)除偵測外,還能即時阻擋、丟棄或中斷可疑連線。
常見功能包括:
第 二 題15 分
某書局採會員制販售各式國、高中參考書,系統的關聯式資料庫(Relational Database)包含 4 個資料表(table)如下,有底線者為主鍵:
參考書(<u>書籍編號</u>、書籍名稱、出版商編號、單價、會員折扣數) 出版商(<u>出版商編號</u>、出版商名稱、聯絡人) 銷售(<u>銷售編號</u>、會員編號、銷售日期、書籍編號、數量、售價、購買總額) 會員(<u>會員編號</u>、名字、入會日期、聯絡電話)
若非會員,銷售資料表之欄位(會員編號)紀錄為 N99,書籍之售價採參考書資料表的欄位(單價)販售;反之,若為會員,則採參考書資料表的欄位(單價)乘以欄位(會員折扣數)販售。
針對下列問題,請分別寫出 SQL 指令來進行查詢。(3 題,每題 5 分,共 15 分)
(一) 請列出每本參考書的銷售數量,並按書籍編號由小到大排序。 (二) 若書籍編號 B3169 的銷售量為最好,請列出會員與非會員的購買總額,各是多少? (三) 書籍編號 B6188 為新出版上架之參考書,店員第一天將會員折扣數由 92 折誤輸入為 82 折,直到當天盤點結帳才發現,請問當天書局少收了多少錢?
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- 資料表之間以外鍵進行連接(
JOIN)。 GROUP BY分組彙總。SUM計算數量或金額總和。CASE依會員與非會員身分分類。LEFT JOIN保留尚未有銷售紀錄的參考書。- 會員折扣數為價格乘數,例如 92 折應表示為 ,82 折應表示為 。
以下 SQL 以資料表及欄位名稱可直接使用中文識別字為前提;若資料庫系統要求識別字加括號,可依該系統語法調整。
(一)列出每本參考書的銷售數量,並按書籍編號排序
解題方法
以「參考書」為主表,使用 LEFT JOIN 連接「銷售」資料表,確保即使某本書尚未銷售,也能列出該書,並將銷售數量顯示為 。
由於一本書可能有多筆銷售紀錄,因此必須使用:
SQL 指令
SELECT
B.書籍編號,
B.書籍名稱,
COALESCE(SUM(S.數量), 0) AS 銷售數量
FROM 參考書 AS B
LEFT JOIN 銷售 AS S
ON B.書籍編號 = S.書籍編號
GROUP BY
B.書籍編號,
B.書籍名稱
ORDER BY
B.書籍編號 ASC;
解題技巧與陷阱
- 若使用
INNER JOIN,沒有銷售紀錄的書籍會被排除,無法真正列出「每本」參考書。 SUM對沒有配對資料時可能得到NULL,因此使用COALESCE(..., 0)顯示為 。GROUP BY必須包含SELECT中未彙總的欄位。- 題目要求按書籍編號由小到大排序,因此使用
ORDER BY 書籍編號 ASC。
(二)列出書籍編號 B3169 的會員與非會員購買總額
解題方法
非會員的「會員編號」固定記錄為 N99,因此可用 CASE 將銷售紀錄分成兩組:
會員編號 = 'N99':非會員。會員編號 <> 'N99':會員。
「購買總額」已存在於銷售資料表,因此直接加總該欄位即可。
SQL 指令
SELECT
CASE
WHEN 會員編號 = 'N99' THEN '非會員'
ELSE '會員'
END AS 會員類別,
SUM(購買總額) AS 購買總額
FROM 銷售
WHERE 書籍編號 = 'B3169'
GROUP BY
CASE
WHEN 會員編號 = 'N99' THEN '非會員'
ELSE '會員'
END;
若希望會員與非會員固定各列一筆
若某一類沒有購買紀錄,仍希望顯示為 ,可使用條件彙總:
第 三 題20 分
簡答題:(4 題,每題 5 分,共 20 分)
(一) 請說明何謂 SQL Injection?如何防範? (二) 請說明物聯網(IoT)技術涵蓋的 4 項範疇。 (三) 請說明雲端運算服務的 3 項類別。 (四) 請說明何謂資訊倫理?
登入後即可作答並保存紀錄。
第三題 簡答題詳解
(一)何謂 SQL Injection?如何防範?
核心觀念
SQL Injection(SQL 隱碼攻擊)是指攻擊者將惡意 SQL 語法嵌入使用者輸入資料,使應用程式將該輸入內容誤認為 SQL 指令的一部分,進而改變原本的查詢、驗證或資料處理邏輯。
常見受害功能包括:
- 帳號密碼登入
- 網站搜尋
- 資料查詢
- 網址參數傳遞
- 後台管理系統
其根本原因是「使用者輸入資料」與「SQL 指令字串」混合組合,且程式未妥善驗證及隔離輸入內容。
解題方法
答題時可依「定義、成因、危害、防範」四個層次說明。
例如程式以字串串接方式組合 SQL:
SELECT * FROM users
WHERE account = '使用者輸入'
AND password = '密碼輸入';
若輸入內容含有特殊 SQL 語法,可能使原本的條件被改寫,造成:
- 未授權登入
- 查詢機密資料
- 新增、修改或刪除資料
- 取得資料庫結構
- 進一步控制伺服器
防範方式
- 使用參數化查詢(Parameterized Query)或預備陳述式(Prepared Statement)
將 SQL 指令與輸入資料分開傳送,輸入內容只被視為資料,不會被當成 SQL 語法執行。這是最主要且最有效的防禦方式。
- 使用安全的 ORM 或資料存取框架
透過 ORM、資料庫 API 等機制,避免自行以字串串接 SQL 指令。
- 進行輸入驗證
依欄位需求限制資料格式、長度、字元範圍及資料型別。例如年齡應限制為整數,帳號應限制長度及可使用字元。
- 避免字串直接串接 SQL
不應將使用者輸入直接嵌入 SQL 語句。單純以跳脫字元處理輸入,只能作為輔助措施,不能取代參數化查詢。
- 採最小權限原則
應用程式連接資料庫的帳號只授予必要權限,避免遭攻擊後能任意刪除資料或執行管理操作。
- 隱藏錯誤細節並進行日誌監控
對外只顯示一般錯誤訊息,避免洩漏資料表、欄位及資料庫類型;同時記錄異常查詢及登入行為,以利偵測與追蹤。
解題技巧
SQL Injection 的判斷關鍵是:攻擊者不是單純輸入錯誤資料,而是讓輸入內容改變 SQL 指令的「結構或邏輯」。
防範答案至少應寫出:
- 參數化查詢或 Prepared Statement
- 輸入驗證
- 最小權限
只寫「將特殊符號過濾掉」並不完整,因為過濾規則可能被繞過,也無法取代安全的資料庫介面。
【答案】
SQL Injection 是攻擊者將惡意 SQL 語法置入輸入欄位,使應用程式將輸入內容與 SQL 指令混合執行,導致未授權登入、資料外洩、資料遭竄改或刪除。防範方式包括使用參數化查詢或 Prepared Statement、採用安全 ORM、進行輸入驗證、避免字串串接 SQL、限制資料庫帳號權限,並配合錯誤訊息控管及日誌監控。
(二)請說明物聯網(IoT)技術涵蓋的 4 項範疇
核心觀念
物聯網(Internet of Things, IoT)是將各種實體物件連接至網路,使其能夠感測環境、傳遞資料、接受控制並提供服務。
IoT 的完整運作通常可分為四項範疇:
- 感知與辨識
- 網路與通訊
- 資料處理與平台
- 應用與服務
解題方法
可依資料流向說明:
四項範疇
- 感知與辨識層(Sensing and Identification)
負責蒐集物理世界資料及辨識物件身分,例如:
- 溫度、濕度、壓力、位置感測器
- RFID
- 條碼與 QR Code
- 攝影機及各類環境感測設備
此層重點是「取得資料」與「辨認物件」。
- 網路與通訊層(Network and Communication)
負責將感測設備所取得的資料傳送至其他設備、伺服器或雲端平台,也負責傳回控制命令。相關技術包括:
- Wi-Fi
- Bluetooth
- Zigbee
- 5G
- LoRaWAN
- Ethernet
此層重點是裝置間的連線、資料傳輸及通訊協定。
- 資料處理與平台層(Data Processing and Platform)
負責接收、儲存、分析及管理 IoT 裝置產生的資料,常使用:
- 雲端運算
- 邊緣運算
- 大數據分析
- 人工智慧
- 裝置管理平台
- 資料庫與事件處理系統
此層可將大量原始資料轉換為有意義的資訊或控制決策。
- 應用與服務層(Application and Service)
將處理後的資料提供給使用者或其他系統,形成具體服務,例如:
- 智慧家庭
- 智慧醫療
- 智慧交通
- 智慧工廠
- 智慧農業
- 智慧城市
此層重點是實際應用、決策支援及自動控制。
解題技巧
IoT 四項範疇可用「感、傳、算、用」記憶:
- 感:感測與辨識
- 傳:網路與通訊
- 算:資料處理與平台
- 用:應用與服務
第 四 題15 分
下列問題,請用遞迴(Recursive)的方式來撰寫:(共 2 題,共 15 分)
(一) 實驗室培養某細胞,此細胞區分為成年與幼年細胞。每個成年細胞於 1 個月後會生出 2 個幼年細胞,幼年細胞於 1 個月後會變為成年細胞。請用遞迴方式撰寫一函式 CellNumber,輸入為 個月後,其傳回為 個月後細胞的總數。(8 分) (二) 請用遞迴方式撰寫一函式 GCD,輸入為 2 個正整數,其傳回為此 2 個正整數之最大公因數。(7 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查遞迴函式的設計,重點包括:
- 設定適當的基底條件(Base Case)。
- 找出目前問題與較小規模問題之間的遞迴關係。
- 確保每次遞迴呼叫都使問題規模縮小,最後能回到基底條件。
- 最大公因數使用歐幾里得演算法(Euclidean Algorithm)。
(一)細胞總數函式 CellNumber
解題方法
假設第 個月開始時有 個成年細胞,且沒有幼年細胞。
設:
- :第 個月的成年細胞數
- :第 個月的幼年細胞數
- :第 個月的細胞總數
每個月的變化如下:
- 成年細胞仍然存在,並且每個成年細胞產生 個幼年細胞。
- 幼年細胞經過 個月後變為成年細胞。
因此:
細胞總數為:
代入上式:
又因為第 個月的成年細胞,於第 個月會變成幼年細胞;可整理得到:
基底條件
第 個月:
第 個月:
- 原本的成年細胞仍為成年細胞 個
- 產生幼年細胞 個
所以:
遞迴程式
Function CellNumber(N)
If N = 0 Then
Return 1
Else If N = 1 Then
Return 3
Else
Return CellNumber(N - 1) + 2 * CellNumber(N - 2)
End If
End Function
範例驗算
因此細胞總數依序為:
解題技巧與常見陷阱
- 必須先明確設定第 個月的初始細胞狀態。本解採「開始時有 個成年細胞」的標準假設。
- 成年細胞不會消失,幼年細胞才會在下一個月轉為成年細胞。
第 五 題15 分
某銀行有多台取號機供民眾取號,每台取號機提供多項服務的取號,同一服務會依據各取號機之取號的先後時間,依序給予連續的號碼,且最小的號碼為 1。請使用下列所有的函式來撰寫一取號函式 GetNumber,輸入為服務代碼與鎖定號碼變數失敗的上限次數,其傳回為此服務的下一個號碼,但當鎖定號碼變數失敗超過其上限次數時,則傳回 0。(15 分)
int lock(int serviceid) /* 鎖定指定服務代碼的號碼變數。輸入為服務代碼,其傳回為是否鎖定成功,當鎖定成功時,則傳回 1,當鎖定失敗時,則傳回 0。 */
unlock(int serviceid) /* 解鎖指定服務代碼的號碼變數。輸入為服務代碼。 */
int get(int serviceid) /* 取得指定服務代碼的號碼變數之值。輸入為服務代碼。 */
set(int serviceid, int value) /* 設定指定服務代碼的號碼變數之值。輸入為服務代碼與此服務代碼的號碼變數欲設定之值。 */
sleep() /* 執行暫停 0.1 秒 */
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- 互斥鎖(Lock)與臨界區(Critical Section)
get與set必須視為不可被其他取號機插入的連續操作。- 必須先使用
lock(serviceid)成功鎖定該服務的號碼變數,才能讀取與更新。
- 競爭情況(Race Condition)
- 若不加鎖,多台取號機可能同時讀到相同號碼,造成重複取號。
- 鎖定範圍應包含
get、計算下一號、set三個步驟。
- 失敗重試機制
lock失敗時,應暫停 秒後再嘗試。- 當失敗次數超過指定上限,傳回 。
號碼變數採用「下一個可發出的號碼」設計:
- 初始值為 。
- 取出目前值 作為本次號碼。
- 將號碼變數更新為 。
- 傳回 。
解題方法
設變數 failcount 紀錄鎖定失敗次數。
流程如下:
- 將失敗次數設為 。
- 呼叫
lock(serviceid)。 - 若鎖定失敗:
failcount加 。- 若
failcount > maxfail,傳回 。 - 呼叫
sleep暫停 秒,再重新嘗試。
- 若鎖定成功:
- 呼叫
get(serviceid)取得目前號碼。 - 將號碼加 。
- 呼叫
set(serviceid, number + 1)更新號碼變數。 - 呼叫
unlock(serviceid)解除鎖定。 - 傳回本次取得的
number。
參考程式碼
int GetNumber(int serviceid, int maxfail)
{
int failcount = 0;
int number;
while (1)
{
if (lock(serviceid) == 1)
{
number = get(serviceid);
set(serviceid, number + 1);
unlock(serviceid);
return number;
}
else
{
failcount++;
if (failcount > maxfail)
{
return 0;
}
sleep;
}
}
}
程式正確性說明
第 六 題20 分
某電梯管理系統控制多台電梯,當某樓層之等待區按下按鈕時,會將其樓層號碼傳送到系統之共用 Queue 中,系統會定時自共用 Queue 中讀取一筆目標樓層號碼,並尋找離此目標樓層最近的電梯來提供服務。請使用下列所有的函式,來撰寫一選取電梯函式 SelElev,輸入為電梯的總數,其傳回為離目標樓層最近的電梯號碼,但當未選擇到電梯時,則傳回 0。另外,當電梯總數為 時,電梯號碼為 1 到 ;樓層號碼為 1 代表 1 樓、2 代表 2 樓、0 代表地下 1 樓、-1 代表地下 2 樓(依此類推)。(20 分)
int getqueue() /* 自共用 Queue 中取得下一筆目標樓層號碼。其傳回為下一筆目標樓層號碼,當無資料時,則傳回 999。 */
int getcurfloor(int elevid) /* 取得指定電梯目前所在的樓層。輸入為電梯號碼,其傳回為此電梯目前所在的樓層,但當此電梯不提供服務時,則傳回 999。 */
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- Queue 先進先出(FIFO):以
getqueue取得共用 Queue 中下一筆目標樓層。 - 循序搜尋:逐一檢查編號 到 的電梯。
- 最近距離判定:電梯與目標樓層的樓層距離為
getcurfloor(elevid)回傳999代表該電梯不提供服務,必須排除。getqueue回傳999代表 Queue 無資料,此時不選擇電梯,回傳 。
地下樓層以數值表示具有連續性,例如:
- 樓:
- 樓:
- 地下 樓:
- 地下 樓:
因此直接使用兩個樓層號碼相減後取絕對值,即可計算實際樓層距離。
解題方法
解題步驟如下:
- 呼叫
getqueue取得目標樓層。 - 若回傳值為
999,表示 Queue 沒有資料,直接回傳 。 - 設定目前最短距離為一個很大的值,並將選取電梯編號設為 。
- 依序檢查電梯 到 :
- 呼叫
getcurfloor(i)取得第 部電梯所在樓層。 - 若回傳
999,跳過該電梯。 - 計算其與目標樓層的距離。
- 若距離小於目前最短距離,更新最短距離與電梯編號。
- 搜尋完成後回傳選取到的電梯編號。若所有電梯均不提供服務,則仍維持回傳 。
同樣距離時,本解採用「編號較小的電梯優先」作為平手規則,因此只在新距離嚴格小於目前最短距離時更新。