首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Rails 安全指南(三):重定向陷阱與檔案上傳下載安全

     編輯:Java 相關知識

第 4 章:重定向與檔案操作安全

4.1 重定向風險

用戶可控重定向 URL 是被低估的攻擊向量:

  • 釣魚攻擊:合法域名起始,參數隱藏惡意目標 https://app.com/redirect?to=evil.com
  • Self-contained XSS:Firefox/Opera 支援 data: 協議 data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K(Base64 編碼 ``)

危險範例

def legacy
  redirect_to(params.update(:action => 'main'))
end
# 攻擊: /legacy?param1=xy&host=evil.com
# params[:host] 被 redirect_to 採納 → 重定向至惡意站點

對策

  • 白名單參數:redirect_to(:action => 'main', :id => params[:id])
  • 重定向目標驗證:正則/白名單檢查 URL
  • 禁止用戶提供重定向目標(或僅允許相對路徑)

4.2 檔案上傳安全

檔名過濾

攻擊者上傳 ../../../etc/passwd 覆蓋系統檔案。勿用黑名單移除 ../(雙重編碼繞過:..// → ../)。

# attachment_fu 白名單做法
def sanitize_filename(filename)
  filename.strip!
  name = filename.gsub(/^.*(\\|\/)/, '')  # 只取檔名
  name.gsub!(/[^\w\.\-]/, '_')            # 非英數/底線/點/連字號 → 底線
  name
end

DoS 風險:同步處理

大量並發上傳佔用資源 → 服務癱瘓。對策:非同步處理 —— 儲存檔案 → 資料庫排程 → 背景 Worker 處理(縮圖、轉碼等)。

4.3 上傳檔案中的可執行代碼

若 public/ 為 Apache DocumentRoot,上傳 shell.cgi 經由 URL 直接執行。對策:

  • 上傳目錄置於 public/ 外部
  • Apache 設定 SetHandler default-handler 強制靜態檔案模式
  • 驗證 Content-Type、副檔名、魔數

4.4 檔案下載安全

# 危險
send_file('/var/www/uploads/' + params[:filename])
# 攻擊: ../../../etc/passwd

# 安全:路徑限制在允許目錄內
basename = File.expand_path(File.join(File.dirname(__FILE__), '../../files'))
filename = File.expand_path(File.join(basename, @file.public_filename))
raise "Invalid path" unless filename.start_with?(basename)
send_file filename, :disposition => 'inline'

替代方案:資料庫儲存檔名/路徑,完全避免路徑遍歷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved