Skip to content

feat: address backend security audit findings#14

Merged
kemalcalak merged 13 commits into
mainfrom
security-hardening
Jun 11, 2026
Merged

feat: address backend security audit findings#14
kemalcalak merged 13 commits into
mainfrom
security-hardening

Conversation

@kemalcalak

Copy link
Copy Markdown
Owner

No description provided.

@kemalcalak kemalcalak self-assigned this Jun 10, 2026
@kemalcalak

Copy link
Copy Markdown
Owner Author

/review — 2 bulgu

1. Şifre değişiminde token iptali test kapsamı dışında

Dosya: app/tests/test_auth.py#L322-L385
Kategori: review-md-compliance · Önem: major

change_password_service artık başarılı değişimde mevcut access ve refresh token'ı blacklist'e atıyor (güvenlik garantisi: değişimden önce çalınan token anında geçersiz olur). Ancak test_change_password yalnızca eski/yeni parolayla login denemesini doğruluyor; değişimden önceki access/refresh token'ın gerçekten reddedildiğine dair hiçbir assertion yok. REVIEW.md §6.7 auth davranışlarında test eksikliğini major sayar.

REVIEW.md §6.7: "Test eksikliği non-critical endpoint için minor öneri, blocking değil. Auth/payment/silme'de major."

Öneri: Değişim öncesi access cookie'sini saklayıp, değişim sonrası o token'la korumalı bir uca yapılan isteğin 401 döndürdüğünü doğrulayan bir assertion ekle.


2. Bearer ile kimlik doğrulayan kullanıcının access token'ı şifre değişiminde iptal edilmiyor

Dosya: app/api/routes/auth.py#L262-L263
Kategori: bug · Önem: minor

change_password rotası token'ları yalnızca request.cookies.get(...) üzerinden okuyor. Repo Authorization: Bearer fallback'ini destekliyor (REVIEW.md §3.6); Bearer ile giriş yapan istemcide cookie None olur, dolayısıyla _revoke_token(None) no-op kalır ve çalınmış access token süresi dolana kadar geçerli kalır. Servisin docstring'indeki "immediately invalidates any token that may have been stolen before the change" garantisi bu istemciler için sağlanmıyor.

access_token=request.cookies.get("access_token"),

Öneri: Cookie yoksa Authorization başlığından da oku: access_token = request.cookies.get("access_token") or (request.headers.get("Authorization", "").removeprefix("Bearer ").strip() or None).


🤖 Generated with Claude Code

@kemalcalak kemalcalak merged commit db658bc into main Jun 11, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant