2011-07-11 13 views
9

क्या कोई फ़ंक्शन या लाइब्रेरी है जिसका उपयोग उपयोगकर्ता इनपुट को साफ करने के लिए किया जा सकता है। उदाहरण के लिए यदि उपयोगकर्ता baily's नामक एक टेक्स्ट इनपुट करता है तो मुझे इसे mysql क्वेरी पर भेजने से पहले ' से बचना चाहिए। इसी प्रकार मैं शून्य वर्णों को फ़िल्टर करने में सक्षम होना चाहिए और \ n, \ t, \ r आदि .. PHP में की तरह हमारे पास mysql_real_escape_string($input) है ऐसा करने के लिए जावा में कुछ भी है?जावा में स्ट्रिंग की सफाई

+0

यदि आप एक ओआरएम परत (जो जावा में सामान्य प्रथा है) का उपयोग करते हैं या यहां तक ​​कि केवल नामित या समेकित पैरामीटर वाले स्टेटमेंट्स तो SQL पैरामीटर से बचने के लिए स्वचालित रूप से आपके लिए किया जाएगा। जब तक आप अपने प्रश्नों को बनाने के लिए तारों को मैन्युअल रूप से संयोजित नहीं कर रहे हैं, तो आपको सुरक्षित होना चाहिए। – aroth

+1

