SQL इंजेक्शन से मासूम MySQL की रक्षा
लेखक:
अशफाक अंसारी

द्वारा समीक्षित:
रेटिंग:
5
पर अक्टूबर 19, 2012
अंतिम संशोधित:जनवरी 18, 2013

सारांश:

PHP में MySQL के इंजेक्शन को रोकने के तरीकों पर विस्तृत गाइड. SQL इंजेक्शन को रोकने के लिए कोडिंग के नियम और कार्यों सुरक्षित.

परिचय

 

यह अपने मासूम की रक्षा करने के लिए पर एक संक्षिप्त गाइड है MySQL से डेटाबेस SQL इंजेक्शन आक्रमण.
 

SQL इंजेक्शन क्या है?

 

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

इस के लिए कोड कुछ इस तरह लग सकता है:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// पोस्ट अनुरोध से उपयोगकर्ता और पासवर्ड मिल
$USER_NAME = $_POST[ 'उपयोगकर्ता नाम' ];
$पासवर्ड  = $_POST[ 'पासवर्ड' ];

$प्रश्न = "FIRST_NAME का चयन करें, LAST_NAME, users_table कहां उपयोगकर्ता नाम = 'से ACCOUNT_NUMBER$USER_NAME'और पासवर्ड ='$पासवर्ड' ";

$परिणाम = mysql_query( $प्रश्न );

// MySQL कुछ भी पाया कि अगर जांच, यह सफल रहा तो और रिकॉर्ड मिल
अगर ( mysql_num_rows( $परिणाम ) > 0 ) {
    $डेटा = mysql_fetch_assoc( $परिणाम );
    गूंज 'आपका स्वागत है' . $उपयोगकर्ता . '!';
    गूंज 'आपका खाता संख्या है: ' . $डेटा[ 'ACCOUNT_NUMBER' ] . '';
} //Errorr संदेश बाहर प्रिंट
अन्य {
    गूंज 'नाम या पासवर्ड मान्य नहीं! पुन: प्रयास करें!';
}
?>

 

ऊपर स्क्रिप्ट ठीक काम करता है और यह उनके बैंक खाते की संख्या को देखने के लिए वास्तविक उपयोगकर्ताओं को अपने यूज़रनेम और पासवर्ड दर्ज करने की अनुमति देगा.
 

कहते हैं कि मैं प्रवेश मान लेते हैं कि चलो “प्रदर्शन” अपने उपयोगकर्ता नाम के रूप में, और “demopass” अपना पासवर्ड के रूप में, तब MySQL के लिए दिया गया है कि SQL क्वेरी इस तरह दिखता होगा:
 

1
चुनें FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER से users_table कहां प्रयोक्ता नाम = 'डेमो' और पासवर्ड = 'Demopass' ;

 

हमारे इनपुट डेटा डेटाबेस में सफलतापूर्वक मान्य है तो, तो हम इस प्रणाली में लॉग इन किया जाएगा और हम किसी और खाता संख्या के साथ प्रस्तुत किया जाएगा, हम प्रणाली का उपयोग नहीं मिलेगा और हम एक त्रुटि संदेश के साथ प्रस्तुत किया जाएगा “उपयोगकर्ता नाम या पासवर्ड मान्य नहीं! पुन: प्रयास करें!
 

एक दुर्भावनापूर्ण उपयोगकर्ता SQL कथन को समाप्त करने के लिए कर रहे हैं कि अन्य पात्रों में प्रवेश करती है जब समस्या.
 

एक उपयोगकर्ता उपयोगकर्ता नाम के रूप में प्रवेश करने की कोशिश करता है कि चलो मान dem'o और पासवर्ड के रूप में demopass.
 

अब, एसक्यूएल बयान की तरह लग रहा है देखने चलो.
 

1
चुनें FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER से users_table कहां प्रयोक्ता नाम = 'o'और पासवर्ड ='demopass' ;

 

MySQL के बयान को क्रियान्वित किया जाता है तो, यह केवल इलाज करेंगे “dem” उपयोगकर्ता नाम और रूप में जब यह एक और मुठभेड़ों ‘o', तो यह मानते हैं ‘o‘ एक SQL आदेश के रूप में है और इसे पहचानता नहीं है के रूप में यह संदेश फेंक और त्रुटि होगी ‘o‘ एक मान्य SQL आदेश के रूप में.
 
