Add anti-abuse: built-in captcha + garbage/duplicate guard
CI/CD / CI · dotnet build (push) Successful in 1m22s
CI/CD / Deploy · hamkadr (push) Successful in 1m36s

- CaptchaService: stateless data-protected math captcha (no Google reCAPTCHA — blocked in Iran), TTL + Persian-digit tolerant; on PostJob + PostShift
- SubmissionGuard: duplicate-position detection (facility+role+date/time for shifts, facility+role+title for jobs), spam/garbage screen on title/description, double-apply prevention
- InterestService: Apply events deduped so an applicant can't apply to the same listing twice
- Verified: wrong captcha rejected, correct publishes, duplicate + garbage blocked

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-04 06:35:17 +03:30
parent e2e26150cb
commit 0587e040d9
8 changed files with 210 additions and 12 deletions
@@ -77,6 +77,11 @@
<label>شرایط احراز</label>
<textarea name="Requirements" rows="2">@Model.Requirements</textarea>
</div>
<div class="filter-group">
<label>سؤال امنیتی: حاصل <strong>@Model.CaptchaQuestion</strong> چند می‌شود؟</label>
<input type="text" name="CaptchaAnswer" dir="ltr" inputmode="numeric" autocomplete="off" placeholder="پاسخ" />
<input type="hidden" name="CaptchaToken" value="@Model.CaptchaToken" />
</div>
<button type="submit" class="btn btn-accent btn-block btn-lg">انتشار موقعیت</button>
</form>
}