জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক সিএসআরএফ সরান


111

আমি জানি যে জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক সম্পর্কিত উত্তর রয়েছে তবে আমি আমার সমস্যার সমাধান খুঁজে পাইনি।

আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যার প্রমাণীকরণ এবং কিছু কার্যকারিতা রয়েছে। আমি এটিতে একটি নতুন অ্যাপ যুক্ত করেছি, যা জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক ব্যবহার করে। আমি কেবল এই অ্যাপটিতে লাইব্রেরিটি ব্যবহার করতে চাই। এছাড়াও আমি পোষ্ট অনুরোধ করতে চাই এবং আমি সর্বদা এই প্রতিক্রিয়াটি গ্রহণ করি:

{
    "detail": "CSRF Failed: CSRF token missing or incorrect."
}

আমার কাছে নিম্নলিখিত কোড রয়েছে:

# urls.py
from django.conf.urls import patterns, url


urlpatterns = patterns(
    'api.views',
    url(r'^object/$', views.Object.as_view()),
)

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt


class Object(APIView):

    @csrf_exempt
    def post(self, request, format=None):
        return Response({'received data': request.data})

আমি বর্তমান অ্যাপ্লিকেশনটিকে প্রভাবিত না করেই API যুক্ত করতে চাই। সুতরাং আমার প্রশ্নগুলি হল আমি কীভাবে কেবল এই অ্যাপের জন্য সিএসআরএফ অক্ষম করতে পারি?


আপনি ইতিমধ্যে @csrf_exemitted টোকেন ব্যবহার করছেন। আপনি এটি পুরো দৃষ্টিতে ব্যবহার করতে পারেন। কাজ করা উচিত নয়?
মুকেশ

না, আমি এখনও বিশদটি পেয়েছি: "সিএসআরএফ ব্যর্থ: সিএসআরএফ টোকেন অনুপস্থিত বা ভুল rect" বার্তা। আমি উত্তরগুলি থেকে শেষ করেছিলাম যে আমার ডিফল্ট প্রমাণীকরণটি অপসারণ করা উচিত।
আইরিন টেক্সাস

1
টোকেন প্রমাণীকরণ ব্যবহার করে আমি খুব একই রকম পরিস্থিতিতে পড়ছিলাম। একই নৌকায় অন্য কারও জন্য: স্ট্যাকওভারফ্লো
.com/ জিজ্ঞাসা

উত্তর:


218

কেন এই ত্রুটি ঘটছে?

SessionAuthenticationডিআরএফ দ্বারা ব্যবহৃত ডিফল্ট স্কিমের কারণে এটি ঘটছে । ডিআরএফ এর SessionAuthenticationপ্রমাণীকরণের জন্য জ্যাঙ্গোর সেশন ফ্রেমওয়ার্ক ব্যবহার করে যার জন্য সিএসআরএফ চেক করা দরকার।

আপনি যখন authentication_classesআপনার ভিউ / ভিউসেটে কোনও সংজ্ঞা দেন না , তখন ডিআরএফ ডিফল্ট হিসাবে এই প্রমাণীকরণ শ্রেণি ব্যবহার করে।

'DEFAULT_AUTHENTICATION_CLASSES'= (
    'rest_framework.authentication.SessionAuthentication',
    'rest_framework.authentication.BasicAuthentication'
),

যেহেতু ডিআরএফ একই ধরণের সেশন এবং অ-অধিবেশন ভিত্তিক প্রমাণীকরণ উভয়কেই সমর্থন করা দরকার, এটি কেবলমাত্র অনুমোদনপ্রাপ্ত ব্যবহারকারীদের জন্য সিএসআরএফ চেক প্রয়োগ করে। এর অর্থ হ'ল কেবলমাত্র অনুমোদনিত অনুরোধগুলির জন্য সিএসআরএফ টোকেন প্রয়োজন এবং বেনাম অনুরোধগুলি সিএসআরএফ টোকেন ছাড়াই প্রেরণ করা যেতে পারে।

আপনি যদি সেশনআউটথ্যান্টিকেশন সহ একটি এজেএক্স শৈলী এপিআই ব্যবহার করে থাকেন তবে আপনাকে PUT, PATCH, POST or DELETEঅনুরোধের মতো কোনও "অনিরাপদ" এইচটিটিপি পদ্ধতি কলগুলির জন্য একটি বৈধ সিএসআরএফ টোকেন অন্তর্ভুক্ত করতে হবে ।

তাহলে কি করব?

এখন সিএসআরএফ চেক অক্ষম করতে, আপনি একটি কাস্টম প্রমাণীকরণ শ্রেণি তৈরি করতে পারেন CsrfExemptSessionAuthenticationযা ডিফল্ট SessionAuthenticationশ্রেণি থেকে প্রসারিত । এই প্রমাণীকরণ শ্রেণিতে, আমরা enforce_csrf()প্রকৃতটির ভিতরে যা চেক ছিল তা ওভাররাইড করব SessionAuthentication

from rest_framework.authentication import SessionAuthentication, BasicAuthentication 

class CsrfExemptSessionAuthentication(SessionAuthentication):

    def enforce_csrf(self, request):
        return  # To not perform the csrf check previously happening

আপনার দৃষ্টিতে, তারপরে আপনি authentication_classesএটিকে সংজ্ঞায়িত করতে পারেন :

authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication)

এটিতে সিএসআরএফ ত্রুটিটি পরিচালনা করা উচিত।


10
দুঃখিত, আমি পয়েন্টটি মিস করেছি, তবে কি সিএসআরএফ সুরক্ষা বাইপাস করা / অক্ষম করা কোনও সুরক্ষা ঝুঁকি নয়?
পাওলো

1
@ পাওলো ওপিকে একটি নির্দিষ্ট এপিআইয়ের সিএসআরএফ প্রমাণীকরণ অক্ষম করার দরকার ছিল। তবে হ্যাঁ, সিএসআরএফ সুরক্ষা অক্ষম করা এটির একটি সুরক্ষা ঝুঁকি। যদি কোনও নির্দিষ্ট ব্যবহারের ক্ষেত্রে সেশনের প্রমাণীকরণ অক্ষম করতে হয় তবে তিনি এই সমাধানটি ব্যবহার করতে পারেন।
রাহুল গুপ্তা

আরে @ রাহুলগুপ্ত - ভিউতে সিএসআরএফ_ এক্সিডিপ্ট ডেকোরিটারের জন্য চেক করার কোনও উপায় নেই এবং কেবলমাত্র সেই দর্শনগুলির জন্য কেবল প্রয়োগ_সিএসআরএফ অক্ষম করুন?
অভিষেক

@Abhishek হতে পারে আপনি নীচের খুঁজছেন উত্তর bixente57 দ্বারা। এটি কাস্টম দর্শনগুলির জন্য সিএসআরএফ অক্ষম করে।
রাহুল গুপ্ত

1
@ রাহুলগুপ্ত আপনি যদি প্রয়োগ_সিএসআরফ করতে চান না, তবে সবচেয়ে ভাল উপায় কী হবে?
গেমার

21

সহজ সমাধান:

ভিউ.পি-তে, ব্রেসেস সিএসআরএফ এক্সিম্পট মিক্সিন এবং প্রমাণীকরণ_ক্লাসগুলি ব্যবহার করুন:

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt
from braces.views import CsrfExemptMixin


class Object(CsrfExemptMixin, APIView):
    authentication_classes = []

    def post(self, request, format=None):
        return Response({'received data': request.data})

1
ধন্যবাদ, এটি এই সমস্যার সহজতম সমাধান। আমার এপিআই oauth2_provider এবং টোকেন ব্যবহার করে।
ডেটা টিটি

1
আহহহ মানুষ। আমার কাছে সিএসআরএফএক্সেম্প্টিমিক্সিন ছিল, তবে প্রমাণীকরণ_চক্র = =] নেই। ধন্যবাদ!
ম্যাজিক্ল্যাম্প

এফওয়াইআই, প্রমাণীকরণ_ চশমা লাইনটি মূল বলে মনে হচ্ছে। আমার সাথে সিএসআরএফএক্সেম্প্টিমিক্সিন ছাড়া বা ছাড়া একই কাজ করে।
দাশদ্রুম

14

Url.py পরিবর্তন করুন

আপনি যদি urls.py এ আপনার রুটগুলি পরিচালনা করেন তবে সিএসআরএফ যাচাইকরণ মিডলওয়্যার থেকে বাদ দেওয়ার জন্য আপনি আপনার পছন্দসই রুটগুলি csrf_exemitted () দিয়ে মোড়তে পারেন।

from django.conf.urls import patterns, url
    from django.views.decorators.csrf import csrf_exempt
    import views

urlpatterns = patterns('',
    url(r'^object/$', csrf_exempt(views.ObjectView.as_view())),
    ...
)

বিকল্প হিসাবে, একটি সজ্জাকার হিসাবে কিছু তাদের @Crf_exemitted সজ্জা ব্যবহারকারীর ব্যবহারের জন্য আরও উপযুক্ত মনে করতে পারে

এই ক্ষেত্রে,

from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

কাজ শেষ করা উচিত!


কোডটির কিছু ব্যাখ্যা আরও ভাল উত্তর দেবে।
শেভিবো 17

