채팅: 토큰 검증을 도배 제한보다 먼저 수행
미인증 요청이 남의 닉네임 전송 쿨다운을 소모해 정당한 유저를 429로 막을 수 있던 순서 결함 수정. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
이 커밋은 다음에 포함됨:
+4
-2
@@ -49,9 +49,8 @@ export async function sendChat(
|
|||||||
): Promise<string | null> {
|
): Promise<string | null> {
|
||||||
const text = rawText.replace(/\s+/g, " ").trim().slice(0, CHAT_MAX_LEN);
|
const text = rawText.replace(/\s+/g, " ").trim().slice(0, CHAT_MAX_LEN);
|
||||||
if (!text) return "empty";
|
if (!text) return "empty";
|
||||||
const now = Date.now();
|
|
||||||
if (now - (lastSent.get(nickname) ?? 0) < MIN_INTERVAL_MS) return "too_fast";
|
|
||||||
|
|
||||||
|
// 인증을 도배 제한보다 먼저 — 미인증 요청이 남의 닉네임 전송 쿨다운을 소모하지 못하도록
|
||||||
await ensureVillages();
|
await ensureVillages();
|
||||||
const owner = await db.query(
|
const owner = await db.query(
|
||||||
"SELECT 1 FROM villages WHERE nickname = $1 AND token = $2",
|
"SELECT 1 FROM villages WHERE nickname = $1 AND token = $2",
|
||||||
@@ -59,6 +58,9 @@ export async function sendChat(
|
|||||||
);
|
);
|
||||||
if (owner.rowCount === 0) return "auth";
|
if (owner.rowCount === 0) return "auth";
|
||||||
|
|
||||||
|
const now = Date.now();
|
||||||
|
if (now - (lastSent.get(nickname) ?? 0) < MIN_INTERVAL_MS) return "too_fast";
|
||||||
|
|
||||||
await ensureChatTable();
|
await ensureChatTable();
|
||||||
const r = await db.query(
|
const r = await db.query(
|
||||||
"INSERT INTO chat_messages (nickname, text) VALUES ($1, $2) RETURNING id, extract(epoch from created_at) * 1000 AS at",
|
"INSERT INTO chat_messages (nickname, text) VALUES ($1, $2) RETURNING id, extract(epoch from created_at) * 1000 AS at",
|
||||||
|
|||||||
새 이슈에서 참조
사용자 차단