"बॉबी टेबल" XKCD कॉमिक से SQL इंजेक्शन कैसे काम करता है?


1092

बस देख रहा हूँ:

एक्सकेसीडी स्ट्रिप (स्रोत: https://xkcd.com/327/ )

यह एसक्यूएल क्या करता है:

Robert'); DROP TABLE STUDENTS; --

मैं दोनों जानते हैं 'और --टिप्पणियों के लिए हैं, लेकिन शब्द नहीं है DROP, क्योंकि यह एक ही पंक्ति का हिस्सा है और साथ ही टिप्पणी की हो?


16
यदि आप स्टैक ओवरफ्लो पॉडकास्ट # 31 (27 नवंबर, 2008) को सुनते हैं , तो वे वास्तव में इस पर चर्चा करते हैं।
ईबीग्रीन

93
MySQL में, टिप्पणियों के' लिए नहीं है । यहां तक ​​कि अगर यह था, तो इसके पहले कोई स्थान नहीं है, इसलिए यह केवल उस स्ट्रिंग को समाप्त कर सकता है जो इसे पहले करता है।
हल्की दौड़ 1 कक्षा

45
जहाँ तक XKCD जाता है, अगर कुछ कॉमिक्स के बारे में कोई सवाल है, तो आप हमेशा एक्सप्लेन XKCD पर जा सकते हैं और अपने उत्तर का पता लगा सकते हैं। यहाँ तक कि एक XKCD विकी भी है , जो कुछ मुश्किल कॉमिक्स जैसे XKCD जियोशिंग
अनातोली

13
मेरा मानना ​​है कि इस लिंक को यहाँ दर्ज किया जाना चाहिए: bobby-tables.com
एरिच 'द

2
beta.compongshouse.gov.uk/company/10542519 नामक परामर्श के लिए पंजीकरण है; DROP टेबल "कंपनियाँ"; - लिमिटेड
एलेक्स डुप्यु

जवाबों:


1115

यह छात्रों की तालिका को गिराता है।

स्कूल के कार्यक्रम में मूल कोड शायद कुछ ऐसा दिखता है

q = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";

यह टेक्स्ट इनपुट को क्वेरी में जोड़ने का भोला तरीका है, और बहुत बुरा है , जैसा कि आप देखेंगे।

पहले नाम से मानों के बाद, मध्य नाम टेक्स्टबॉक्स FNMName.Text (जो है Robert'); DROP TABLE STUDENTS; --) और अंतिम नाम टेक्स्टबॉक्स LName.Text (चलो इसे कॉल करें Derper) को बाकी क्वेरी के साथ समाहित किया गया है, परिणाम अब वास्तव में दो मीटर से अलग हो गया है स्टेटमेंट टर्मिनेटर (अर्धविराम)। दूसरी क्वेरी को पहले में इंजेक्ट किया गया है । जब कोड डेटाबेस के खिलाफ इस क्वेरी को निष्पादित करता है, तो यह इस तरह दिखेगा

INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --', 'Derper')

सादे अंग्रेजी में, जो मोटे तौर पर दो प्रश्नों का अनुवाद करता है:

'रॉबर्ट' के नाम मान के साथ छात्रों की तालिका में एक नया रिकॉर्ड जोड़ें

तथा

छात्र तालिका हटाएं

दूसरी क्वेरी के पहले की सभी चीज़ों को एक टिप्पणी के रूप में चिह्नित किया जाता है : --', 'Derper')

'छात्र का नाम में एक टिप्पणी नहीं है, यह बंद हो रहा है स्ट्रिंग सीमांकक । चूंकि छात्र का नाम एक स्ट्रिंग है, इसलिए इसे काल्पनिक क्वेरी को पूरा करने के लिए वाक्यात्मक रूप से आवश्यक है। इंजेक्शन हमले केवल तब काम करते हैं जब SQL क्वेरी वे मान्य SQL में परिणाम इंजेक्ट करते हैं

Dan04 की सूक्ष्म टिप्पणी के अनुसार फिर से संपादित


3
मिमी, तर्क के आसपास कोष्ठक के साथ कहाँ असामान्य है, लेकिन कम से कम यह एक वाक्यविन्यास त्रुटि से बचा जाता है ... :-)
PhiLho 20

60
@PhiLho: यदि मूल कथन a INSERTहोता, तो कोष्ठक अधिक अर्थ देता। यह भी बताएगा कि डेटाबेस कनेक्शन केवल-पढ़ने के लिए मोड में क्यों नहीं है।
dan04

3
जैसा कि @ dan04 बताते हैं, कोष्ठक एक के साथ अधिक समझ में आता है INSERT। पीछे की ओर सोचते हुए, SELECTवैसे भी नहीं चलेंगे क्योंकि टेबल में लिटिल बॉबी टेबल्स का इंसर्ट पहले ही टेबल गिरा हुआ होगा।
ypercube y

10
वास्तव में, इस उदाहरण में पहली क्वेरी ("नया रिकॉर्ड जोड़ें ...") विफल हो जाएगी क्योंकि Studentsकेवल एक कॉलम (मूल / सही कथन दो कॉलम प्रदान किए गए) से अधिक की उम्मीद है। उस ने कहा, दूसरे कॉलम की उपस्थिति यह दिखाने में सहायक है कि टिप्पणी क्यों आवश्यक है; और जब से एक बॉबी के नाम को नहीं बदल सकता है, यह संभवतः सबसे अच्छा है जैसा कि फुटनोट के रूप में इस अवलोकन से थोड़ा अधिक है।
एग्यिगल

7
बॉबी के अंतिम नाम - या कम से कम अपनी मां के, है रॉबर्ट्स , प्रति xkcd के बारे में बताएं । मुझे यकीन नहीं है कि सही करने से उत्तर स्पष्टता में सुधार होगा।
WBT

611

चलो कहते हैं, नाम एक चर में इस्तेमाल किया गया था $Name

आप फिर यह क्वेरी चलाते हैं :

INSERT INTO Students VALUES ( '$Name' )

कोड गलती से उपयोगकर्ता द्वारा चर के रूप में आपूर्ति की गई किसी भी चीज़ को रख रहा है।

आप चाहते थे कि SQL :

INSERT इनटू स्टूडेंट्स वैल्यूज़ (' Robert Tables`)

लेकिन एक चतुर उपयोगकर्ता जो चाहे उसे आपूर्ति कर सकता है:

INSERT इनटू स्टूडेंट्स वैल्यूज़ (' Robert'); DROP TABLE Students; --')

आपको क्या मिलेगा:

INSERT INTO Students VALUES ( 'Robert' );  DROP TABLE STUDENTS; --' )

--केवल लाइन के शेष टिप्पणी।


87
यह बहुत बेहतर है फिर उच्चतम मतदान, क्योंकि यह समापन कोष्ठक की व्याख्या करता है।
टिम बुथ

1
वैसे, कॉमिक्स में स्कूल डायरेक्टर के पास स्टूडेंट टेबल डिलीट होने के बाद से ही जागरूक होने या XSS के लिए कोई रास्ता नहीं है, वह नहीं जान सकता कि यह किसने किया है।
xryl669

@ xryl669 लॉग इस तरह की स्थितियों में बहुत सहायक होते हैं ... कभी-कभी सभी प्रश्न लॉग होते हैं, और कभी-कभी अन्य लॉग की गई जानकारी आपको अपराधी को कम करने में मदद कर सकती है।
इनेमजा

165

जैसा कि बाकी सभी ने पहले ही बताया है, ');मूल कथन को बंद कर देता है और फिर एक दूसरे कथन का अनुसरण करता है। PHP जैसी भाषाओं सहित अधिकांश चौखटों में अब तक डिफ़ॉल्ट सुरक्षा सेटिंग्स हैं, जो एक एसक्यूएल स्ट्रिंग में कई बयानों की अनुमति नहीं देते हैं। PHP में, उदाहरण के लिए, आप mysqli_multi_queryफ़ंक्शन का उपयोग करके केवल एक SQL स्ट्रिंग में कई स्टेटमेंट चला सकते हैं ।

हालाँकि, आप किसी दूसरे कथन को जोड़ने के बिना SQL इंजेक्शन के माध्यम से मौजूदा SQL स्टेटमेंट में हेरफेर कर सकते हैं। मान लें कि आपके पास एक लॉगिन सिस्टम है जो उपयोगकर्ता नाम और इस सरल चयन के साथ एक पासवर्ड की जांच करता है:

$query="SELECT * FROM users WHERE username='" . $_REQUEST['user'] . "' and (password='".$_REQUEST['pass']."')";
$result=mysql_query($query);

यदि आप peterउपयोगकर्ता नाम और secretपासवर्ड के रूप में प्रदान करते हैं, तो परिणामी SQL स्ट्रिंग इस तरह दिखाई देगी:

SELECT * FROM users WHERE username='peter' and (password='secret')

सब कुछ ठीक है। अब आप इस स्ट्रिंग को पासवर्ड के रूप में प्रदान करने की कल्पना करें:

' OR '1'='1

तब परिणामी SQL स्ट्रिंग यह होगा:

SELECT * FROM users WHERE username='peter' and (password='' OR '1'='1')

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


71

नहीं, 'एसक्यूएल में एक टिप्पणी नहीं है, लेकिन एक सीमांकक।

माँ का मानना ​​है कि डेटाबेस प्रोग्रामर ने ऐसा अनुरोध किया है:

INSERT INTO 'students' ('first_name', 'last_name') VALUES ('$firstName', '$lastName');

(उदाहरण के लिए) नए छात्र को जोड़ने के लिए, जहां $xxxचर सामग्री को HTML फॉर्मेट से सीधे लिया गया था, बिना प्रारूप की जाँच किए या विशेष वर्णों से बचने के।

तो अगर $firstNameशामिल Robert'); DROP TABLE students; --डेटाबेस प्रोग्राम डीबी पर सीधे निम्नलिखित अनुरोध निष्पादित करेगा:

INSERT INTO 'students' ('first_name', 'last_name') VALUES ('Robert'); DROP TABLE students; --', 'XKCD');

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

मम्म, मैं बहुत धीमा हूँ, मुझे नारंगी बैंड में खदान से पहले ही 8 उत्तर दिखाई दे रहे हैं ... :-) एक लोकप्रिय विषय, ऐसा लगता है।


39

टी एल; डॉ

- आवेदन इनपुट को स्वीकार करता है, इस मामले में 'नैन्सी', बिना प्रयास किए - इनपुट को संपीड़ित करता है, जैसे कि अन्य पात्रों को बचाना
 
विद्यालय => INSERT INTO students VALUES ( 'नैन्सी' ); INSERT 0 1   
  

- SQL इंजेक्शन तब होता है जब एक डेटाबेस कमांड में इनपुट को हेरफेर किया जाता है - डेटाबेस सर्वर को मनमाने ढंग से SQL 
स्कूल को निष्पादित करने का कारण बनता है => INSERT INTO छात्रों को VALUES ( 'रॉबर्ट' );
    ड्रॉप टेबल छात्रों ; - '); INSERT 0 1 ड्रॉप टेबल  
  
 

- छात्र के रिकॉर्ड अब चले गए हैं - यह और भी बुरा हो सकता था! 
स्कूल => छात्रों से चयन करें * ; 
त्रुटि :   संबंध "छात्रों" है नहीं मौजूद   
LINE 1 : छात्रों से चयन करें * ; ^   
                      

यह छात्र तालिका को हटाता है (हटाता है)।

( इस उत्तर में सभी कोड उदाहरण PostgreSQL 9.1.2 डेटाबेस सर्वर पर चलाए गए थे। )

यह स्पष्ट करने के लिए कि क्या हो रहा है, आइए इसे केवल एक साधारण तालिका के साथ आज़माएँ जिसमें केवल नाम फ़ील्ड है और एक पंक्ति जोड़ें:

स्कूल => बनाएं टेबल छात्रों ( नाम पाठ प्राथमिक कुंजी ); 
नोटिस : बनाएँ टेबल / प्राथमिक कुंजी होगा बनाने के अंतर्निहित सूचकांक "students_pkey" के लिए तालिका "छात्रों" बनाएँ टेबल 
स्कूल =>             
   सम्मिलित करें जांच छात्रों मान ( 'जॉन' ); INSERT 0 1  
  

मान लें कि तालिका में डेटा डालने के लिए एप्लिकेशन निम्न SQL का उपयोग करता है:

INSERT इनटू स्टूडेंट्स वैल्यूज़ ( 'फोब्बर' );  

foobarछात्र के वास्तविक नाम के साथ बदलें । एक सामान्य सम्मिलित ऑपरेशन इस तरह दिखेगा:

- इनपुट: नैन्सी 
स्कूल => INSERT INTO   छात्र VALUES ( 'नैन्सी' ); INSERT 0 1 
  

जब हम तालिका की क्वेरी करते हैं, तो हमें यह मिलता है:

स्कूल => छात्रों से चयन करें * ;   
 नाम
-------
 जॉन
 नैन्सी
( 2 पंक्तियाँ ) 

जब हम टेबल में लिटिल बॉबी टेबल्स का नाम डालते हैं तो क्या होता है?

- इनपुट: रॉबर्ट '); ड्रॉप टेबल छात्रों; - 
स्कूल => INSERT इनटू स्टूडेंट्स वैल्यूज़ ( 'रॉबर्ट' ); ड्रॉप टेबल छात्रों ; - '); INSERT 0 1 ड्रॉप टेबल      
  
 

यहां SQL इंजेक्शन स्टेटमेंट को समाप्त करने और एक अलग DROP TABLEकमांड सहित छात्र के नाम का परिणाम है ; इनपुट के अंत में दो डैश किसी भी बचे हुए कोड पर टिप्पणी करने के लिए अभिप्रेत हैं जो अन्यथा एक त्रुटि का कारण होगा। आउटपुट की अंतिम पंक्ति यह पुष्टि करती है कि डेटाबेस सर्वर ने तालिका को गिरा दिया है।

यह ध्यान रखना महत्वपूर्ण है कि INSERTऑपरेशन के दौरान एप्लिकेशन किसी विशेष वर्ण के लिए इनपुट की जांच नहीं कर रहा है, और इसलिए SQL कमांड में मनमाने इनपुट को दर्ज करने की अनुमति दे रहा है। इसका मतलब यह है कि एक दुर्भावनापूर्ण उपयोगकर्ता, उपयोगकर्ता इनपुट के लिए सामान्य रूप से इच्छित फ़ील्ड में सम्मिलित कर सकता है, विशेष प्रतीकों जैसे उद्धरण के साथ-साथ मनमाने ढंग से SQL कोड डेटाबेस सिस्टम को निष्पादित करने का कारण बनता है, इसलिए SQL  इंजेक्शन

परिणाम?

स्कूल => छात्रों से चयन करें * ; 
त्रुटि    :   संबंध "छात्रों" है नहीं मौजूद
लाइन 1 : का चयन करें * से   छात्रों ; ^
                      

SQL इंजेक्शन एक ऑपरेटिंग सिस्टम या एप्लिकेशन में दूरस्थ मनमानी कोड निष्पादन भेद्यता के बराबर डेटाबेस है । एक सफल SQL इंजेक्शन हमले के संभावित प्रभाव को कम करके नहीं आंका जा सकता है - डेटाबेस सिस्टम और एप्लिकेशन कॉन्फ़िगरेशन के आधार पर, इसका उपयोग हमलावर द्वारा डेटा हानि (इस मामले में) के रूप में किया जा सकता है, डेटा तक अनधिकृत पहुंच प्राप्त कर सकता है, या निष्पादित भी कर सकता है। मेजबान मशीन पर खुद को मनमाना कोड।

जैसा कि XKCD कॉमिक द्वारा उल्लेख किया गया है, SQL इंजेक्शन के हमलों से बचाव का एक तरीका डेटाबेस इनपुट को साफ करना है, जैसे कि विशेष वर्णों से बचकर, ताकि वे अंतर्निहित SQL कमांड को संशोधित न कर सकें और इसलिए मनमाने ढंग से SQL कोड के निष्पादन का कारण न बन सकें। यदि आप पैरामीटर किए गए प्रश्नों का उपयोग करते हैं, जैसे कि SqlParameterADO.NET में उपयोग करके , तो इनपुट, न्यूनतम, स्वचालित रूप से SQL इंजेक्शन के साथ सुरक्षा के लिए संचित किया जाएगा।

हालाँकि, अनुप्रयोग स्तर पर इनपुट को सैनिटाइज़ करना अधिक उन्नत SQL इंजेक्शन तकनीकों को रोक नहीं सकता है। उदाहरण के लिए, PHP फ़ंक्शन को दरकिनार करने के तरीके हैंmysql_real_escape_string । अतिरिक्त सुरक्षा के लिए, कई डेटाबेस सिस्टम तैयार कथनों का समर्थन करते हैं । यदि बैकएंड में ठीक से लागू किया गया है, तो तैयार किए गए बयान एसक्यूएल इंजेक्शन को असंभव बना सकते हैं क्योंकि डेटा इनपुट को शब्दशः बाकी कमांड से अलग माना जाता है।


30

मान लीजिए कि आपने छात्र निर्माण विधि को इस तरह लिखा है:

void createStudent(String name) {
    database.execute("INSERT INTO students (name) VALUES ('" + name + "')");
}

और कोई नाम दर्ज करता है Robert'); DROP TABLE STUDENTS; --

डेटाबेस पर क्या चलता है यह प्रश्न है:

INSERT INTO students (name) VALUES ('Robert'); DROP TABLE STUDENTS --')

अर्धविराम सम्मिलित आदेश को समाप्त करता है और दूसरा शुरू करता है; - बाकी लाइन से टिप्पणी करता है। ड्रॉप टेबल कमांड निष्पादित किया गया है ...

यही कारण है कि बाइंड पैरामीटर एक अच्छी बात है।


26

एक एकल उद्धरण एक स्ट्रिंग की शुरुआत और अंत है। एक अर्धविराम एक बयान का अंत है। तो अगर वे इस तरह का चयन कर रहे थे:

Select *
From Students
Where (Name = '<NameGetsInsertedHere>')

एसक्यूएल बन जाएगा:

Select *
From Students
Where (Name = 'Robert'); DROP TABLE STUDENTS; --')
--             ^-------------------------------^

कुछ प्रणालियों पर, वक्तव्य के selectबाद सबसे पहले भाग जाएगा drop! संदेश यह है: अपने एसक्यूएल में अनुमानित मूल्यों को न रखें। इसके बजाय मापदंडों का उपयोग करें!


18

');समाप्त होता है क्वेरी, यह एक टिप्पणी शुरू नहीं करता है। फिर यह छात्रों की तालिका को गिराता है और बाकी क्वेरी को निष्पादित करता है जिसे निष्पादित किया जाना चाहिए था।


17

डेटाबेस के लेखक ने शायद ए

sql = "SELECT * FROM STUDENTS WHERE (STUDENT_NAME = '" + student_name + "') AND other stuff";
execute(sql);

यदि student_name एक दिया गया है, जो "रॉबर्ट" नाम के साथ चयन करता है और फिर तालिका को छोड़ देता है। "-" भाग दिए गए क्वेरी के बाकी हिस्से को एक टिप्पणी में बदलता है।


यह मेरा पहला विचार था, लेकिन आपको पीछे चल रही कोष्ठक के साथ एक सिंटैक्स त्रुटि मिलती है, नहीं?
फीलो

3
इसलिए अंत में एक है - शेष पाठ का संकेत एक टिप्पणी है और इसे अनदेखा किया जाना चाहिए।

17

इस मामले में, 'कोई टिप्पणी चरित्र नहीं है। इसका उपयोग स्ट्रिंग शाब्दिकों को परिसीमित करने के लिए किया जाता है। कॉमिक कलाकार इस विचार पर बैंकिंग करता है कि प्रश्न में स्कूल कहीं न कहीं गतिशील sql है जो कुछ इस तरह दिखता है:

$sql = "INSERT INTO `Students` (FirstName, LastName) VALUES ('" . $fname . "', '" . $lname . "')";

इसलिए अब 'चरित्र स्ट्रिंगर को समाप्त करता है, इससे पहले कि प्रोग्रामर यह उम्मीद कर रहा था। के साथ संयुक्त; बयान को समाप्त करने के लिए चरित्र, एक हमलावर अब जो भी sql चाहते हैं उन्हें जोड़ सकता है। अंत में टिप्पणी यह ​​सुनिश्चित करने के लिए है कि मूल बयान में कोई भी शेष एसक्यूएल सर्वर पर संकलन से क्वेरी को नहीं रोकता है।

FWIW, मुझे भी लगता है कि सवाल में कॉमिक का एक महत्वपूर्ण विवरण गलत है: यदि आप अपने डेटाबेस इनपुट को सैनिटाइज़ करने के बारे में सोच रहे हैं , जैसा कि कॉमिक बताता है, आप अभी भी इसे गलत कर रहे हैं। इसके बजाय, आपको अपने डेटाबेस इनपुट को संगरोध करने के संदर्भ में सोचना चाहिए , और ऐसा करने का सही तरीका पैरामीटरयुक्त प्रश्नों के माध्यम से है।


16

'एसक्यूएल में चरित्र स्ट्रिंग स्थिरांक के लिए प्रयोग किया जाता है। इस मामले में इसका उपयोग स्ट्रिंग को समाप्त करने के लिए किया जाता है और टिप्पणी के लिए नहीं।


7

यह इस प्रकार काम करता है: मान लीजिए कि व्यवस्थापक छात्र के रिकॉर्ड की तलाश कर रहा है

Robert'); DROP TABLE STUDENTS; --

चूंकि व्यवस्थापक खाते में उच्च विशेषाधिकार हैं, इसलिए इस खाते से तालिका हटाना संभव है।

अनुरोध से उपयोगकर्ता का नाम पुनर्प्राप्त करने के लिए कोड है

अब क्वेरी कुछ इस तरह होगी (छात्र तालिका खोजने के लिए)

String query="Select * from student where username='"+student_name+"'";

statement.executeQuery(query); //Rest of the code follows

परिणामी क्वेरी बन जाती है

Select * from student where username='Robert'); DROP TABLE STUDENTS; --

चूंकि यूजर इनपुट सैनिटाइज नहीं है, इसलिए उपरोक्त क्वेरी को 2 भागों में जोड़ दिया गया है

Select * from student where username='Robert'); 

DROP TABLE STUDENTS; --

डबल डैश (-) केवल क्वेरी के शेष भाग पर टिप्पणी करेगा।

यह खतरनाक है क्योंकि यह पासवर्ड प्रमाणीकरण को अशक्त कर सकता है, यदि मौजूद है

पहले वाला सामान्य खोज करेगा।

यदि दूसरा पर्याप्त विशेषाधिकार है तो दूसरा छात्र टेबल छात्र को छोड़ देगा।


SELECT* FROM sutdents ...- आप एक "एस" भूल गए। यह वही है जो आप छोड़ रहे हैं। DROP TABLE STUDENTS;
DevWL

4

SQL इंजेक्शन बनाने के लिए आपको प्रपत्र डेटा इनपुट करने की आवश्यकता नहीं है।

इससे पहले कि मैं आप में से कुछ को सचेत कर सकूं, किसी ने इस ओर इशारा नहीं किया।

अधिकतर हम फॉर्म इनपुट को पैच करने की कोशिश करेंगे। लेकिन यह एकमात्र स्थान नहीं है जहां आप SQL इंजेक्शन के साथ हमला कर सकते हैं। आप URL के साथ बहुत सरल हमला कर सकते हैं जो GET अनुरोध के माध्यम से डेटा भेजते हैं; गिरने के उदाहरण पर विचार करें:

<a href="/show?id=1">show something</a>

आपका url दिखेगा http://yoursite.com/show?id=1

अब कोई इस तरह की कोशिश कर सकता है

http://yoursite.com/show?id=1;TRUNCATE table_name

वास्तविक तालिका नाम के साथ table_name को बदलने का प्रयास करें। अगर उसे आपकी टेबल का नाम सही मिला तो वे आपकी टेबल खाली कर देंगे!(इस URL को सरल स्क्रिप्ट के साथ बल देना बहुत आसान है)

आपकी क्वेरी कुछ इस तरह दिखेगी ...

"SELECT * FROM page WHERE id = 4;TRUNCATE page"

पीडीओ का उपयोग करके PHP असुरक्षित कोड का उदाहरण:

<?php
...
$id = $_GET['id'];

$pdo = new PDO($database_dsn, $database_user, $database_pass);
$query = "SELECT * FROM page WHERE id = {$id}";
$stmt = $pdo->query($query);
$data = $stmt->fetch(); 
/************* You have lost your data!!! :( *************/
...

समाधान - PDO तैयार () और bindParam () विधियों का उपयोग करें:

<?php
...
$id = $_GET['id'];

$query = 'SELECT * FROM page WHERE id = :idVal';
$stmt = $pdo->prepare($query);
$stmt->bindParam('idVal', $id, PDO::PARAM_INT);
$stmt->execute();
$data = $stmt->fetch();
/************* Your data is safe! :) *************/
...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.