iT邦幫忙

2026 iThome 鐵人賽

DAY 27
0
Vibe Coding

上岸用AI,看小白如何從無到有的用Vibe Codeing開發遊戲系列 第 27 篇

Day 27:系統資安強化與滲透防禦 —— CORS 限制、Rate Limiting 限流與 Redis Nonce 防重放

  • 分享至 

  • xImage
  •  

歡迎來到第二十七天!遊戲上線後必須防止惡意腳本刷點數或嘗試滲透。


1. Ktor CORS 限定與 RateLimit 限流元件配置

// SecurityConfig.kt
fun Application.configureSecurity() {
    // 1. 限定跨域 CORS 僅允許 LINE LIFF 域名
    install(CORS) {
        allowHost("liff.line.me", schemes = listOf("https"))
        allowHost("game.yourstore.com", schemes = listOf("https"))
        allowHeader(HttpHeaders.ContentType)
        allowHeader(HttpHeaders.Authorization)
        allowHeader("X-Signature")
        allowMethod(HttpMethod.Post)
        allowMethod(HttpMethod.Get)
    }

    // 2. 限流 RateLimiting:單一 IP 每秒最多 10 次請求
    install(RateLimit) {
        register(RateLimitName("protected_api")) {
            rateLimer(limit = 10, refillPeriod = 1.seconds)
        }
    }
}

2. Timestamp + Nonce + Redis 防重放攻擊 (Replay Attack)

// AntiReplayService.kt
object AntiReplayService {
    fun validateNonce(nonce: String, timestamp: Long, redisClient: Jedis): Boolean {
        // 1. 檢查時間戳是否在 30 秒以內
        val currentTime = System.currentTimeMillis()
        if (Math.abs(currentTime - timestamp) > 30_000) {
            return false // 超過 30 秒直接判定無效
        }

        // 2. 檢查 Nonce 是否已存在於 Redis (SETNX 原子性操作)
        val result = redisClient.setnx("nonce:$nonce", "1")
        if (result == 0L) {
            return false // Nonce 已被使用過,攔截重放攻擊!
        }

        redisClient.expire("nonce:$nonce", 60) // 設定 60 秒後自動過期
        return true
    }
}

💡 鐵人賽小知識:API 防重放攻擊(Replay Attack)的 Nonce + Redis 設計

Tech Tip:黑客就算攔截不到你的 HMAC 金鑰,也可以把合法的加分請求「重複發送 1000 次」。透過 Nonce(一次性隨機字串)+ Redis 短暫快取,只要相同的 Nonce 再次出現,系統立刻封鎖,防禦力拉滿!



上一篇
Day 26:Cocos Creator 網頁發布與輕量化打包 —— Asset Bundle 分包、WebP 轉換與 CDN 快取
下一篇
Day 28:營運數據埋點與監控系統建置 —— PostHog/GA4 埋點與 Sentry 異常即時告警
系列文
上岸用AI,看小白如何從無到有的用Vibe Codeing開發遊戲 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言