2010-01-05 16 views
8

मैं एक SQL विवरण पर्ल में नीचे दिखाया गया है एक के समान है:एसक्यूएल तैयार कथन में मैं सिंगल और डबल कोट्स से कैसे बच सकता हूं?

my $sql="abc..TableName '$a','$b' "; 

$ एक नि: शुल्क पाठ जिसे एकल कोट, डबल कोट, पीठ और सामने के स्लैश वर्ण, आदि सहित कुछ भी समाहित कर सकता है

एसक्यूएल कथन कार्य करने के लिए ये वर्ण कैसे बच सकते हैं?

धन्यवाद।

my $sth = $dbh->prepare('UPDATE myTable SET myValue=? WHERE myValue=?'); 

$sth->execute('newValue','oldValue'); 

यह भी काम करना चाहिए:

my $oldValue = $dbh->quote('oldValue'); 
my $newValue = $dbh->quote('newValue'); 
$dbh->do("UPDATE myTable SET myValue=$newValue where myValue=$oldValue"); 

अभी भी बेहतर है, सबसे अच्छा अभ्यास बाँध मूल्यों का उपयोग करने के लिए है:

+3

'$ a' और' $ b' का 'सॉर्ट' फ़ंक्शन से संबंधित विशेष अर्थ है। आमतौर पर उनका उपयोग करने का अच्छा विचार नहीं है। कोड नमूने में छोटे चर नामों को छोड़कर। – daotoad

+0

[perl] टैग के अलावा, [PHP में एसक्यूएल इंजेक्शन को रोकने के लिए सबसे अच्छा तरीका] की नकल (http://stackoverflow.com/q/60174/90527)। कोड नमूने में एकमात्र व्यावहारिक अंतर निहित है। इसके अलावा, [एसक्यूएल इंजेक्शन हमलों से बचने का सबसे अच्छा तरीका क्या है?] (Http://stackoverflow.com/q/1973/)। – outis

उत्तर

21

आप ->quote विधि (आप DBI का उपयोग कर रहे कल्पना करते हुए) का उपयोग कर सकते संग्रहित प्रक्रिया कॉल के लिए, स्ट्रिंग का विस्तार होने के बाद कथन मानते हुए वैध SQL है। यह चालक/डीबी विशिष्ट हो सकता है तो वाईएमएमवी।

my $sth = $dbh->prepare("DBName..ProcName ?,? "); 
$sth->execute($a, $b); 
+0

मुझे स्पष्ट नहीं होने के लिए खेद है। मैं एक संग्रहीत प्रक्रिया के लिए एक कॉल कर रहा हूँ। उदाहरण नीचे जैसा होना चाहिए था: मेरा $ sql = "DBName..ProcName '$ a', '$ b'"; – Sam

+5

बाइंड पैरामीटर का उपयोग करना अभी भी संग्रहीत प्रक्रिया कॉल के लिए काम करना चाहिए। – mopoke

+0

और यदि यह स्पष्ट नहीं है, तो यदि आप बाध्य पैरामीटर का उपयोग कर रहे हैं और आप सम्मिलित करने से पहले अपने मानों पर मैन्युअल रूप से एकल उद्धरण से बच रहे हैं, तो कॉलम मान प्रत्येक एकल उद्धरण के लिए दो अनुक्रमिक सिंगल कोट्स के साथ समाप्त हो जाएगा। – RTF

9

तैयार कथन का उपयोग करें। परिवर्तक को एक के साथ बदलें? डीबीआई मैनपेज से उदाहरण प्राप्त करने के लिए:

$sql = 'SELECT * FROM people WHERE lastname = ?'; 
$sth = $dbh->prepare($sql); 
$sth->execute($user_input_here); 

आपके एसक्यूएल में उपयोगकर्ता इनपुट इंटरपोलेटिंग सुरक्षा छेद मांग रहा है।

+0

मुझे स्पष्ट नहीं होने के लिए खेद है। मैं एक संग्रहीत प्रक्रिया के लिए एक कॉल कर रहा हूँ। उदाहरण नीचे जैसा कुछ होना चाहिए: मेरा $ sql = "DBName..ProcName '$ a', '$ b'"; – Sam

6

यदि आप क्वेरी पैरामीटर प्लेसहोल्डर का उपयोग करते हैं, तो आपको तारों की सामग्री से बचने की आवश्यकता नहीं है।

my $sql="DBName..ProcName ?, ?"; 
$sth = $dbh->prepare($sql); 
$sth->execute($a, $b); 

यदि डीबीआई सही क्वेरी पैरामीटर का उपयोग कर रहा है, तो यह एसक्यूएल कथन से अलग-अलग आरडीबीएमएस को पैरामीटर मान भेजता है। मान SQL कथन स्ट्रिंग के साथ कभी संयुक्त नहीं होते हैं, इसलिए मानों को SQL इंजेक्शन का कारण बनने का अवसर कभी नहीं होता है।

यदि डीबीआई क्वेरी स्ट्रिंग में चर को इंटरपोल करके तैयार कथन "अनुकरण" कर रहा है, तो डीबीआई को सही भागने वाले तर्क को संभालना चाहिए ताकि आपको यह नहीं करना पड़े। विशेषज्ञों (जो लोग डीबीआई लिखते हैं और परीक्षण करते हैं) को चिंता करने दें कि यह कैसे करें।

3

आप का उपयोग नहीं करना चाहते हैं -> उद्धरण (किसी कारण से, इस समारोह DBI के अपने संस्करण पर नहीं चलता है) तो यह प्रयास करें:

$query=~s/\"/\\\"/g; 

मैं साथ भी ऐसा ही करते हैं सिंगल कोट्स और कॉमा भी सुरक्षित होने के लिए।

मेरे लिए ठीक काम करने लगता है ...!

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