** यह भी देखें: ** ['जेडीबीसी - एसक्यूएल क्वेरी के साथ उपयोगकर्ता द्वारा आपूर्ति किए गए पैरामीटर से कैसे बचें]] (http://stackoverflow.com/questions/4954002/jdbc-how-to-escape-user-supplied- मापदंडों-साथ एक एसक्यूएल क्वेरी) –

उत्तर

11

जावा में, आप आमतौर पर इस हाथ से नहीं करते हैं।

इसके बजाय आप एक PreparedStatement का उपयोग करें और स्पष्ट setString() या setObject() विधियों के माध्यम से अपने SQL विवरण के लिए किसी भी बहस में पास भेज देंगे।

इस तरह JDBC ड्राइवर यह संभाल लेंगे (या तो आवश्यक एस्केपिंग करके या SQL बयान अलग तर्क के रूप में, डीबी के आधार पर भेज कर)।

उदाहरण के लिए, अपने कोड है कि दिखाई दे सकता है (prepareStatement() उपयोग करते हुए):

Connection c = ...; // get Connection from somehwere 
PreparedStatement stmt = c.prepareStatement("SELECT * FROM BOOKS WHERE TITLE = ?"); 
stmt.setString(1, userInput); 
ResultSet result = stmt.executeQuery(); 
2

आपको PreparedStatement का उपयोग करना चाहिए और setString फ़ंक्शन का उपयोग करके $input के मान सेट करना चाहिए।

PreparedStatement उपयोग करने का कारण एक प्रत्येक डेटाबेस अलग अलग चीजें बचने के लिए आवश्यकता हो सकती है है। यह जटिलता डेटाबेस विक्रेता द्वारा प्रदत्त PreparedStatement के ठोस कार्यान्वयन में छिपी हुई है।

4

आप इस के लिए प्लेसहोल्डर वाला तैयार बयान का उपयोग करें। देखें http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html

वैसे ही जैसे आप PHP में कार्य करना चाहिए: http://php.net/manual/en/pdo.prepared-statements.php

मैं कोई अपराध मतलब जब मैं कहना है कि केवल बेवकूफ प्लेसहोल्डर के साथ तैयार बयान के पक्ष में mysql_real_escape_string का प्रयोग करेंगे।

1

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

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

2

लघु जवाब, नहीं, "क्लीन" की बहुत सटीक परिभाषा देखने के लिए छोड़कर। फिलहाल आपको एक भाषा विशिष्ट समाधान का उपयोग करना होगा - एसक्यूएल के लिए, बस एक तैयार कथन का उपयोग करें।

लंबा उत्तर, स्वचालित स्ट्रिंग सैनिटाइजर्स पर हाल ही में काम किया गया है जो पता लगाता है कि सादा पाठ सामग्री को सुरक्षित रूप से & अन्य भाषाओं में सामग्री में कैसे शामिल किया जाए।

स्वत: प्रासंगिक ऑटो escapers, Soy, Go तरह टेम्पलेट भाषाओं में एचटीएमएल के लिए मौजूद हैं jQuery, cTemplates, ClearSilver और उम्मीद है कि जल्द ही अन्य लोगों का एक संस्करण।

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

JSONValue   := JSONNullLiteral 
         | JSONBooleanLiteral 
         | JSONObject 
         | JSONArray 
         | JSONString 
         | JSONNumber         ; 
JSONObject   := @KeyValueMap ([{] JSONMemberList? [}])  ; 
JSONMemberList  := JSONMember ([,] JSONMemberList)?    ; 
JSONMember   := @Key JSONString [:] @Value JSONValue   ; 
JSONNullLiteral  := @ValueNull "null"        ; 
JSONBooleanLiteral := @ValueFalse "false" | @ValueTrue "true"  ; 
JSONArray   := @List("[" (JSONValue ([,] JSONValue)*)? "]") ; 
JSONString   := @String ([\"] JSONStringCharacters? [\"])  ; 
JSONNumber   := @Number (Sign? (Mantissa Exponent? | Hex)) ; 
JSONStringCharacters := JSONStringCharacter JSONStringCharacters?  ; 
JSONStringCharacter := @Char ([^\"\\\x00-\x1f]) 
         | JSONEscapeSequence       ; 
JSONEscapeSequence := "\\" @Char [/\\\"] 
         | @Char{[\x08]} "\\b" 
         | @Char{[\x0c]} "\\f" 
         | @Char{[\x0a]} "\\n" 
         | @Char{[\x0d]} "\\r" 
         | @Char{[\x09]} "\\t" 
         | @Char ("\\u" @Scalar (hex hex hex hex))  ; 
Mantissa    := (Integer ([.] Fraction?) | [.] Fraction)  ; 
Exponent    := [Ee] Sign? decimal+       ; 
Integer    := [0] | [1-9] [0=9]*       ; 
Fraction    := [0-9]+          ; 
Hex     := [0] [Xx] hex+         ; 
Sign     := [+\-]           ; 

हम नीचे की तरह एक राज्य मशीन का निर्माण कर सकते हैं::

नीचे जो एनोटेशन शामिल की तरह एक व्याकरण है कि दिखाने के लिए भाषा भीतर सबस्ट्रिंग करने के लिए डेटा नक्शे की संरचना को देखते हुए

enter image description here

जो घटनाओं के अनुक्रमों को परिवर्तित करता है (प्रारंभ, start_object, start_key, वर्ण 'x', ...) उन निर्देशों में जो वर्णों को एक बफर पर एन्कोड करते हैं।

उस राज्य मशीन से हम एन्कोडर्स के लिए कुशल कोड उत्पन्न करने के लिए उपयोग करने के लिए निर्देशों के सामान्य निशान भी उत्पन्न कर सकते हैं, और उम्मीद है कि संदर्भ विश्लेषण एल्गोरिदम जो यह पता लगाते हैं कि कौन से एन्कोडर्स लागू होते हैं।

इस काम करता है तो वह स्वत: & सुरक्षित रूप से एसक्यूएल, एचटीएमएल, आदि जैसी भाषाओं में सामग्री रचना भाषा परिभाषाओं को तोड़ मरोड़ के साथ करने के लिए तंत्र की सीमाओं को खोजने के लिए execute_query अनुमति देने के लिए यह आसान सामान्य प्रयोजन प्रोग्रामिंग भाषाओं में शामिल करना होगा, execute_query("SELECT * FROM Table WHERE ID=$ID") में प्रोग्रामर-निर्दिष्ट-सामग्री और इंजेक्शन सामग्री के बीच और इंजेक्शन सामग्री से स्वचालित रूप से बचने के लिए उन लोगों का उपयोग करें, हम उस मुहावरे को प्रोग्रामर के इरादे से ही काम कर सकते हैं।

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