Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách ngăn chặn các cuộc tấn công AJAX tự động

Có vẻ như việc bạn phản đối việc để phiên này vẫn mở miễn là trình duyệt đang mở là vấn đề của các cuộc tấn công tự động. Thật không may, việc làm mới mã thông báo trên mỗi lần tải trang chỉ ngăn cản những kẻ tấn công nghiệp dư nhất.

Đầu tiên, tôi cho rằng chúng ta đang nói về các cuộc tấn công nhắm mục tiêu cụ thể vào trang web của bạn. (Nếu chúng ta đang nói về các bot chỉ đi lang thang và gửi các biểu mẫu khác nhau, điều này không những không ngăn được chúng mà còn có nhiều cách tốt hơn và dễ dàng hơn để làm như vậy.) Nếu đúng như vậy, và tôi đang nhắm mục tiêu trang web, đây là những gì bot của tôi sẽ làm:

  1. Tải trang biểu mẫu.
  2. Đọc mã thông báo trên trang biểu mẫu.
  3. Gửi yêu cầu tự động bằng mã thông báo đó.
  4. Chuyển đến bước 1.

(Hoặc, nếu tôi đã điều tra đủ hệ thống của bạn, tôi sẽ nhận ra rằng nếu tôi đưa tiêu đề "đây là AJAX" vào mỗi yêu cầu, tôi có thể giữ một mã thông báo mãi mãi. Hoặc tôi nhận ra rằng mã thông báo đó là ID phiên của tôi và gửi PHPSESSID của riêng tôi cookie.)

Phương pháp thay đổi mã thông báo trên mỗi lần tải trang này sẽ hoàn toàn không ngăn cản ai đó thực sự muốn để tấn công bạn tất cả những điều đó một cách tồi tệ. Do đó, vì mã thông báo không ảnh hưởng đến tự động hóa, hãy tập trung vào ảnh hưởng của nó đối với CSRF.

Từ góc độ chặn CSRF, việc tạo một mã thông báo và duy trì nó cho đến khi người dùng đóng trình duyệt dường như hoàn thành tất cả các mục tiêu. Các cuộc tấn công CSRF đơn giản bị đánh bại và người dùng có thể mở nhiều tab.

TL; DR:Làm mới mã thông báo một lần cho mỗi yêu cầu không tăng cường bảo mật. Tiếp tục sử dụng và thực hiện một mã thông báo mỗi phiên.

Tuy nhiên! Nếu bạn cực kỳ lo lắng về việc gửi biểu mẫu trùng lặp, do ngẫu nhiên hoặc do cách khác, vấn đề này vẫn có thể dễ dàng được giải quyết. Câu trả lời rất đơn giản:sử dụng hai mã thông báo cho hai công việc khác nhau.

Mã thông báo đầu tiên sẽ giữ nguyên cho đến khi phiên trình duyệt kết thúc. Mã thông báo này tồn tại để ngăn chặn các cuộc tấn công CSRF. Mọi yêu cầu từ người dùng này với mã thông báo này sẽ được chấp nhận.

Mã thông báo thứ hai sẽ được tạo duy nhất cho mỗi biểu mẫu được tải và sẽ được lưu trữ trong danh sách trong dữ liệu phiên của người dùng của mã thông báo biểu mẫu mở. Mã thông báo này là duy nhất và không hợp lệ khi nó được sử dụng. Các bài gửi từ người dùng này bằng mã thông báo này sẽ được chấp nhận một lần và chỉ một lần.

Bằng cách này, nếu tôi mở một tab cho Biểu mẫu A và một tab cho Biểu mẫu B, thì mỗi tab đều có mã thông báo chống CSRF cá nhân của tôi (CSRF được chăm sóc) và mã thông báo biểu mẫu một lần của tôi (xử lý gửi lại biểu mẫu). Cả hai vấn đề đều được giải quyết mà không ảnh hưởng xấu đến trải nghiệm người dùng.

Tất nhiên, bạn có thể quyết định rằng quá nhiều để triển khai cho một tính năng đơn giản như vậy. Tôi nghĩ nó là, dù sao. Bất kể, một giải pháp rắn luôn tồn tại nếu bạn muốn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cài đặt Mac và mở mysql bằng thiết bị đầu cuối

  2. Lỗi nghiêm trọng:Gọi đến hàm không xác định:MDB2_Driver_MYSQL ::getAll ()

  3. Có bảo mật trong Hệ thống API | PHP cuRL

  4. chèn vào thủ tục được lưu trữ với các tham số MYSQL không hoạt động

  5. Tại sao tôi gặp lỗi JPEG 42 khi nó được lưu trữ trong cơ sở dữ liệu?