@ চেভিবো সত্যই দুঃখিত, আমি সম্প্রদায়ে আসলেই নতুন। কিছুটা দৃশ্যের জন্য সিএসআরএফ অক্ষম করতে আসলে এটি জ্যাঙ্গোর এক ডেকোরেটর
সৈয়দ ফয়জান

এটি পাইথন 3 এবং জ্যাঙ্গো 1.11 দিয়ে আমার জন্য কাজ করেছে এবং সবচেয়ে সহজ বলে মনে হচ্ছে!
ম্যাডনেস

12

যারা সহায়ক উত্তর খুঁজে পান নি তাদের জন্য। হ্যাঁ ডিআরএফ স্বয়ংক্রিয়ভাবে সিএসআরএফ সুরক্ষা অপসারণ করে যদি আপনি SessionAuthenticationপ্রমাণীকরণ শ্রেণি ব্যবহার না করেন , উদাহরণস্বরূপ, অনেক বিকাশকারী কেবল জেডব্লিউটি ব্যবহার করেন:

'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),

তবে সমস্যাটি CSRF not setঅন্য কোনও কারণ থেকে ঘটতে পারে, কারণ আপনি যেভাবে দেখছেন তাতে সঠিকভাবে আপনাকে যুক্ত করা হয়নি:

url(r'^api/signup/', CreateUserView),  # <= error! DRF cant remove CSRF because it is not as_view that does it!

পরিবর্তে

url(r'^api/signup/', CreateUserView.as_view()),

8

আমি উপরের কয়েকটি উত্তর চেষ্টা করেছিলাম এবং মনে করেছি একটি পৃথক শ্রেণি তৈরি করা একটু ওভারবোর্ড।

রেফারেন্সের জন্য, ব্যবহারকারী রেজিস্ট্রেশনের জন্য কোনও শ্রেণি ভিত্তিক ভিউ পদ্ধতিতে ফাংশন ভিত্তিক ভিউ পদ্ধতিটি আপডেট করার চেষ্টা করার সময় আমি এই সমস্যার মধ্যে পড়েছিলাম।

শ্রেণিভিত্তিক-দৃষ্টিভঙ্গি (সিবিভি) এবং জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক (ডিআরএফ) ব্যবহার করার সময়, অ্যাপিভিউ ক্লাস থেকে উত্তরাধিকারী করুন এবং অনুমতি_শ্রেণী এবং প্রমাণীকরণ_ক্লাসগুলি একটি খালি টিপলে সেট করুন। নীচে একটি উদাহরণ খুঁজুন।

class UserRegistrationView(APIView):

    permission_classes = ()
    authentication_classes = ()

    def post(self, request, *args, **kwargs):

        # rest of your code here

7

আপনি যদি সেশন ভিত্তিক প্রমাণীকরণ ব্যবহার করতে না চান, আপনি Session AuthenticationREST_AUTHENTICATION_CLASSES থেকে অপসারণ করতে পারেন এবং এটি স্বয়ংক্রিয়ভাবে সমস্ত সিএসআরএফ ভিত্তিক সমস্যাগুলি সরিয়ে ফেলবে। তবে সেক্ষেত্রে ব্রাউজেবল এপিএস কাজ নাও করতে পারে।

এই ত্রুটিটি সেশন প্রমাণীকরণের সাথে আসা উচিত নয়। আপনার এপিআইএসের জন্য আপনার টোকেনআউথেন্টিফিকেশন এর মতো কাস্টম প্রমাণীকরণ ব্যবহার করা উচিত Accept:application/jsonএবং Content-Type:application/jsonপ্রমাণীকরণ টোকেন সহ আপনার অনুরোধগুলিতে প্রেরণ এবং (আপনি জসন ব্যবহার করছেন) সরবরাহ করার বিষয়টি নিশ্চিত করা উচিত ।


4

ডিফল্ট সেশন প্রমাণীকরণ রোধ করতে আপনাকে এটি যুক্ত করতে হবে: (সেটিংস.পি)

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated', 
    )
}

তারপরে: (view.py)

from rest_framework.permissions import AllowAny

class Abc(APIView):
    permission_classes = (AllowAny,)

    def ...():

3

আমিও একই সমস্যায় পড়েছি। আমি এই রেফারেন্সটি অনুসরণ করেছি এবং এটি কার্যকর হয়েছে। সমাধান একটি মিডওয়্যার তৈরি করা হয়

আপনার অ্যাপ্লিকেশনগুলির একটিতে ডিসিয়েবল.পি ফাইল যুক্ত করুন (আমার ক্ষেত্রে এটি 'মাই্যাপ' হয়)

class DisableCSRF(object):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)

