司法三等申論題
115年
[檢察事務官電子資訊組] 程式語言
第 三 題
📖 題組:
四、某網路書店之網站提供下列 API,網站系統可依客戶端需求回傳 JSON 或 XML 資料。 GET/api/books:查詢所有書籍 GET/api/books/{id}:查詢指定書籍 POST/api/books:新增書籍 DELETE/api/books/{id}:刪除指定書籍
四、某網路書店之網站提供下列 API,網站系統可依客戶端需求回傳 JSON 或 XML 資料。 GET/api/books:查詢所有書籍 GET/api/books/{id}:查詢指定書籍 POST/api/books:新增書籍 DELETE/api/books/{id}:刪除指定書籍
📝 此題為申論題,共 4 小題
小題 (三)
(三)假設伺服器收到下列請求:
GET/api/books?discount=20
伺服器執行圖 4 之 Python 程式碼,且所有數值(包含計算後的結果)在轉為 JSON 輸出時,皆會強制保留一位小數(浮點數格式)。請寫出最後一行指令在標準 JSON 格式下,所輸出的單行完整 JSON 字串結果。(5 分)
books = [
{id: 1, price: 500},
{id: 2, price: 800}
]
discount = float(request.query["discount"])
for each book in books :
book["salePrice"] = book["price"] *(100 - discount)/100
print(output_as_json(books))
圖 4
GET/api/books?discount=20
伺服器執行圖 4 之 Python 程式碼,且所有數值(包含計算後的結果)在轉為 JSON 輸出時,皆會強制保留一位小數(浮點數格式)。請寫出最後一行指令在標準 JSON 格式下,所輸出的單行完整 JSON 字串結果。(5 分)
books = [
{id: 1, price: 500},
{id: 2, price: 800}
]
discount = float(request.query["discount"])
for each book in books :
book["salePrice"] = book["price"] *(100 - discount)/100
print(output_as_json(books))
圖 4
思路引導 VIP
📋 事實梳理:程式碼讀取 discount=20,也就是 20.0。接著計算 salePrice = price * (100 - 20) / 100 = price * 0.8。
🔍 爭點辨識:id 1 價格 500 -> 5000.8=400。id 2 價格 800 -> 8000.8=640。
小題 (一)
(一)請說明 HTTP 的無狀態性(Stateless)是什麼意思。(5 分)
思路引導 VIP
📋 事實梳理:HTTP 協定被設計為一種 Stateless 協定。 🔍 爭點辨識:Stateless 在通訊上代表伺服器會不會記得上一秒誰來過?
小題 (二)
(二)若此網路書店需要辨識已登入的使用者,伺服器端可以採用那一種機制來保存或傳遞登入狀態?請舉出一種說明即可。(5 分)
思路引導 VIP
📋 事實梳理:既然 HTTP 是無狀態,但購物車或登入系統需要「記住」使用者。 🔍 爭點辨識:實務上如何克服無狀態的限制?
小題 (四)
(四)系統後台使用下列 Python 程式碼來實作 GET/api/books/{id}(查詢指定書籍)的功能:
book_id = request.query["id"]
sql = "SELECT title, price FROM Book WHERE id = " + book_id
result = database.execute(sql)
1.請說明此程式碼在網頁安全上,可能遭受的惡意攻擊類型與原因。(5分)
2.請使用參數化查詢(Parameterized Query)修正上述程式碼,寫出修正後的完整程式片段,以有效防範該攻擊。(5 分)
book_id = request.query["id"]
sql = "SELECT title, price FROM Book WHERE id = " + book_id
result = database.execute(sql)
1.請說明此程式碼在網頁安全上,可能遭受的惡意攻擊類型與原因。(5分)
2.請使用參數化查詢(Parameterized Query)修正上述程式碼,寫出修正後的完整程式片段,以有效防範該攻擊。(5 分)
思路引導 VIP
📋 事實梳理:程式碼將使用者傳入的字串 book_id 直接用加號 + 串接成完整的 SQL 語句執行。
🔍 爭點辨識:如果使用者傳入的不是數字,而是 '1 OR 1=1' 甚至 '; DROP TABLE Book --' 會怎樣?