Ngăn chặn spam insert mysql

Hi mn, hiện tại em đang muốn 1 người dùng khi submit form thì phải đợi insert xong rồi mới được submit tiếp. 1 ngày chỉ được submit tối đa 2 lần. nhưng khi e test thử viết 1 file php curl submit form liên tục thì nó sẽ insert rất nhiều 1 lần luôn. vậy có cách nào để ngăn chặn việc này không nhỉ, ngoài cách lưu lại ip/username và thời gian gần nhất submit (e cũng đã thử cách này nhưng do curl request quá nhanh, nó vẫn insert dc 5-6 cái ạ). e cảm ơn

1 người dùng của bạn là người dùng chung chung, là khách viếng thăm trang hay là người dùng phải tạo tài khoản, login rồi mới submit?

(Mình cho rằng những điều bạn nói là có cái gì đó vô lý khi bạn dùng hoặc gặp CAPTCHA của Google trong thực tế rất nhiều, bạn thử CURL những trang có dùng Google CAPTCHA xem bạn có vượt được?)

Nếu là bạn mở cho người dùng chung chung submit tự do thì bạn không có cách nào để chặn vì bạn không có nhận dạng họ là ai, địa chỉ IP chỉ là một yếu tố không đáng tin lắm mà bạn có thể căn cứ được nếu họ dùng CURL như bạn đề cập và họ có trong tay nhiều địa chỉ IP.

Vậy thì cách để bạn hạn chế người dùng đăng lung tung thì bạn phải biết họ là ai thông qua việc xác thực hoặc tìm ra cơ chế biết họ là ai nếu cho phép khách submit.

Đừng nghĩ lung tung nó trở nên mơ hồ, bạn dùng bài toán ngoài đời xem người ta xếp hàng vào để bạn giải quyết gì đó (ví dụ bạn phát bánh Trung Thu cho họ) mà mỗi người chỉ được 1 lần. Bạn làm thế nào để nhận dạng? Từ cái thực tế đó bạn áp dụng cho Submitter của bạn.

Bài toán giờ bạn cần giải quyết “làm sao biết ông submit là ông nào”. Dừng ở đây đã, tự tra cứu để tìm cách giải quyết rồi mới tiếp.

Khi bạn biết chính xác họ là ai thì việc đơn giản là “ông đã nhận tiền hỗ trợ Covid rồi, vác mặt tới ai cho ông nhận nữa, tham vừa thôi, ông về đi”.

Gợi ý cách tiếp cận vấn đề: khi submit lên thì khi tiếp nhận thông tin bạn luôn yêu cầu một mẩu thông tin kèm theo để nhận diện. Ví dụ POST lên số điện thoại, thì kèm theo một mã (bạn tự tạo khi lập trình) nhận dạng, mã này bạn lưu vào session.

Mỗi khi nhận submit, kiểm tra xem nếu không tồn tại session thì tiếp nhận lần đầu, tạo ngay session để nhận dạng phiên submit vừa rồi. Nếu đã tồn tại session, kiểm tra xem quota đạt chưa, nếu đạt thì không chạy câu lệnh INSERT. Căn cứ vào session, kết hợp lưu lại trong DB sẽ biết trong ngày submit đủ chưa, cách nhau bao nhiêu giờ.

7 Likes

Nếu đó là form nằm ở public, thì cách thông dụng hiệu quả nhất ở thời điểm hiện tại là Capcha của Google

===

Hello,
Xin lỗi bạn là mình đọc lướt qua nhanh, nên bỏ mất cái đoạn bạn muốn giới hạn mỗi người chỉ được submit form tối đa 2 lần.

Theo mình thì có 2 bước chính:
#1. là phải xác định user (phân biệt ai là ai)
#2. dùng biện pháp giới hạn

Cái #2 thì dễ rồi, chủ yếu là cái #1 thôi.
Bạn có thể định danh (identify) user bằng IP, đây là cách thông dụng và đơn giản nhất cho người mới bắt đầu (tất nhien sẽ có thêm bài toán là user xài fake IP, proxy…, nhưng đó là một vấn đề khác, cứ làm cho nó chạy được cái đã)

Còn chỉ có registered user được phép submit form thì coi như #1 khỏi phải làm

Sau khi identify User đó là ai rồi, thì lưu và check thông tin ở database mỗi khi insert là được.

Cách đơn giản nhất để làm cái #2, là:

  • ấn định thời gian 24 tiếng, ví dụ từ 00:00 cho tới 23:59, mỗi khi user submit thì kiểm tra trong khung giờ này coi đã submit bao nhiêu lần rồi.
  • cách khách là giới hạn tốc độ submit, tức khoảng thời gian chờ giữa 2 lần submit. Ví dụ mỗi khi user submit form, thì kiểm tra coi lần truóc đó gần nhất là cách đây bao lâu
    Bạn cũng có thể kết hợp cả 2 cách này

Bạn tìm hiểu thêm với keyword “prevent API abuse” nha

5 Likes

Mình nghĩ cách đơn giản nhất là yêu cầu người dùng xác thực mail trước rồi mới cho submit
Hoặc nhập mã OTP từ phone là khỏi spam lun ! Hoặc kết hợp cả mail lẫn phone
ReCaptcha với Hcaptcha k ăn thua lắm vì người dùng có thể xài 2Captcha hoặc Capmonters để pass
Nếu người dùng của bạn cần pass Captcha thì mình khuyến khích dùng Capmonters vì chi phí rẻ hơn …Hoặc load extension từ trình duyệt thì free lun …Hahaha…

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?