এবং মিডলিভওয়্যারটিকে MIDDLEWARE_CLASSES এ যুক্ত করুন

MIDDLEWARE_CLASSES = (
myapp.disable.DisableCSRF,
)

4
এটি আপনার সম্পূর্ণ ওয়েবসাইটকে সিএসআরএফ আক্রমণে প্রবণ করে তুলবে। en.wikipedia.org/wiki/Cross-site_request_forgery
Jeanno

1

আপনি যদি আপনার অ্যাপ্লিকেশনটির জন্য একচেটিয়া ভার্চুয়াল পরিবেশ ব্যবহার করছেন তবে আপনি কার্যকরভাবে অন্য কোনও অ্যাপ্লিকেশন ছাড়াই নীচের পদ্ধতিটি ব্যবহার করতে পারেন।

আপনি যা পর্যবেক্ষণ rest_framework/authentication.pyকরেছেন তা ঘটে কারণ ক্লাসের authenticateপদ্ধতিতে এই কোড রয়েছে SessionAuthentication:

self.enforce_csrf(request)

আপনি শ্রেণিবদ্ধ Requestসম্পত্তি বলতে ডাকে ক্লাসটি সংশোধন করতে পারেন csrf_exemptএবং Trueসিএসআরএফ চেক না চাইলে আপনার নিজের ভিউ ক্লাসের মধ্যে এটিকে আরম্ভ করতে পারেন। উদাহরণ স্বরূপ:

এরপরে উপরের কোডটি নিম্নরূপে সংশোধন করুন:

if not request.csrf_exempt:
    self.enforce_csrf(request)

Requestশ্রেণিতে এটি করতে হবে এমন কিছু সম্পর্কিত পরিবর্তন রয়েছে । একটি সম্পূর্ণ বাস্তবায়ন এখানে উপলব্ধ (সম্পূর্ণ বিবরণ সহ): https://github.com/piaxis/django-rest-framework/commit/1bdb872bac5345202e2f58728d0e7fad70dfd7ed


1

আমার সমাধানটি ধাক্কা দেখানো হয়েছে। শুধু আমার ক্লাস সাজাইয়া।

from django.views.decorators.csrf import csrf_exempt
@method_decorator(csrf_exempt, name='dispatch')
@method_decorator(basic_auth_required(
    target_test=lambda request: not request.user.is_authenticated
), name='dispatch')
class GenPedigreeView(View):
    pass

1
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
অ্যালেক্স রিয়াবভ

0

REST এপিআই পোস্টগুলি ব্যবহার করার সময়, এক্স-সিএসআরএফটোকেন অনুরোধ শিরোনামের অনুপস্থিতি সেই ত্রুটির কারণ হতে পারে। জাজানো ডক্স জেএস থেকে সিএসআরএফ টোকেন মান পেতে এবং সেট করতে একটি নমুনা কোড সরবরাহ করে।

উপরের উত্তরে নির্দেশিত হিসাবে, সেশনআরথেন্টিকেশন ব্যবহার করা হলে সিএসআরএফ চেক হয়। টোকেনআউথেনটিকেশন ব্যবহার করার জন্য আরেকটি পদ্ধতি হ'ল, তবে মনে রাখবেন যে এটি REST_FRAMEWORK সেটিংয়ের DEFAULT_AUTHENTICATION_CLASSES এর তালিকায় প্রথমে রাখা উচিত।


-1

এটি কোনও ডিএনএস রিবন্ডিং আক্রমণের সময়ও সমস্যা হতে পারে ।

ডিএনএস পরিবর্তনের মধ্যে এটিও একটি কারণ হতে পারে। ডিএনএস সম্পূর্ণরূপে ফ্লাশ না হওয়া পর্যন্ত অপেক্ষা করা এটি ডিএনএস সমস্যা / পরিবর্তনের আগে কাজ করে থাকলে তা সমাধান করবে resolve


উপরের প্রশ্নটির সাথে এটার কী সম্পর্ক?
বোটকোডার

এর অর্থ হ'ল আপনি যখন ডিএনএস স্যুইচ করছেন এবং এটি পুরোপুরি প্রচারিত হয়নি তখন এই সমস্যা দেখা দিতে পারে। অ্যাপটির যদি জ্যাঙ্গো সাধারণ সেশনের চেয়ে আলাদা রাউটিং থাকে তবে এ কারণেই। আমি কেবল একটি প্রান্তের কেস সম্পর্কে অবহিত করছি। এটি কিছুটা প্রমিত সংস্থান বলে মনে হচ্ছে, তাই আমি ভেবেছিলাম একটি অতিরিক্ত সংস্থান যুক্ত করব।
ক্রিস ফ্রিসিনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.