त्रुटि 1064 (42000): आप अपने SQL वाक्यविन्यास में एक त्रुटि है; 'ओ के पास का उपयोग करने के लिए सही वाक्यविन्यास के लिए अपने MySQL सर्वर संस्करण से मेल खाती है मैनुअल की जाँच करें’ और पासवर्ड =”demopass”; ” लाइन पर 1
 

बहुत बढ़िया. ऊपर त्रुटि संदेश SQL वाक्यविन्यास में कुछ त्रुटि है कि वहाँ राज्यों. अगर जादू उद्धरण सक्षम थे, फिर हम उस से ऊपर त्रुटि संदेश मिल गया है नहीं हो सकता.
 

अब, के दुर्भावनापूर्ण उपयोगकर्ता के रूप में उपयोगकर्ता नाम में प्रवेश करती है, तो जो होगा देखा जायेगा (‘ या '1' = '1) और पासवर्ड के रूप में “demopass“.

एसक्यूएल क्वेरी इस तरह दिखेगा:

1
चुनें FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER से users_table कहां प्रयोक्ता नाम = '' या ऐतिहासिक class="st0"> '1 '=ऐतिहासिक class="st0"> '1 ' और पासवर्ड = 'Demopass' ;

 

ऊपर एसक्यूएल क्वेरी क्या मतलब है? यह करने के लिए बराबर है एक उपयोगकर्ता नाम के साथ सभी पंक्तियों को ढूँढने के लिए MySQL कहता है “” ( रिक्त ) या (1= 1) और के बराबर एक पासवर्ड “demopass“.
 

के एसक्यूएल बयान के साथ वास्तव में क्या गलत है समझने के लिए अधिक तार्किक ऊपर एसक्यूएल क्वेरी का प्रतिनिधित्व करते हैं:
 

नाम = “” या “1= 1” और पासवर्ड = “demopass”
 

अब, हम पहले से ही = 1 1 हमेशा सच होने जा रहा है कि पता. अत:, पासवर्ड सही है और उपयोगकर्ता नाम गलत है, तो उपयोगकर्ता प्रणाली में प्रवेश करने में सक्षम हो जाएगा.
 

चलो एक अलग हमले स्ट्रिंग के साथ और अधिक बदतर स्थिति का विश्लेषण करते हैं.
 

हमला स्ट्रिंग: ‘ या 1 = 1–
 

कृपया ध्यान दें कि ( और #) करने के लिए उपयोग किया जाता है terminate. Let's put the attack string in a SQL query and see how the final SQL statement will look.
 

अब, we will assume that the attacker does not even know the password.
 

1
चुनें FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER से users_table कहां प्रयोक्ता नाम = '' या 1=1--='' ;

 

See how the SQL statement is interpreted by MySQL.
 

नाम = “” या 1 = 1– और पासवर्ड = “idonotknow”
 

Please note ऊपर बयान में. हम जानते हैं कि एक बयान एसक्यूएल में टर्मिनेटर और 1= 1 हमेशा सही है, एसक्यूएल क्वेरी के बयान टर्मिनेटर बाकी निष्पादित नहीं किया जाएगा के बाद.
 

अत:, तालिका में सभी रिकॉर्ड लौट जाएगा और उपयोगकर्ता प्रणाली में लॉग करेंगे. हमलावर डेटाबेस में पहले रिकॉर्ड की खाता संख्या को देखने के लिए सक्षम हो जाएगा.
 

निर्दोष MySQL में मदद करते हैं
 

जादू उद्धरण

 

जादू उद्धरण PHP पटकथा भाषा के एक विवादास्पद सुविधा है, विशेष वर्णों को पारित किए जाने से पहले एक बैकस्लैश के साथ प्रस्तुत करने को समाप्त कर रहे हैं जिसमें.
 

जादू उद्धरण के नए प्रतिष्ठानों में डिफ़ॉल्ट रूप से सक्षम थे PHP3 और PHP4, और उनके संचालन के पर्दे के पीछे है और तुरंत स्पष्ट नहीं के बाद से, डेवलपर्स अपने अस्तित्व और वे लागू कर सकते हैं कि संभावित समस्याओं से अनजान हो सकता.
 

हम पर बारी करने के लिए होगा जादू उद्धरण में php.ini वेबसाइट के वेब जड़ में फ़ाइल.
 

कैसे जादू उद्धरण में मदद करता है?

 

हम इन बोली अक्षर से बच जाने की जरूरत है ( सिंगल और डबल दोनों उद्धरण, साथ ही साथ backslashes).
यह उनके सामने एक स्लेश डाल द्वारा किया जाता है.
 

So usename = dem'o हो जाता है डेम 'ओ , यह है के रूप में और MySQL कि उद्धरण चिह्न के साथ काम कर सकते हैं “संरक्षित” स्लैश द्वारा.
 

की जब देखो क्या होता है जादू उद्धरण चालू होता है. के हमलावर जादू उद्धरण के साथ प्रभावित है देखते हैं कैसे.
 

1
चुनें FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER से users_table कहां प्रयोक्ता नाम = '\' या = 1 1 - ' और पासवर्ड = ऐतिहासिक class="st0"> ', ;

 

उपयोगकर्ता नाम के रूप में व्याख्या की है: \’ या 1 = 1–

यह एक पूरी तरह से है एसक्यूएल क्वेरी से बच, कुछ भी नहीं इंजेक्शन प्राप्त कर सकते हैं. magic_quotes_gpc हमारे लिए खतरनाक एकल बोली पलायन. अत:, हमलावर सिस्टम में लॉग इन करने में सक्षम नहीं होगा.

जादू उद्धरण के साथ मुद्दे

 

Magic quotes only insert a backslash before a few characters, nothing more. यह इत्तेफाक से ही ऊपर और ही जैसे कुछ विशेष मामलों में SQL इंजेक्शन से बचाता है. अगर हमारे पास है पर display_errors, हम सिर्फ अपने डेटाबेस के विवरण के साथ बहुत खुश हमलावर सही उसकी आंखों के सामने outputted बनाया. आप नहीं करते हैं यहां तक ​​कि अगर, अभी भी अंधा SQL इंजेक्शन और अग्रिम SQL इंजेक्शन तरीकों का उपयोग करने का एक संभावना यह बाईपास के लिए संभव है वहाँ है magic_quotes_gpc समारोह.
 
इतना, हम गंदे नहीं है कि डेटा से बचने का एक तरीका की जरूरत, वर्ण सेट के मुद्दों के रूप में करने का खतरा नहीं है, और जादू प्रजनन घटा उद्धरण का खतरा नहीं है.
 
में नवंबर 2005 कोर PHP डेवलपर्स इन समस्याओं के कारण फैसला किया है कि जादू उद्धरण सुविधा PHP से हटाया जाएगा 6.
एक बार Magic quotes सुविधाओं को वापस ले लिया है, फिर सामने आते कुछ प्रमुख समस्याओं को होने जा रहा है.
 

SQL इंजेक्शन शमन
 

रोकने के तरीके के एक नंबर रहे हैं MySQL भीतर इंजेक्शन PHP. सबसे आम तरीकों से इस तरह के कार्यों के रूप में प्रयोग कर रहे हैं addslashes() और mysql_real_escape_string().
 

addslashes()

 

addslashes() डेटाबेस प्रश्नों में साफ करने की आवश्यकता है कि वर्ण से पहले बैकस्लैश साथ एक स्ट्रिंग वापस आ जाएगी. ये अक्षर एक उद्धरण हैं (‘ = ’) दोहरे उद्धरण (” = ”) और nullbyte (%00 = \0).
 

addslashes() क्वेरी स्ट्रिंग उद्धरण में लिपटे है तो ही काम करेंगे. ऐसे निम्नलिखित के रूप में एक स्ट्रिंग अभी भी एक SQL इंजेक्शन के लिए असुरक्षित हो जाएगा:
 

1
2
3
$USER_NAME = addslashes( $_POST[ 'उपयोगकर्ता नाम' ] );
$पासवर्ड  = addslashes( $_POST[ 'पासवर्ड' ] );
$प्रश्न = "FIRST_NAME का चयन करें, LAST_NAME, users_table कहां उपयोगकर्ता नाम = 'से ACCOUNT_NUMBER$USER_NAME'और पासवर्ड ='$पासवर्ड' ";

mysql_real_escape_string()

 

mysql_real_escape_string() की तुलना में थोड़ा और अधिक शक्तिशाली है addslashes() यह MySQL के पुस्तकालय समारोह कॉल के रूप में mysql_real_escape_string, निम्न वर्ण के लिए बैकस्लैश prepends जो: \x00, \पता, \र, \, ', ” और X1A.
 

साथ के रूप में addslashes(), mysql_real_escape_string() क्वेरी स्ट्रिंग उद्धरण में लिपटे है तो ही काम करेंगे. ऐसे निम्नलिखित के रूप में एक स्ट्रिंग अभी भी एक SQL इंजेक्शन के लिए असुरक्षित हो जाएगा:
 

1
2
3
$USER_NAME = mysql_real_escape_string( $_POST[ 'उपयोगकर्ता नाम' ] );
$पासवर्ड  = mysql_real_escape_string( $_POST[ 'पासवर्ड' ] );
$प्रश्न = "FIRST_NAME का चयन करें, LAST_NAME, users_table कहां उपयोगकर्ता नाम = 'से ACCOUNT_NUMBER$USER_NAME'और पासवर्ड ='$पासवर्ड' ";

 

sprintf()

 

sprintf() गतिशील तर्क यह इलाज किया जा करने के लिए लगता है जिस तरह से व्यवहार किया जाता है कि यह सुनिश्चित करने के लिए रूपांतरण विशेषताओं के साथ इस्तेमाल किया जा सकता है. उदाहरण के लिये, उपयोगकर्ताओं आईडी नंबर के लिए एक फोन स्ट्रिंग में थे, %एस तर्क एक स्ट्रिंग के रूप में व्यवहार किया जाता है यह सुनिश्चित करने के लिए इस्तेमाल किया जाएगा. निम्नानुसार इस का एक उदाहरण है:
 

1
2
3
$USER_NAME = $_POST[ 'उपयोगकर्ता नाम' ];
$पासवर्ड  = $_POST[ 'पासवर्ड' ];
$प्रश्न = sprintf("FIRST_NAME का चयन करें, LAST_NAME, users_table कहां उपयोगकर्ता नाम = 'से ACCOUNT_NUMBER%एस'और पासवर्ड ='%एस' ", $USER_NAME, $पासवर्ड);

 

htmlentities($था, ENT_QUOTES)

 

htmlentities() वैकल्पिक दूसरे quote_style पैरामीटर के साथ संयोजन के रूप में, की अनुमति देता का उपयोग ENT_QUOTES, डबल और एकल दोनों उद्धरण के साथ परिवर्तित करेगा जो. यह उसी भावना के रूप में काम करेंगे addslashes() और mysql_real_escape_string() उद्धरण चिह्नों के संबंध में, तथापि, बजाय एक बैकस्लैश prepending की, यह उद्धरण चिह्न के HTML इकाई का उपयोग करेगा.
 

उपयोग करने के अलावा ENT_QUOTES अंदर htmlentities(), एक तिहाई पैरामीटर रूपांतरण के भीतर निर्धारित एक चरित्र का उपयोग बलों जो सेट किया जा सकता है. इस का उपयोग करने से unpredicted परिणामों को रोकने में मदद मिलेगी multibyte चरित्र में अक्षर जैसे सेट बिग 5 और संकुल.
 

निम्नलिखित को रोकने में मदद मिलेगी जो कोड का एक उदाहरण है SQL इंजेक्शन PHP में.
 

1
2
3
4
5
$USER_NAME = $_POST[ 'उपयोगकर्ता नाम' ];
$USER_NAME = htmlentities( $USER_NAME, ENT_QUOTES, 'यूटीएफ -8' );
$पासवर्ड  = $_POST[ 'पासवर्ड' ];
$पासवर्ड  = htmlentities( $पासवर्ड, ENT_QUOTES, 'यूटीएफ -8' );
$प्रश्न = "FIRST_NAME का चयन करें, LAST_NAME, users_table कहां उपयोगकर्ता नाम = 'से ACCOUNT_NUMBER$USER_NAME'और पासवर्ड ='$पासवर्ड' ";

 

अनुकूलन एसक्यूएल कोड

 

डाटाबेस सर्वर जटिल जानवर हैं और वे आप की आवश्यकता की तुलना में बहुत अधिक कार्यक्षमता है. जहां तक ​​सुरक्षा का सवाल है, more is never better. For instance, the xp_cmdshell extended stored procedure in to gives access to the shell and this is just what a hacker dreams of. This is why you should disable this procedure and any other functionality, which can easily be misused. Just remove or at least disable any functionality you can do without.
 

डिफ़ॉल्ट SQL त्रुटि संदेश अक्षम

 

वे डेटाबेस और एसक्यूएल प्रश्नों के बारे में अतिरिक्त जानकारी दे क्योंकि त्रुटि संदेश एक हमलावर के लिए उपयोगी हैं. और सभी SQL हमलों आमतौर पर एसक्यूएल द्वारा जारी त्रुटि के प्रकार के आधार पर कर रहे हैं, यह त्रुटि की है कि प्रकार वेबसाइट या आवेदन हैकिंग के लिए हैकर्स दृष्टिकोण का फैसला करता है इसका मतलब. सुरक्षा से समझौता नहीं करता है कि एक बेहतर समाधान एक प्रदर्शित करने के लिए किया जाएगा सामान्य त्रुटि संदेश बस एक त्रुटि हो गई है कि राज्यों.
 

सुरक्षित डाटाबेस साख स्टोर

 

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

कम से कम विशेषाधिकार सिद्धांत का प्रयोग करें

 

कम से कम विशेषाधिकार के सिद्धांत बेहद फायदेमंद है और इसे करने के लिए लागू होता है एसक्यूएल इंजेक्शन भी. हमेशा लगता है कि या है के बारे में दो बार जांच विशेषाधिकार आप के लिए प्रदान कर रहे हैं उपयोगकर्ता या वस्तु. आप कुछ उपयोगकर्ता के लिए मध्यस्थ पहुँच प्रदान करने के लिए वान मान लीजिए, इतना ही उसे वह / वह की जरूरत है जो उन तालिकाओं का उपयोग प्रदान करते हैं, बल्कि उसे पूरे डेटाबेस का उपयोग साबित की तुलना. आप एक प्रणाली के लिए पहुँच प्रदान करने के लिए है, करने के लिए अपने बेहतर डेटाबेस के अंदर विभाजन तालिका रिक्त स्थान बनाने के लिए और केवल विशिष्ट तालिका अंतरिक्ष में पहुँच प्रदान. इस तकनीक से होगा काफी हमले सतह कम .
 

गोले अक्षम

 

कई डेटाबेस खोल उपयोग की पेशकश अनिवार्य रूप से क्या एक हमलावर या हैकर की जरूरत है जो डेटाबेस के लिए. आप इस खुले बचाव का रास्ता बंद करने की जरूरत है इस वजह से. प्रत्येक सेवा प्रदाता के लिए अलग तरीका है गोले के निष्पादन को निष्क्रिय अपने डेटाबेस पर. तो अपने विशेष डेटाबेस या तालिका अंतरिक्ष या विशेष मेज के लिए खोल पहुँच को अक्षम करने के बारे में अपने डाटाबेस के दस्तावेज देखें.
 

कमजोरियों की जाँच करने के लिए SQL इंजेक्शन उपकरण का प्रयोग करें

 

लेकिन कम से कम नहीं, हैकर की तरह लगता है. कैसे एक हैकर के माध्यम से अपने डेटाबेस हैक कर सकता है SQL इंजेक्शन, वह कमियां खोजने के लिए उपयोग कर सकते हैं क्या उपकरणों और तकनीकों. आप हमेशा की तरह SQL इंजेक्शन हैक उपकरणों की एक सूखी चलाने होना चाहिए SQLI, Haviz, एसक्यूएल injectme आदि. आप तो रेटिना भेद्यता स्कैनर बर्दाश्त कर सकते हैं और अधिक अगर इसकी भी अच्छा. यह सब नवीनतम उजागर कमजोरियों के होते हैं.

बहुत बहुत धन्यवाद. मैं आप सभी का आनंद लिया गया होगा आशा. हम और अधिक बेहतर कर सकते हैं ताकि टिप्पणी दे कृपया.

 
 

28,911 कुल देखा गया, 10 विचारों आज

निम्नलिखित दो टैब नीचे सामग्री को बदलने.

अशफाक अंसारी

सुरक्षा शोधक
अशफाक अंसारी के संस्थापक है HackSys टीम कोड नाम "पेंथेरा". उन्होंने कहा कि सूचना सुरक्षा के विभिन्न पहलुओं में अनुभव के साथ एक सुरक्षा शोधकर्ता है. उन्होंने लिखा है, "HackSys चरम कमजोर चालक" और "मौत की shellcode". उन्होंने यह भी लिखा है और निम्न स्तर के सॉफ्टवेयर शोषण पर विभिन्न whitepapers प्रकाशित किया है. उनकी कोर हित में निहित है "निम्न स्तर शोषण", "रिवर्स इंजीनियरिंग", "कार्यक्रम के विश्लेषण" और "हाइब्रिड Fuzzing". उन्होंने कहा कि आर्टिफिशियल इंटेलिजेंस और मशीन लर्निंग के एक fanboy है. उन्होंने कहा कि के लिए अध्याय का नेतृत्व है अशक्त पुणे.

एक उत्तर दें छोड़ दो

आपका ईमेल पता प्रकाशित नहीं किया जाएगा. आवश्यक क्षेत्रः चिह्नित कर रहे हैं *