iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Security

資安菜鳥的30天挑戰系列 第 10

[DAY10]是誰在亂說話?

  • 分享至 

  • xImage
  •  

文字輸入很危險?

你在畫畫時收到別人的貼紙

有些貼紙放在畫上變得很好看

但有的貼紙卻會把你的畫毀掉

怎麼防護?

  • 驗證
    • 優先使用 白名單(allowlist):只允許 a-z0-9@._-
    • 使用既有正則(email validator)
    • 補充:若白名單不可行,採黑名單僅作輔助,但風險高
  • 正規化
    • 把輸入統一成標準形式(去掉 Unicode 等價字符、處理 URL 編碼)
    • 避免攻擊者用編碼繞過過濾
  • 輸出編碼
    • HTML → HTML 編碼(<&lt;
    • JavaScript → JS 字串編碼
    • SQL → 使用參數化查詢,非手動 escape

舉例

📌 SQL 注入

  • 使用者輸入
username = admin
password = ' OR '1'='1
  • 系統查找資料並比對
query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
cursor.execute(query)
  • 在電腦眼裡
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1'

'' OR '1'='1' 等於 TRUE

所以只要名單裡面有 admin

便能通過系統判斷

  • 如何修改?
cursor.execute(
    "SELECT * FROM users WHERE username = ? AND password = ?",
    (username, password)
)

參數化查詢 → 避免字串被當成 SQL 指令

📌 檔案上傳

  • 使用者輸入

    上傳內容是 PHP 程式的檔案

<?php 
	system($_GET['cmd'],$out)); 
	var_dump($out);
?>
  • 檔案保存到特定位置
file.save("uploads/" + filename)
  • 攻擊者便能遠端執行任意命令

安全修改方式

  1. 驗證檔案
  2. 儲存到 非可執行目錄(如 /data/uploads/
  3. 使用 escapeshellcmd()escapeshellarg()
  4. 避免直接使用 system(), exec(), shell_exec()

📌 不可以亂試喔!

結論

多數注入攻擊都靠未經處理的輸入

正規化(統一形式)、再驗證(prefer 白名單)

最後在輸出時依上下文做編碼/轉譯

配合最小權限、日誌監控

檔案上傳防護與安全 API 設計

能把大多數基本攻擊風險大幅降低


上一篇
[DAY9]在你角落放個小強!
下一篇
[DAY11]貨物怎麼去運送?
系列文
資安菜鳥的30天挑戰12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言