2013-02-02 26 views
5

Làm cách nào để bảo vệ yêu cầu GET cụ thể (ví dụ: ^api/...)?Bảo vệ yêu cầu GET trong ứng dụng web Django

Tôi muốn thực hiện chế độ xem này (gọi API) chỉ có sẵn cho ứng dụng web Django của tôi.

Chỉ nên gọi bằng ứng dụng web Django chứ không phải trực tiếp.

Thực tiễn tốt để sử dụng khóa băm được tạo bởi CSRF Middle-ware? Có cách tiếp cận nào tốt hơn không?

+0

bạn sẽ gọi nó như thế nào? Một cuộc gọi ajax? Hoặc chỉ trong nội bộ, như một dịch vụ web cho ứng dụng của riêng bạn. – santiagobasulto

+0

@santiagobasulto Đây là cuộc gọi Ajax, tôi không muốn cung cấp API cho công chúng. Ý tưởng là chỉ sử dụng API này thông qua Ứng dụng web mà tôi đang xây dựng. – abhiomkar

+0

Tôi rất tò mò về điều này và tự hỏi tại sao nó không phổ biến để mở rộng CSRF để trang trải điều này? Hoặc ít nhất nó dường như không được ghi chép trong tài liệu django. Có vẻ như tất cả các cuộc gọi AJAX đều có thể được chuyển sang POST để kích hoạt tính năng bảo vệ CSRF nhưng điều đó có vẻ khá khó khăn. – MichaelJones

Trả lời

0

Kiểm tra các replies này, dường như chúng đã trải qua cùng một vấn đề này. Tôi muốn viết một trang trí để kiểm tra nếu request.META['REMOTE_ADDR'] giống với địa chỉ địa phương của bạn.

2

Tôi e rằng không có cách nào đáng tin cậy để đạt được điều này. Cách tốt nhất tôi có thể nghĩ đến, là tạo ra một số loại khóa cá nhân trong ứng dụng javascript của bạn, và ofuscate mã. Điều đó sẽ gây khó khăn cho "một người làm quen" để sử dụng các phương pháp của bạn. Có thể sử dụng HMAC, hoặc một cái gì đó như thế.

Ví dụ. Bạn muốn thực hiện cuộc gọi sau: /api/users/1/vote_up. Bạn có thể có một số mã để tạo khóa riêng của mình:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha256.js"> 

var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, generatePassphraseObfuscated()); 
hmac.update("/api/users/1/vote_up"); 
var hash = hmac.finalize(); 
$.ajax(
    /api/users/1/vote_up, 
    {hash: hash} 
) 
</script> 

Chức năng generatePassphraseObfuscated là chìa khóa. Bạn cần phải làm cho nó thực sự khó khăn để nhân rộng. Ngoài ra, bạn có thể thay đổi nó trong mọi yêu cầu và thêm cookie để xác định "phiên bản" nào bạn đã gửi. Ví dụ: bạn có thể có hai phiên bản:

function generatePassphraseObfuscated(){ 
    return 1; 
} 

function generatePassphraseObfuscated(){ 
    return 2; 
} 

Và phân phối chúng một cách ngẫu nhiên và xác định cookie bằng cookie. Vì vậy, bạn biết được sử dụng trong chế độ xem django của bạn.

Một lần nữa, nó không đáng tin cậy, không có cách nào dễ dàng để làm những gì bạn muốn làm. Nó chỉ là một cách ngớ ngẩn để làm cho nó xấu xí cho những người khác để tái tạo.

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