2010-06-14 6 views
10

स्क्रिप्ट PHP में है और डीबी के रूप में मैं MySQL का उपयोग करता हूं। यहां स्क्रिप्ट ही है।क्या यह प्रश्न एसक्यूएल इंजेक्शन से सुरक्षित है?

$unsafe_variable = $_GET["user-input"]; 
$sql=sprintf("INSERT INTO table (column) VALUES('%s')",$unsafe_variable); 
mysql_query($sql); 

कुछ लोगों का कहना है कि उपयोगकर्ता चर $ करने के लिए ;DROP TABLE blah; स्ट्रिंग प्रदान करती है अगर यह तालिका हटाता unsafe_variable।

लेकिन मैं इस उदाहरण की कोशिश की,

http://localhost/test.php?user-input=DROP%20TABLE%20my_table 

लेकिन यह तालिका नहीं हटाया था, लेकिन इसके बजाय तालिका में एक नई पंक्ति (;DROP TABLE blah;) डाला।

क्या कोई मुझे बता सकता है कि एससीएल इंजेक्शन के साथ इस स्क्रिप्ट पर हमला करना संभव है?

+3

'mysqli' या' PDO' और उनके तैयार बयान होगा बेहतर विकल्प बनें। – Powerlord

+0

प्रश्न के सभी प्रतिभागियों के लिए बहुत बहुत धन्यवाद। मुझे सचमुच एहसास हुआ कि केवल 'स्प्रिंटफ' के साथ हम यह सुनिश्चित नहीं कर सकते कि हमारी क्वेरी ** एसक्यूएल-इंजेक्शन ** से सुरक्षित है। इस विशिष्ट उदाहरण के लिए न तो मैं और न ही प्रतिभागी एसक्यूएल-इंजेक्शन को निष्पादित करने का तरीका प्रस्तुत कर सकते हैं। लेकिन मुझे एक अच्छा एसक्यूएल उदाहरण मिला है जहां हम एससीएल-इंजेक्शन निष्पादित कर सकते हैं भले ही हम 'sprintf' का उपयोग करें। एसक्यूएल उदाहरण [यहां] (http://php.net/manual/en/function.mysql-real-escape-string.php "PHP ऑनलाइन मैनुअल") पाया जा सकता है। 'उदाहरण # 2 का एक अनुभाग देखें उदाहरण एसक्यूएल इंजेक्शन अटैक' – Bakhtiyor

उत्तर

13

यह विशेष इंजेक्शन काम नहीं करेगा क्योंकि PHP के mysql_query फ़ंक्शन केवल एक क्वेरी प्रति कॉल की अनुमति देता है।

$unsafe_variable = "admin') ON DUPLICATE KEY UPDATE password=MD5(CONCAT('knownsalt', 'newpassword'))#"; 

बेहतर घना mysql_real_escape_string समारोह का उपयोग करने के: हालांकि, निम्नलिखित अगर column एक प्राथमिक या अद्वितीय कुंजी है काम कर सकते हैं

$sql=sprintf("INSERT INTO table (column) VALUES(%s)", 
      mysql_real_escape_string($unsafe_variable)); 
mysql_query($sql); 
4

mysql_query() एक फ़ंक्शन में एकाधिक प्रश्नों के निष्पादन की अनुमति नहीं देता है। तो आप INSERT नहीं कर सकते हैं और फिर तालिका को ड्रॉ कर सकते हैं। लेकिन आपको इसे 'सुरक्षा' के रूप में भरोसा नहीं करना चाहिए। इसके बजाय parametrized प्रश्नों का प्रयोग करें। PHP की PDO लाइब्रेरी देखें।

हालांकि, वे किसी और चीज के बारे में बस कुछ भी बदल सकते हैं, संभवतः किसी अन्य तालिका से पासवर्ड फ़ील्ड को उस तालिका में रखने के लिए एक सबक्वायरी के रूप में चुनना ताकि वे हैश देख सकें।

+0

http://php.net/manual/en/function.mysql-query.php –

+0

डाउनवोट के लिए कोई कारण? तैयार कथन आमतौर पर 'mysql_real_escape_string' से सुरक्षित होते हैं। –

1

नहीं, sprintf बच नहीं करता है सामग्री उपयोग:

$unsafe_variable = mysql_real_escape_string($_GET["user-input"]); 
$sql=sprintf("INSERT INTO table (column) VALUES('%s')",$unsafe_variable); 
mysql_query($sql); 
1
mysql_real_escape_string($unsafe_variable) 
3

जबकि mysql_query केवल निष्पादित करने के लिए एक क्वेरी की अनुमति देता है, सामान्य रूप में इस प्रश्न के लिए सुरक्षित नहीं है। एक खतरनाक इनपुट आपकी क्वेरी का फायदा उठाने का एक उदाहरण है:

'); DROP TABLE my_table; -- 

'); शुरू में आपकी क्वेरी को बंद करने और एक खाली मान सम्मिलित होगा, लेकिन सम्मिलित निम्नलिखित निष्पादित करने के लिए अतिरिक्त प्रश्नों के लिए अनुमति देगा। फिर एक टेबल छोड़ने के बाद, -- अंत में एक टिप्पणी के रूप में निम्नलिखित सभी चीज़ों (यानी आपकी शेष क्वेरी) को चिह्नित करेगा।

किसी क्वेरी में उपयोग के लिए सुरक्षित रूप से इनपुट तैयार करने के लिए, mysql_real_escape_string का उपयोग करें।

+0

क्या आप यह कहना चाहते थे कि अगर मैं इस स्क्रिप्ट को चलाता हूं [http: //authoringtool/test.php? User-input = ');% 20DROP% 20TABLE% 20my_table2;% 20--] यह मेरे डीबी से my_table2 को हटा देगा? यदि नहीं, तो कृपया मुझे यह बताएं कि यह कैसे काम करता है, क्योंकि आपका उदाहरण my_table2 को हटा नहीं गया है :) – Bakhtiyor

+1

जैसा कि बताया गया है, 'mysql_query' एकाधिक क्वेरी निष्पादित करने का समर्थन नहीं करता है, लेकिन आपको अभी भी अपनी क्वेरी को सही तरीके से सुरक्षित करना चाहिए। –

1

कुछ लोग कहते हैं कि यदि उपयोगकर्ता असाइन करता है; ड्रॉप टेबल ब्लैह; परिवर्तनीय $ unsafe_variable के लिए स्ट्रिंग यह तालिका हटा देता है।

धैर्यपूर्वक यह मामला नहीं है - लेकिन अगर आपको समझ में नहीं आता है, तो आप यह नहीं बता सकते कि आपका कोड सुरक्षित है या नहीं। क्या आप यह जांचने के लिए यहां हर पंक्ति पोस्ट करने जा रहे हैं कि यह सुरक्षित है या नहीं?

उपरोक्त कोड क्या कर रहा है और समझौता करने के तरीके के बारे में एक लंबी व्याख्या में जाने के बिना (एसक्यूएल इंजेक्शन पहले से ही बहुत अच्छी तरह से प्रलेखित है - शुरुआत के लिए Google को आजमाएं) आपको हमेशा यह सुनिश्चित करना चाहिए कि आपका PHP कोड छोड़ने वाला कोई भी डेटा है जहां यह जा रहा है के लिए सही प्रतिनिधित्व में।

एक MySQL डेटाबेस मतलब यह है कि के लिए या तो:

1) mysql_real_escape_string के उत्पादन का उपयोग करें (और सुनिश्चित करें कि आप सही संसाधन संभाल पारित कर)

या

2) पैरामीटर बाध्यकारी का उपयोग करें।

कोड इंजेक्शन हमलों की उचित चर्चा आसानी से कई सौ पृष्ठों को भर सकती है - एसओ में जवाब देने के लिए थोड़ा सा। क्वेरी।

सी

0

मुझे लगता है कि उदाहरण के तुम कोशिश करने की आवश्यकता होगी http://localhost/test.php?user-input=';DROP%20TABLE%20my_table'

');values('%s खंड बंद कर देता है, और उसके बाद एक नया आदेश जारी करता है, drop table...

+0

यह काम नहीं करता है। – Bakhtiyor

2

एकमात्र तरीका आप होना चाहिए असुरक्षित चर को संभालना बाध्य पैरामीटर के साथ है।

से this page on how to prevent SQL injection पढ़ें।

संबंधित मुद्दे