2010-03-16 13 views
5
$myq = sprintf("select user from table where user='%s'", $_POST["user"]); 

मैं जानना चाहता हूं कि उपरोक्त क्वेरी का उपयोग एसक्यूएल इंजेक्शन का उपयोग करके किया जा सकता है या नहीं। क्या कोई उन्नत एसक्यूएल इंजेक्शन तकनीक है जो इस विशेष क्वेरी के लिए sprintf तोड़ सकती है?क्या यह प्रश्न एसक्यूएल इंजेक्शन के लिए कमजोर है?

select user from table where user='' OR 1 = 1 OR user='' 

करता है कि देखने के लिए:

+0

क्या कोई कारण है कि आप mysql_real_escape_string का उपयोग करने का विरोध कर रहे हैं? –

+0

डुनो आपको यह कहां मिला, लेकिन स्प्रिंटफ कुछ भी नहीं बच निकला। –

+0

एसीटीएल यह एसक्यूएल इंजेक्शन खोजने के लिए असाइनमेंट का एक हिस्सा है। मैंने परिदृश्य को अपने स्थानीय में दोहराया और सभी सामान्य एसक्यूएल इंजेक्शन $ a = sprintf ("तालिका से उपयोगकर्ता का चयन करें जहां उपयोगकर्ता = '% s'", $ _POST ["user"]); echo $ मैं उद्धरण प्राप्त कर रहा हूं \। क्या मध्य में कुछ ऐसा है जो उद्धरण से बच सकता है? – user294924

उत्तर

25

मैं यह विशेष रूप से उन्नत होने की जरूरत है ...

' OR 1 = 1 OR user=' 

दूसरे शब्दों में की एक इनपुट की कोशिश, आप में से एसक्यूएल मिल जाएगा नहीं लगता कि एक प्रश्न की तरह आप वास्तव में निष्पादित करना चाहते हैं? (अब इसकी बजाय टेबल को छोड़ने या कुछ समान होने की संभावना पर विचार करें।)

निचली पंक्ति यह है कि आपको पैरामीटरयुक्त क्वेरी का उपयोग करना चाहिए।

+0

कोई उद्धरण से बचने के लिए sprintf नहीं है? – user294924

+2

नहीं, यह नहीं है। कम से कम PHP के साथ अपने अनुभव में नहीं। –

+1

@ user294924,% s प्रिंटफ उपप्रणाली को मुद्रित करने के लिए बताता है कि वेरिएबल तर्कों में जो भी स्ट्रिंग शामिल है। यह कोई जांच नहीं करता है, कोई फ़िल्टरिंग नहीं, कोई भाग नहीं रहा .. यह वही करता है जो आप इसे करने के लिए कहते हैं। –

4

जब $ _POST ["उपयोगकर्ता"] बराबर होगा "'; शट डाउन;" - क्या हुआ होगा?

+0

स्प्रिंटफ एकल उद्धरण से बच निकलेगा और डीबी को भेजी गई क्वेरी टेबल से उपयोगकर्ता का चयन करेगी जहां उपयोगकर्ता = '\'; शट डाउन; ' – user294924

+0

यदि पोस्टर mysqli_multi_query का उपयोग नहीं करता है, तो कुछ नहीं होगा क्योंकि PHP में अन्य सभी mysql क्वेरी विधियां केवल एक क्वेरी निष्पादित करती हैं। – chiborg

0
$_POST["user"] = "' or 1=1 or user='" 
0

हां।

अगर कोई आपके रूप में उपयोगकर्ता के रूप में निम्नलिखित में डाल:

'; delete * from table 
+2

हालांकि यह सामान्य mysql के साथ काम नहीं करेगा, उदाहरण के लिए यह अच्छा है। –

8

का उपयोग sprintf आप साधारण स्ट्रिंग संयोजन का उपयोग करने से किसी भी अधिक सुरक्षा नहीं देता है। sprintf का लाभ केवल सरल PHP की स्ट्रिंग concatenation का उपयोग करने के बजाय थोड़ा और अधिक पठनीय है। लेकिन sprintf जब %s प्रारूप का उपयोग कर सरल स्ट्रिंग संयोजन से किसी भी अधिक नहीं करता है:

