歡迎來到第二十七天!遊戲上線後必須防止惡意腳本刷點數或嘗試滲透。
// 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)
}
}
}
// 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
}
}
Tech Tip:黑客就算攔截不到你的 HMAC 金鑰,也可以把合法的加分請求「重複發送 1000 次」。透過 Nonce(一次性隨機字串)+ Redis 短暫快取,只要相同的 Nonce 再次出現,系統立刻封鎖,防禦力拉滿!