मैं इसे सत्यापन के लिए उपयोग करता हूं:

class MyValidationForm(forms.Form):
  title = forms.CharField()
  body = forms.Textarea()
  taxonomy = forms.IntegerField()

और यह मेरा वर्ग-आधारित दृश्य है:

class blog_createpost(dashboardBaseViews):

 template_name = "dashboardtems/blog_createpost.html"

 model = {}

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

    form = MyValidationForm(request.POST)

    if not form.is_valid():
        return HttpResponse("not valid")


    new_data = post(title=request.POST['title'],
                    body=request.POST['body'],
                    description=request.POST['description'],
                    taxonomy=get_object_or_404(taxonomy, 
                       pk=request.POST['taxonomy']),
                    writer=request.user)
    new_data.save()
    return HttpResponse("done")

जैसा कि आप देखते हैं कि मैं इस लाइन में अपने प्राप्त अनुरोध सत्यापन की जांच करता हूं: if not form.is_valid(): और यह काम कर रहा है, लेकिन जब मैं अपने फॉर्म इनपुट के अंदर कुछ SQL-command जोड़ता हूं। यह डेटाबेस के अंदर मान डालने से नहीं रोकता है! .. इसका मतलब है कि मेरे पास डेटाबेस में एक फ़ील्ड है जिसमें कुछ मान हैं जैसे select * from user where 1=1!. क्या यह उपयोगकर्ता इनपुट से एसक्यूएल-इंजेक्शन खतरे का कारण नहीं बनता है? ...

0
Iman Salehi 26 सितंबर 2017, 10:25
3
Django पहले से ही आपको SQL इंजेक्शन हमलों से बचाता है। हां, SQL कमांड की तरह दिखने वाला डेटा डेटाबेस में डाला गया है, यह ऐसे डेटा के लिए उचित प्रतिक्रिया है। एक सफल SQL इंजेक्शन हमला SQL को डेटा के रूप में डालने के बजाय निष्पादित करेगा।
 – 
Martijn Pieters♦
26 सितंबर 2017, 10:27
1
ध्यान दें, मॉडल फॉर्म का उपयोग करने का एक बिंदु यह है कि आप अपनी पोस्ट ऑब्जेक्ट बनाने के लिए बस form.save() कर सकते हैं। किसी भी स्थिति में, आपको हमेशा request.POST के बजाय form.cleaned_data का उपयोग करना चाहिए।
 – 
Daniel Roseman
26 सितंबर 2017, 10:34
इसलिए हम Django जैसे फ्रेमवर्क का उपयोग करते हैं। पहिया को फिर से शुरू करने की कोई आवश्यकता नहीं है। फ्रेमवर्क न केवल SQL इंजेक्शन, बल्कि XSS, CSRF, फॉर्म सत्यापन और भी बहुत कुछ का ध्यान रखता है। आपको दस्तावेज़ीकरण पढ़ने और टूल को जानने में अधिक समय लगाना चाहिए।
 – 
cezar
26 सितंबर 2017, 10:43

1 उत्तर

सबसे बढ़िया उत्तर

आपने गलत समझा है कि SQL इंजेक्शन का अर्थ क्या है। Django ने आपको इस तरह के हमले से सफलतापूर्वक बचाया है, स्ट्रिंग "select * from user where 1=1" को डेटा के रूप में माना जा रहा है, कमांड के रूप में नहीं, और डेटाबेस में एक मान के रूप में समाप्त हुआ।

SQL इंजेक्शन हमला डेटाबेस द्वारा निष्पादित SQL को बदल देता है। एक सफल हमला डेटाबेस को इसके बजाय कमांड के रूप में डेटा निष्पादित करने के लिए प्रेरित करता है। आप एक मूल्य के रूप में select * from user where 1=1 के साथ समाप्त नहीं होंगे, लेकिन इसके बजाय आप हमलावर के साथ user तालिका से सभी परिणामों तक पहुंच प्राप्त कर लेंगे।

एक क्लासिक त्रुटि यह है कि SQL कमांड को एक स्ट्रिंग के रूप में बनाकर डेटा को ठीक से नहीं बचाना है। मान लें कि सर्वर वर्तमान उपयोगकर्ता के लिए डेटा देखने के लिए निम्न क्वेरी का उपयोग करता है:

SELECT * FROM user WHERE username='$user_id'

जहां $user_id अनुरोध से आता है। आम तौर पर यह एक लॉगिन नाम होगा, कहें

user_id = "zopatista"

तो क्वेरी बन जाती है

SELECT * FROM user WHERE username='zopatista'

यदि सर्वर SQL इंजेक्शन हमलों से सुरक्षा नहीं करता है, तो एक हमलावर user_id को प्रतिस्थापित कर सकता है और अधिक SQL कमांड इंजेक्ट कर सकता है:

user_id = "zopatista' OR 1=1 -- "

तो बस उस स्ट्रिंग को क्वेरी में इंटरपोल करने के बाद, अब सर्वर निम्न SQL को डेटाबेस में भेजेगा:

SELECT * FROM user WHERE username='zopatista' OR 1=1 -- '

और अचानक क्वेरी कमांड का अर्थ बदल गया है और डेटाबेस लॉगिन नाम से मेल खाने वाली केवल एक पंक्ति के बजाय सभी पंक्तियों को लौटा देगा।

एसक्यूएल इंजेक्शन पर क्लासिक एक्सकेसीडी मजाक एक कदम आगे जाता है और एसक्यूएल कोड इंजेक्ट करता है जो पूरी तालिका को हटा देता है< /em>, अधिक जानकारी तक पहुंच प्राप्त करने का प्रयास करने के बजाय।

SQL इंजेक्शन के विरुद्ध सुरक्षा करने वाला सर्वर यह सुनिश्चित करेगा कि उपयोगकर्ता द्वारा प्रदत्त डेटा हमेशा पैरामीटरयुक्त है, यह सुनिश्चित करने के लिए कि इसे क्वेरी के भाग के रूप में कभी नहीं देखा जा सकता है, डेटा को क्वेरी से अलग डेटाबेस ड्राइवर को भेज रहा है।

जब तक आप Django के मॉडल और क्वेरीसेट का उपयोग करते हैं, तब तक आप SQL इंजेक्शन हमलों से सुरक्षित रहेंगे। यदि आप extra() या RawSQL() उपयोगकर्ता डेटा के साथ उनकी पैरामीटर सुविधाओं का उपयोग किए बिना।

12
Martijn Pieters 28 सितंबर 2018, 12:33
Tnx ... ग्रेट इलस्ट्रेटिंग
 – 
Iman Salehi
26 सितंबर 2017, 10:51
उस स्पष्टीकरण के लिए धन्यवाद @Martijn Pieters। वर्तमान में मैंने अपने विचारों में एसक्यूएल इंजेक्ट किया है क्योंकि मुझे समझ में नहीं आता कि मैं Django मॉडल से अन्यथा डेटा कैसे प्राप्त कर सकता हूं। मुझे दो डेटाबेस तालिकाओं के बीच जुड़ने के आधार पर विवरण निकालने की आवश्यकता है। क्या आप कृपया कुछ हेडअप दे सकते हैं कि मैं SQL क्वेरी को कुछ मॉडल आधारित क्वेरी के साथ कैसे बदल सकता हूं?
 – 
NSP
26 अक्टूबर 2017, 12:50
@NSP: इस तरह, बहुत व्यापक। Django का ORM आपको इंजेक्शन से बचाता है, और जुड़ने का समर्थन करता है। देखें docs.djangoproject.com/en/1.11/topics/db/queries< /ए>
 – 
Martijn Pieters♦
26 अक्टूबर 2017, 12:58
मेरे पास यह है cur.execute('''select teacher.teacher_id,teacher_name,subject_name from teacher,subject,teaches where(teacher.teacher_id=teaches.teacher_id and subject.subject_id=teaches.subject_id)''') मैं इसे Django ORM के साथ कैसे बदल सकता हूं? मैं django के लिए नया हूं, और यह पहलू समझने में काफी जटिल है। क्या आप कृपया सुझाव दे सकते हैं।
 – 
NSP
26 अक्टूबर 2017, 13:38
@NSP: क्षमा करें, नहीं, मैं ऐसा नहीं करने जा रहा हूं। कृपया Django ट्यूटोरियल्स का पालन करें, वे वहां काफी मददगार हैं।
 – 
Martijn Pieters♦
26 अक्टूबर 2017, 13:46