2010-09-08 48 views
27

Tôi đang cố gắng bảo vệ ứng dụng (php và nhiều JS) khỏi CSRF.mã thông báo chống CSRF và Javascript

Tôi muốn sử dụng mã thông báo.

Rất nhiều thao tác được thực hiện với AJAX, vì vậy tôi phải chuyển mã thông báo trong Javascript. Nếu tôi muốn tạo 1 mã thông báo cho mỗi phiên hoặc mỗi lần tải trang, nó đơn giản - tôi tạo mã thông báo mới, đặt mã vào một nơi nào đó trong DOM và sau đó tìm mã đó bằng Javascript và gửi đến bên xử lý.

Nhưng nếu tôi muốn sử dụng mã thông báo mới cho mọi hoạt động thì sao? Tôi đã suy nghĩ về việc thực hiện cuộc gọi ajax để tạo lại mã thông báo và sau đó chuyển kết quả đến trang xử lý.

Điều này có làm tăng nguy cơ bảo mật không? Tôi đã suy nghĩ về việc thu hút người dùng đến trang với tập lệnh sẽ yêu cầu mã thông báo và sau đó sử dụng nó để thực hiện yêu cầu nhưng sau đó lại bị xuyên thủng miền Javascript bị cấm. Nó có thể được thực hiện bằng flash không?

Có thể một cách tiếp cận khác để bảo vệ cuộc gọi ajax từ CSRF?

Cảm ơn!

Trả lời

27

Có một số kỹ thuật, khi được sử dụng cùng nhau sẽ cung cấp sự bảo vệ CSRF đầy đủ.

Unique Mã

Một duy nhất, phiên cụ thẻ là đủ tốt cho hầu hết các ứng dụng. Chỉ cần đảm bảo rằng trang web của bạn không có bất kỳ lỗ hổng XSS nào, nếu không, bất kỳ loại kỹ thuật mã thông báo nào bạn sử dụng đều là một sự lãng phí.

Gọi AJAX để tạo lại mã thông báo là một ý tưởng tồi. Ai sẽ bảo vệ các vệ sĩ? Nếu AJAX gọi chính nó là dễ bị tấn công CSRF, nó loại đánh bại mục đích. Nhiều thẻ với AJAX nói chung là ý tưởng tồi. Nó buộc bạn phải sắp xếp lại các yêu cầu của mình tức là chỉ một yêu cầu AJAX được phép tại một thời điểm. Nếu bạn sẵn sàng sống với giới hạn đó, bạn có thể có mã thông báo piggyback cho cuộc gọi AJAX thứ hai để đáp lại yêu cầu đầu tiên.

Cá nhân, tôi nghĩ tốt hơn là xác thực lại người dùng cho các giao dịch quan trọng và bảo vệ các giao dịch còn lại bằng mã thông báo cụ thể theo phiên.

Tuỳ chỉnh tiêu đề HTTP

Bạn có thể thêm tiêu đề HTTP tùy chỉnh cho mỗi yêu cầu của bạn, và kiểm tra sự hiện diện của nó ở phía máy chủ. Khóa/giá trị thực sự không cần phải bí mật, máy chủ chỉ cần đảm bảo nó tồn tại trong yêu cầu đến.

Cách tiếp cận này đủ tốt để bảo vệ CSRF trong các phiên bản mới hơn của trình duyệt, tuy nhiên, có thể quá trình này hoạt động nếu người dùng của bạn có phiên bản cũ hơn cho Flash Player.

Kiểm tra Người giới thiệu

Kiểm tra tiêu đề giới thiệu cũng là tốt để bảo vệ CSRF trong các trình duyệt mới hơn. Không thể giả mạo tiêu đề này, mặc dù có thể có trong các phiên bản Flash cũ hơn. Vì vậy, trong khi nó không phải là dễ dàng, nó vẫn thêm một số bảo vệ.

Giải quyết Captcha

Buộc người sử dụng để giải quyết một captcha cũng có tác dụng chống CSRF. Bất tiện của nó là địa ngục, nhưng khá hiệu quả. Đây có lẽ là bảo vệ CSRF duy nhất hoạt động ngay cả khi bạn có lỗ hổng XSS.

Tóm tắt

  1. Sử dụng một phiên dựa dấu hiệu, nhưng lại xác thực cho các giao dịch có giá trị cao
  2. Thêm một tiêu đề http tùy chỉnh, và cũng có thể kiểm tra các giới thiệu. Cả hai đều không phải là tự mình, nhưng đừng làm tổn thương
+0

Thêm tiêu đề http tùy chỉnh làm phiền tôi, tôi chắc chắn bạn có thể giả mạo tiêu đề http tùy chỉnh bằng flash và kích hoạt yêu cầu đến máy chủ khác, miễn là phần tử tiêu đề không có trong danh sách đen. Tôi đã xem xét những thay đổi gần đây đối với flash (trong vòng 3 tháng qua) và họ đã cố định khả năng kiểm soát toàn bộ phân đoạn POST cần thiết cho các cuộc tấn công "tải lên tệp trang web chéo". Khác hơn là tôi nghĩ rằng thông tin tốt của nó và tôi đã cho bạn một +1. – rook

+0

Vâng, đây là danh sách đen, tất nhiên người giới thiệu không được phép, nhưng theo nghĩa đen mọi thứ khác là. http://kb2.adobe.com/cps/403/kb403030.html – rook

+1

@ The Rook - Re. Thêm tiêu đề tùy chỉnh - Xem http://www.adobe.com/devnet/flashplayer/articles/flash_player_10_security.pdf. Cụ thể, hãy xem phần có tiêu đề "Quyền gửi tiêu đề". Tôi báo 'Khi một tệp SWF muốn gửi tiêu đề HTTP tùy chỉnh ở bất kỳ đâu ngoài máy chủ lưu trữ riêng của nó, phải có tệp chính sách trên máy chủ HTTP mà yêu cầu đang được gửi'. Hãy nhớ http://stackoverflow.com/questions/2609834/gwt-rpc-does-it-do-enough-to-protect-against-csrf? Đó là nơi tôi đã học được thực tế này một cách khó khăn .. –

Các vấn đề liên quan