SQL Injection Example – जब हम किसी HTML Page पर User Form के माध्यम से User Data Accept करते हैं, तब User, HTML Form में सामान्य Data Insert करने के स्थान पर कई बार ऐसा Data Insert देता है, जिसे Check किए बिना यदि Directly Server Side Script द्वारा Use कर लिया जाए, तो पूरा Database Corrupt हो जाने, किसी Table के Delete हो जाने, Blog/Site के Hack हो जाने अथवा Blog/Site के Database में Stored Security Related Sensitive Data के Leak हो जाने की सम्भावना रहती है, जिनका User द्वारा गलत तरीके से उपयोग किया जा सकता है।
जब User किसी Site/Blog को इस तरह से नुकसान पहुंचाने के लिए अथवा Database के Sensitive Section में Enter करने के लिए HTML Form पर Normal Data के स्थान पर किसी SQL Query को Specify करता है, तो इस तरीके को SQL Injection Attack कहा जाता है और हम Web Developer को अपनी Site/Blog को SQL Injection Attack से बचाने के लिए सभी सम्भव Precautions को Use करना जरूरी होता है।
चलिए, सबसे पहले हम इस SQL Injection Attack को ही ठीक से समझने की कोशिश करते हैं।
मान लीजिए कि हमारी Web Site में एक Login Webpage है, जिस पर Username व Password Specify करके कोई भी Valid User हमारी Website के Secure Area में पहुंच सकता है।
जब User इस Form पर Login करने के लिए अपना Username व Password Specify करके Login Form को Submit करता है, तो Web Server पर उस HTML User Form के Username व Password को Extract किया जाता है और इस Username व Password को Backend में MySQL Database पर निम्नानुसार एक Query में Use करके इस बात का पता लगाया जाता है, कि Specified Username व Password किसी Valid Authenticated User का Username Password है या नहीं%
SELECT * FROM usertable WHERE username = ‘$input_user’ AND password = ‘$input_pass’;
यदि उपरोक्त Query Fire होने पर कोई Record Return होता है, तो इसका मतलब ये है कि Specified Username व Password Database में Exist हैं। यानी Specified Username/Password वाले User को Website के Secure Area में Redirect किया जा सकता है।
यदि उपरोक्त Query Fire होने से पहले User Form द्वारा आने वाले Username व Password को Sanitize किया जाता है, तब तो ठीक है। लेकिन यदि User Form द्वारा आने वाले Username व Password को Sanitize नहीं किया जाताए तो User अपने HTML Form पर Username के रूप में “anything’ OR 1=1 —” व Password के रूप में “anything” Insert करके Form को Submit कर सकता है और यदि User ऐसा करता है, तो उपरोक्तानुसार Fire होने वाली SSQL Query वास्तव में निम्नानुसार Format में Fire होगी%
SELECT * FROM usertable WHERE username = ‘anything’ OR 1=1; — AND password = ‘anything’;
जब उपरोक्त Query Execute होगा, तो ये Query User को Website के Secure ।तमं में पहुंचा देगा जबकि Useत ने Username व Password के रूप में कोई Valid Information Specify नहीं किया है।
ऐसा इसलिए होता है क्योंकि MySQL व अन्य कई Databases में “—” को Comment के लिए Use किया जाता है। यानी “—” के बाद जो कुछ भी लिखा होता है, MySQL उसे Ignore कर देता है।
जबकि उपरोक्त Query में Username के “anything’ OR 1=1;” Specify करने का मतलब MySQL Database के लिए ये है कि या तो username = ‘anything’ हो या फिर 1=1 यानी True हो।
अब यदि Current Database में ‘anything’ नाम का User होगा, तब भी Condition True हो जाएगी और यदि Current Database में ‘anything’ नाम का User नहीं होगा, तो OR 1=1 Statement Execute होगा, जो कि True ही Return करेगा क्योंकि 1 हमेंशा 1 के बराबर होता है। इतना ही नहीं, 1=1 के Just बाद में “—“ Specify करके User ने आगे की पूरी SQL Query को एक Comment में Convert कर दिया है।
फलस्वरूप MySQL Database इससे आगे के Statement को Execute करते हुए Password को Check ही नहीं करेगा और Final True Return करते हुए ये मान लेगा कि Current User एक Valid User है और उसे Website के Secure Area में Redirect कर देगा।
इस तरह से किसी User Form के माध्यम से बिना Valid Username/Password के किसी Site/Blog के Sensitive व Secure Area में Enter करने हेतु लिखे जाने वाले SQL Statement को ही SQL Injection Attack कहा जाता है और इस तरह के SQL Injection Attack से बचने के लिए ही WordPress हमें prepare() Method Provide करता है, जिसे हमने पिछले Sections में Use किया है।
ये Method हालांकि “C Language” के printf() Method के Syntax को ही Follow करता है। लेकिन इस Method को Use करते समय हम %d या %s Control Strings को उनके क्रम यानी Order के साथ Set कर सकते हैं। जैसे:
<?php global $wpdb; $name = "Kuldeep"; $email = "admin@bccfalna.com"; $wpdb->query($wpdb->prepare( "INSERT INTO registration(name, email) VALUES ( %1$s, %2$s )", $name, $email )); ?>
जैसाकि उपरोक्त Code में हम देख सकते हैं कि हमने किस तरह से n$ के साथ %s Control String को Specify किया है और जब हम इस तरह से Control Strings को Specify करते हैं, तब हम Values को किसी भी Position पर Set करने के लिए Specify कर सकते हैं। यानी हमें क्रम का ध्यान रखने की जरूरत नहीं होती। उदाहरण के लिए यदि हम हमारे पिछले Code के SQL Statement को निम्नानुसार Modify कर दें:
“INSERT INTO registration(name, email) VALUES ( %2$s, %1$s )“, $email, $name
तो %2$s के स्थान पर $name Variable का Value ही Replace होगा, क्योंकि इसे Argument की List में दूसरे Argument की Value से Replace होना है, जो कि $name है। इसी तरह से %1$s के स्थान पर $email Variable का Value ही Replace होगा, क्योंकि इसे Argument की List में पहले Argument की Value से Replace होना है, जो कि $email है।
परिणामस्वरूप उपरोक्त Statement भी उसी तरह से registration Table में name व email Field में $name व $email Variables में Stored Values का Store करेगा जिस तरह से पिछले Code में Specify किया गया SQL Statement करेगा।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook Advance WordPress in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।
Advance WordPress in Hindi | Page: 835 | Format: PDF