2013-02-02 14 views
5

के भीतर अनुरोध प्राप्त करने की रक्षा करना मैं विशिष्ट जीईटी अनुरोध की रक्षा कैसे करूं (उदाहरण के लिए: ^api/...)?Django वेब एप्लिकेशन

मैं इस दृश्य (एपीआई कॉल) को केवल अपने Django वेब एप्लिकेशन के लिए उपलब्ध करना चाहता हूं।

इसे केवल Django वेब एप्लिकेशन द्वारा ही बुलाया जाना चाहिए, सीधे नहीं।

क्या यह सीएसआरएफ मध्य-बर्तन द्वारा उत्पन्न हैश कुंजी का उपयोग करने के लिए एक अच्छा अभ्यास है? क्या कोई बेहतर दृष्टिकोण है?

+0

आप इसे कैसे कॉल करने जा रहे हैं? एक अजाक्स कॉल? या सिर्फ अपने स्वयं के ऐप के लिए एक वेब सेवा के रूप में आंतरिक रूप से। – santiagobasulto

+0

@ सैंटियागोबासुलटो यह एक अजाक्स कॉल है, मैं एपीआई को सार्वजनिक रूप से उपलब्ध नहीं करना चाहता हूं। आइडिया केवल इस एप्लिकेशन का उपयोग वेब एप्लिकेशन के माध्यम से करना है जिसे मैं बना रहा हूं। – abhiomkar

+0

मैं इस बारे में उत्सुक हूं और सोच रहा हूं कि इसे कवर करने के लिए सीएसआरएफ का विस्तार करना आम बात क्यों नहीं है? या कम से कम यह django दस्तावेज़ों में प्रलेखित प्रतीत नहीं होता है। ऐसा लगता है कि सीएसआरएफ सुरक्षा को ट्रिगर करने के लिए सभी AJAX कॉल को POST पर स्विच किया जा सकता है लेकिन यह बहुत हैकी लगता है। – MichaelJones

उत्तर

0

इन replies देखें, ऐसा लगता है कि वे इसी समस्या से गुज़र चुके हैं। मैं एक सजावट लिखूंगा जो जांचता है कि request.META['REMOTE_ADDR'] आपके स्थानीय पते जैसा ही है।

2

मुझे डर है कि इसे प्राप्त करने के लिए कोई विश्वसनीय तरीका नहीं है। सबसे अच्छा तरीका मैं सोच सकता हूं, आपके जावास्क्रिप्ट क्लाइंट में किसी प्रकार की निजी कुंजी उत्पन्न कर रहा है, और कोड को कम कर रहा है। इससे आपके तरीकों का उपयोग करने के लिए "एक अटकर" के लिए मुश्किल हो जाएगी। हो सकता है कि एचएमएसी का उपयोग करें, या ऐसा कुछ।

एक उदाहरण। आप निम्नलिखित कॉल करना चाहते हैं: /api/users/1/vote_up। आप अपनी निजी कुंजी उत्पन्न करने के लिए कुछ कोड हो सकता है:

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

generatePassphraseObfuscated समारोह कुंजी है। आपको इसे दोहराने के लिए वास्तव में कठिन बनाना होगा। साथ ही, आप इसे प्रत्येक अनुरोध में बदल सकते हैं और यह पता लगाने के लिए एक कुकी जोड़ सकते हैं कि आपने कौन सा "संस्करण" भेजा है। उदाहरण के लिए, आपके पास दो संस्करण हो सकते हैं:

function generatePassphraseObfuscated(){ 
    return 1; 
} 

function generatePassphraseObfuscated(){ 
    return 2; 
} 

और उन्हें यादृच्छिक रूप से सेवा दें, और इसे कुकी के साथ पहचानें। तो आप जानते हैं कि अपने django दृश्य में किस का उपयोग करना है।

फिर से, यह विश्वसनीय नहीं है, आप जो करना चाहते हैं उसे करने का कोई मूर्ख तरीका नहीं है। यह अन्य लोगों के प्रतिकृति के लिए बदसूरत बनाने के लिए सिर्फ एक मूर्ख तरीका है।

संबंधित मुद्दे