$str = implode('', range("\x00", "\xFF"));  // string of characters from 0x00 – 0xFF 
var_dump(sprintf("'%s'", $str) === "'".$str."'"); // true 

आप कार्यों है कि आप (इस मामले में एक string declaration in MySQL में में अपने डेटा को सम्मिलित करना चाहते हैं प्रासंगिक विशेष वर्ण से बचें उपयोग करने की आवश्यकता, मान आप MySQL का उपयोग कर रहे) **mysql_real_escape_string** की तरह कार्य करता है:

$myq = sprintf("select user from table where user='%s'", mysql_real_escape_string($_POST["user"])); 
8

हाँ, मैं कहेंगे तुम वहाँ एक संभावित समस्या :)

आप need to escape है: 012,और \x1asprintf() does not do that, sprintf() तारों में कोई संशोधन नहीं करता है, यह आपके द्वारा निर्दिष्ट प्रारूप के अनुसार प्रदान किए गए बफर में जो कुछ भी विविध तर्क देता है, उसे विस्तारित करता है।

यदि तारों को बदल दिया जा रहा है, तो इसकी संभावना magic quotes (Rob टिप्पणियों में उल्लिखित) के कारण है, sprintf() नहीं। यदि ऐसा है, तो मैं अत्यधिक उन्हें अक्षम करने की अनुशंसा करता हूं।

+0

-1 क्योंकि: उसे उस से बहुत अधिक भागने की जरूरत है, और, यदि वह किसी भी प्रश्न में किसी को करना भूल जाता है, तो उसे पनड किया जाता है। निचली पंक्ति: संगत चरण से क्वेरी स्ट्रिंग बनाने के लिए एक अच्छा अच्छा, ** विशिष्ट ** कारण बेहतर होता है, अन्यथा, पैरामीटरकृत हमेशा उपयोग करें। – BryanH

+0

@ ब्रायनएच दो अन्य लोगों ने उन्हें बताया कि उन्हें पैरामीटरयुक्त प्रश्नों का उपयोग करने की आवश्यकता है। मैंने विशेष रूप से 'sprintf()' का उत्तर दिया क्योंकि ओपी को मुश्किल समय लग रहा था कि वह ऐसा क्यों नहीं कर रहा था जो उसने सोचा था कि यह कर रहा था (जॉन के जवाब के तहत टिप्पणियां देखें)। मैंने सुझाव नहीं दिया कि वह सिर्फ समेकित तारों का उपयोग करें :) –

1

आह यहाँ मैं जादू के जवाब के साथ आया हूँ! :)
magic quotes आपके लिए भाग रहा है!

तो, आपको
से magic_quotes_gpc ini निर्देश बंद करना होगा और फिर सुझाए गए mysql_real_escape_string का उपयोग करना होगा।

1

दरअसल, जादू उद्धरण बंद करें।

पीएचपी, जहां यह उचित, उपयोग फिल्टर है में:

$inUser = $_POST['user']; 
$outUser = filter_var($inUser, FILTER_SANITIZE_STRING); 

फिल्टर HTML टैग को निकाल देते हैं और विभिन्न वर्ण से बचें।

इसके अलावा, आप अपने डेटाबेस आप के लिए यह बच जाने कर सकते हैं:

$inUser = $_POST['user']; 
$outUser = mysqli_real_escape_string($conn, $inUser); 

यह डबल कोट, एकल कोट, आदि

अंत में, आप पैरामिट्रीकृत प्रश्नों का उपयोग करना चाहिए जैसे MySQL विशिष्ट विशेष वर्ण निकल जाता है :

$sql = "SELECT user FROM table WHERE user = ?"; 
$stmt = $pdo->prepare($sql); 
$params = array($outUser); 
$stmt->execute($params); 

parameterized क्वेरी को स्वचालित रूप से तार, आदि के आसपास उद्धरण जोड़ें, और कुछ अन्य प्रतिबंध है कि SQL इंजेक्शन भी अधिक di बनाते हैं fficult।

मैं उस क्रम में सभी तीनों का उपयोग करता हूं।

+0

अवांछित पोस्ट या GET, "mysqli_real_escape_string" या "FILTER_SANITIZE_STRING" फ़िल्टर करने के लिए उपयोग करना बेहतर है? – user345602

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