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.
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
@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
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