1. <?php
  2. class FormSubmissionLimiter {
  3. private $limit;
  4. private $window_size;
  5. private $submissions = [];
  6. private $dry_run = false;
  7. public function __construct(int $limit, int $window_size, bool $dry_run = false) {
  8. $this->limit = $limit;
  9. $this->window_size = $window_size;
  10. $this->submissions = [];
  11. $this->dry_run = $dry_run;
  12. }
  13. public function isAllowed(string $form_id): bool {
  14. $now = time();
  15. // Remove submissions outside the window
  16. $this->submissions = array_filter($this->submissions, function ($submission) use ($now, $window_size) {
  17. return $now - $submission['timestamp'] < $window_size;
  18. });
  19. // Check if the limit is exceeded
  20. if (count($this->submissions) >= $this->limit) {
  21. if ($this->dry_run) {
  22. error_log("Dry run: Submission limit exceeded for form $form_id.");
  23. return false; // Dry run: don't actually block
  24. } else {
  25. throw new Exception("Submission limit exceeded for form $form_id.");
  26. }
  27. }
  28. return true;
  29. }
  30. public function submit(string $form_id, array $data): bool {
  31. if (!$this->isAllowed($form_id)) {
  32. return false;
  33. }
  34. // Log the submission
  35. $this->submissions[] = [
  36. 'timestamp' => time(),
  37. 'data' => $data,
  38. ];
  39. return true;
  40. }
  41. public function reset() {
  42. $this->submissions = [];
  43. }
  44. }
  45. // Example Usage (for testing - remove in production)
  46. /*
  47. $limiter = new FormSubmissionLimiter(5, 60); // Limit 5 submissions in 60 seconds
  48. try {
  49. for ($i = 0; $i < 10; $i++) {
  50. if ($limiter->isAllowed('my_form')) {
  51. $limiter->submit('my_form', ['field1' => 'value' . $i, 'field2' => 'data' . $i]);
  52. echo "Submission successful for form my_form\n";
  53. } else {
  54. echo "Submission blocked for form my_form\n";
  55. }
  56. }
  57. } catch (Exception $e) {
  58. echo "Error: " . $e->getMessage() . "\n";
  59. }
  60. $limiter->reset();
  61. */
  62. ?>

Add your comment