जावा - एसक्यूएल इंजेक्शन को रोकने के लिए स्ट्रिंग से बच


146

मैं जावा में जगह-जगह कुछ एंटी एसक्यूएल इंजेक्शन लगाने की कोशिश कर रहा हूं और "रिप्लेसमेंट" स्ट्रिंग फंक्शन के साथ काम करना बहुत मुश्किल हो रहा है। अंततः मुझे एक फ़ंक्शन की आवश्यकता है जो किसी भी मौजूदा \को \\, किसी "को \", किसी 'को \', और किसी \nको भी परिवर्तित कर देगा , \\nजब स्ट्रिंग का मूल्यांकन MySQL SQL इंजेक्शन द्वारा किया जाएगा।

मैं कुछ कोड के साथ काम कर रहा हूं जिनके साथ मैं काम कर रहा था और सभी \\\\\\\\\\\समारोह मेरी आंखों को पागल बना रहे थे। अगर किसी को भी इसका उदाहरण मिलता है तो मैं इसकी बहुत सराहना करूंगा।


1
ठीक है, मैं उस नतीजे पर आया हूं जो कि जाने के लिए रेडीस्टेक्टमेंट्स रास्ता है, लेकिन वर्तमान में मौजूद प्रतिबंधों के आधार पर मुझे आगे बढ़ने की आवश्यकता है क्योंकि मूल रूप से योजना बनाई गई थी और वर्तमान समय में एक मील का पत्थर रखा गया था और एक बार जब वर्तमान मील का पत्थर तक पहुंचा जा सकता है तैयार होकर डेटाबेस तैयार करने के लिए वापस जाएं। इस दौरान गति बनाए रखने के लिए, क्या किसी के पास जावा को दिए गए MySQL के लिए उपरोक्त वर्णों को प्रभावी रूप से बचने का कोई उपाय है और यह नियमित अभिव्यक्ति प्रणाली है, जिससे बचने के लिए आवश्यक संख्या में काम करने के लिए एक पूर्ण पीड़ा होती है ....
स्कॉट बॉनर

2
सभी SQL स्टेटमेंट्स पैरामीटरेटेबल नहीं हैं, उदाहरण के लिए "SET ROLE role_name" या "LISTEN channel_name"
नील

1
@NeilMcGuigan हां। अधिकांश ड्राइवर भी कुछ को पैरामीटर करने से मना कर देंगे जैसे CREATE VIEW myview AS SELECT * FROM mytable WHERE col = ?कि मुख्य बयान एक डीडीएल -स्टेटमेंट है, भले ही आप जिस हिस्से को पैरामीटर बनाने की कोशिश कर रहे हैं वह वास्तव में डीएमएल है
SeldomNeedy

जवाबों:


249

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

public insertUser(String name, String email) {
   Connection conn = null;
   PreparedStatement stmt = null;
   try {
      conn = setupTheDatabaseConnectionSomehow();
      stmt = conn.prepareStatement("INSERT INTO person (name, email) values (?, ?)");
      stmt.setString(1, name);
      stmt.setString(2, email);
      stmt.executeUpdate();
   }
   finally {
      try {
         if (stmt != null) { stmt.close(); }
      }
      catch (Exception e) {
         // log this error
      }
      try {
         if (conn != null) { conn.close(); }
      }
      catch (Exception e) {
         // log this error
      }
   }
}

कोई फर्क नहीं पड़ता कि नाम और ईमेल में कौन से वर्ण हैं, उन वर्णों को सीधे डेटाबेस में रखा जाएगा। वे किसी भी तरह से INSERT के बयान को प्रभावित नहीं करेंगे।

विभिन्न डेटा प्रकारों के लिए अलग-अलग सेट विधियां हैं - जो आप उपयोग करते हैं वह इस बात पर निर्भर करता है कि आपके डेटाबेस फ़ील्ड क्या हैं। उदाहरण के लिए, यदि आपके पास डेटाबेस में एक INTEGER कॉलम है, तो आपको एक setIntविधि का उपयोग करना चाहिए । डेटा तैयार करने और प्राप्त करने के लिए तैयार किए गए सभी अलग-अलग तरीकों की सूची तैयार करता है।


1
इस विधि के माध्यम से आप हर पैरामीटर को एक स्ट्रिंग के रूप में मान सकते हैं और अभी भी सुरक्षित हो सकते हैं? मैं अपने मौजूदा आर्किटेक्चर को अपडेट करने का एक तरीका निकालने की कोशिश कर रहा हूं ताकि पूरे डेटाबेस लेयर को फिर से बनाए बिना सुरक्षित
रहें

1
सभी dynqmic SQL बस तार है, इसलिए यह पूछने के लिए सवाल नहीं है। मैं ReadyStatement से परिचित नहीं हूं, इसलिए असली सवाल यह है कि यह एक पैरामीटर क्वेरी बनाता है जिसे तब ExecuteUpdate के साथ निष्पादित किया जा सकता है। यदि हाँ, तो यह अच्छा है। यदि नहीं, तो यह केवल समस्या को छिपा रहा है, और आपके पास डेटाबेस परत को फिर से डिज़ाइन करने के अलावा कोई सुरक्षित विकल्प नहीं हो सकता है। एसक्यूएल इंजेक्शन से निपटना उन चीजों में से एक है जिन्हें आपको शुरुआत से डिजाइन करना है; यह ऐसा कुछ नहीं है जिसे आप बाद में आसानी से जोड़ सकते हैं।
नायलॉन बिल्ली

2
यदि आप एक INTEGER फ़ील्ड में सम्मिलित कर रहे हैं, तो आप 'setInt' का उपयोग करना चाहेंगे। इसी तरह, अन्य संख्यात्मक डेटाबेस फ़ील्ड अन्य सेटर्स का उपयोग करेंगे। मैंने सभी तैयार प्रकारों की सूची तैयार करने वाले डॉस्टेडमेंट डॉक्स के लिए एक लिंक पोस्ट किया।
कालेब ब्रेज़े

2
हाँ Cylon, ReadyedStatements पैरामीटरयुक्त प्रश्न उत्पन्न करते हैं।
कालेब ब्रेज़े

2
@ कालेब ब्रासी, धन्यवाद। यह जानकर अच्छा लगा। उपकरण प्रत्येक वातावरण में भिन्न होते हैं, लेकिन पैरामीटर किए गए प्रश्नों के लिए नीचे उतरना मौलिक उत्तर है।
नायलॉन बिल्ली

46

SQL इंजेक्शन को रोकने का एकमात्र तरीका पैरामीटरलाइज्ड SQL है। यह केवल एक फिल्टर का निर्माण करना संभव नहीं है जो कि उन लोगों की तुलना में अधिक स्मार्ट है जो SQL को एक जीवित के लिए हैक करते हैं।

इसलिए सभी इनपुट, अपडेट और जहां क्लॉज़ हैं, वहां पैरामीटर का उपयोग करें। डायनेमिक SQL केवल हैकर्स के लिए एक खुला दरवाजा है, और जिसमें संग्रहीत प्रक्रियाओं में डायनेमिक SQL शामिल है। परिमाप करना, मापना, परिमाण करना।


11
और यहां तक ​​कि पैरामीटर किए गए SQL 100% गारंटी नहीं है। लेकिन यह बहुत अच्छी शुरुआत है।
duffymo

2
@duffymo, मैं मानता हूं कि कुछ भी कभी भी 100% सुरक्षित नहीं है। क्या आपके पास SQL ​​इंजेक्शन का एक उदाहरण है जो कि पैरामीटर किए गए SQL के साथ भी काम करेगा?
कोलेन कैट

3
@ काइल कैट: निश्चित रूप से, जब एसक्यूएल का एक हिस्सा (जैसे @WhereClause या @tableName) को पैरामीटर के रूप में पारित किया जाता है, एसक्यूएल में संक्षिप्त किया जाता है, और गतिशील रूप से निष्पादित किया जाता है। SQL इंजेक्शन तब होता है जब आप उपयोगकर्ताओं को अपना कोड लिखने देते हैं। इससे कोई फर्क नहीं पड़ता कि आप उनके कोड को एक पैरामीटर के रूप में कैप्चर करते हैं या नहीं।
स्टीव कास

16
BTW, मुझे नहीं पता कि इसका अधिक उल्लेख क्यों नहीं किया गया है, लेकिन रेडीस्टेडमेंट्स के साथ काम करना बहुत आसान और बहुत अधिक पठनीय है। अकेले ही शायद उन्हें हर उस प्रोग्रामर के लिए डिफ़ॉल्ट बना देता है जो उनके बारे में जानता है।
ईडन मौर

3
कृपया ध्यान दें कि कुछ डेटाबेस के लिए ReadyedStatements बनाने के लिए बहुत महंगे हैं, इसलिए यदि आपको उनमें से बहुत कुछ करने की आवश्यकता है, तो दोनों प्रकारों को मापें।
थोरबजोरन रावन एंडर्सन

36

यदि वास्तव में आप डिफेंस ऑप्शन का उपयोग नहीं कर सकते हैं 1: तैयार स्टेटमेंट (पैरामीटर क्वेरी) या डिफेंस ऑप्शन 2: स्टोर्ड प्रोसीजर , अपना खुद का टूल न बनाएं , OWASP एंटरप्राइज सिक्योरिटी एपीआई का उपयोग करें । से OWASP ESAPI गूगल कोड पर होस्ट:

अपने स्वयं के सुरक्षा नियंत्रण न लिखें! जब हर वेब एप्लिकेशन या वेब सेवा के लिए सुरक्षा नियंत्रण विकसित करने की बात आती है, तो पहिया को फिर से चालू करना व्यर्थ समय और बड़े पैमाने पर सुरक्षा छेदों की ओर जाता है। OWASP एंटरप्राइज सिक्योरिटी एपीआई (ESAPI) टूलकिट सॉफ्टवेयर डेवलपर्स को सुरक्षा से संबंधित डिजाइन और कार्यान्वयन की खामियों से बचाने में मदद करता है।

अधिक जानकारी के लिए, जावा और SQL इंजेक्शन निवारण धोखा शीट में SQL इंजेक्शन को रोकना देखें

डिफेंस ऑप्शन 3 पर विशेष ध्यान दें : ऑल यूजर सप्लीमेंट इनपुट से बचना जो OWASP ESAPI प्रोजेक्ट का परिचय देता है )।


4
ईएसएपीआई आज की तरह ही दोषपूर्ण है। AWS पर WAF है जो SQL इंजेक्शन, XSS आदि के खिलाफ मदद कर सकता है क्या इस बिंदु पर कोई अन्य विकल्प हैं?
क्रिसऑडनी

@ क्रिसहेडनी A WAF को आसानी से बाईपास किया जा सकता है। अधिकांश फ्रेमवर्क पहले से ही अपने स्वयं के एसक्यूएल-इंजेक्शन रोकथाम को लागू करते हैं जिसमें वे अपने आप ही मापदंडों से बच जाते हैं। विरासत परियोजनाओं के लिए विकल्प: owasp.org/index.php/…
आर।

19

(यह मूल प्रश्न के तहत ओपी की टिप्पणी के जवाब में है; मैं पूरी तरह से सहमत हूं कि रेडीस्टेडमेंट इस नौकरी के लिए उपकरण है, न कि रेगेक्स।)

जब आप कहते हैं कि \n, आप अनुक्रम मतलब है \+ nया एक वास्तविक linefeed चरित्र? यदि यह \+ है n, तो कार्य बहुत सीधा है:

s = s.replaceAll("['\"\\\\]", "\\\\$0");

इनपुट में एक बैकस्लैश का मिलान करने के लिए, आप उनमें से चार को रेगेक्स स्ट्रिंग में डालते हैं। आउटपुट में एक बैकस्लैश डालने के लिए, आप उनमें से चार को प्रतिस्थापन स्ट्रिंग में डालते हैं। यह मान रहे हैं कि आप जावा स्ट्रिंग शाब्दिक के रूप में रेगी और रिप्लेसमेंट बना रहे हैं। यदि आप उन्हें किसी अन्य तरीके से बनाते हैं (उदाहरण के लिए, उन्हें फ़ाइल से पढ़कर), तो आपको वह सब करने की ज़रूरत नहीं है, जो डबल-एस्केपिंग है।

यदि आपके पास इनपुट में एक लाइनफीड चरित्र है और आप इसे एक एस्केप सीक्वेंस के साथ बदलना चाहते हैं, तो आप इनपुट के साथ दूसरा पास बना सकते हैं:

s = s.replaceAll("\n", "\\\\n");

या शायद आप दो बैकस्लैश चाहते हैं (मैं उस पर बहुत स्पष्ट नहीं हूं):

s = s.replaceAll("\n", "\\\\\\\\n");

1
टिप्पणी के लिए धन्यवाद, मुझे पसंद है जिस तरह से आपने सभी पात्रों को एक में किया था, मैं इसके बारे में सभी के लिए एक नियमित रूप से कम अभिव्यक्ति का तरीका बता रहा था ... मुझे यकीन नहीं है कि इस प्रश्न का उत्तर कैसे दिया जाए । अंतत: तैयारियों का उत्तर है, लेकिन मेरे वर्तमान उद्देश्य के लिए आपका उत्तर मुझे जिस उत्तर की आवश्यकता है, क्या आप परेशान होंगे, यदि मैंने पहले दिए गए विवरणों में से किसी एक के उत्तर का उत्तर दिया है, या एक जोड़े के बीच जवाब साझा करने का कोई तरीका है?
स्कॉट बॉनर

1
चूंकि यह सिर्फ एक अस्थायी कीचड़ है, इसलिए आगे बढ़ें और तैयार किए गए जवाबों में से एक को स्वीकार करें।
एलन मूर

12

ReadyedStatements अधिकांश में जाने का तरीका है, लेकिन सभी मामलों में नहीं। कभी-कभी आप अपने आप को एक ऐसी स्थिति में पाएंगे जहां एक क्वेरी, या इसका एक हिस्सा, बाद में उपयोग के लिए एक स्ट्रिंग के रूप में बनाया और संग्रहीत किया जाना चाहिए। की जाँच करें SQL इंजेक्शन रोकथाम चीट शीट पर OWASP साइट अधिक जानकारी और विभिन्न प्रोग्रामिंग भाषाओं में एपीआई के लिए।


1
OWASP चीटशीट को GitHub में स्थानांतरित कर दिया गया है। SQL इंजेक्शन चीट शीट अब यहां है: github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/…
theferrit32

10

तैयार स्टेटमेंट सबसे अच्छा समाधान है, लेकिन अगर आपको वास्तव में इसे मैन्युअल रूप से करने की आवश्यकता है तो आप StringEscapeUtilsअपाचे कॉमन्स-लैंग लाइब्रेरी से भी क्लास का उपयोग कर सकते हैं । इसकी एक escapeSql(String)विधि है, जिसका आप उपयोग कर सकते हैं:

import org.apache.commons.lang.StringEscapeUtils; … String escapedSQL = StringEscapeUtils.escapeSql(unescapedSQL);


2
संदर्भ के लिए: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/… वैसे भी, यह विधि केवल उद्धरण से बच जाती है और SQL इंजेक्शन के हमलों को रोकने के लिए नहीं लगती है।
पाको अबाटो

11
यह नवीनतम संस्करणों से हटा दिया गया था क्योंकि यह केवल एकल उद्धरण से बच रहा था
पीनी चेनी

2
यह उत्तर हटा दिया जाना चाहिए क्योंकि यह sql इंजेक्शन को रोकता नहीं है।
जवां आर।

9

पाठ को हटाने के लिए एक नियमित अभिव्यक्ति का उपयोग करना, जो SQL इंजेक्शन की आवाज़ का कारण बन सकता है जैसे SQL कथन डेटाबेस के माध्यम से भेजा जा रहा है Statement बजाय हैPreparedStatement

पहली बार में SQL इंजेक्शन को रोकने के सबसे आसान तरीकों में से एक का उपयोग करना है PreparedStatement , जो प्लेसहोल्डर्स का उपयोग करके SQL कथन में स्थानापन्न करने के लिए डेटा को स्वीकार करता है, जो डेटाबेस को भेजने के लिए SQL कथन बनाने के लिए स्ट्रिंग कॉनटेनटेशन पर भरोसा नहीं करता है।

अधिक जानकारी के लिए, जावा ट्यूटोरियल से तैयार स्टेटमेंट का उपयोग करना शुरू करने के लिए एक अच्छी जगह होगी।


6

यदि आप एक विरासत प्रणाली के साथ काम कर रहे हैं, या आपके पास बहुत PreparedStatementकम समय में एस पर स्विच करने के लिए बहुत सी जगहें हैं - यानी यदि अन्य उत्तरों द्वारा सुझाए गए सर्वोत्तम अभ्यास का उपयोग करने में कोई बाधा है, तो आप AntiSQLFilter आज़मा सकते हैं


5

आपको निम्न कोड की आवश्यकता है। एक नज़र में, यह किसी भी पुराने कोड की तरह लग सकता है जिसे मैंने बनाया था। हालाँकि, मैंने जो किया वह http://grepcode.com/file/repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.31.com/mysql/jdbc/PreparedStatement के स्रोत कोड को देख रहा था । जावा । फिर उसके बाद, मैंने ध्यान से सेटस्ट्रिंग (int पैरामीटरIndex, String x) कोड के माध्यम से उन पात्रों को ढूंढा जो इसे बचते हैं और इसे मेरी अपनी कक्षा में अनुकूलित किया है ताकि इसका उपयोग उन उद्देश्यों के लिए किया जा सके जिनकी आपको आवश्यकता है। आखिरकार, अगर यह उन पात्रों की सूची है जो ओरेकल बच जाते हैं, तो यह जानना वास्तव में सुरक्षा-वार आराम है। हो सकता है कि ओरेकल को अगले प्रमुख जावा रिलीज के लिए इस तरह की एक विधि को जोड़ने के लिए एक कुहनी से हलका धक्का देना पड़े।

public class SQLInjectionEscaper {

    public static String escapeString(String x, boolean escapeDoubleQuotes) {
        StringBuilder sBuilder = new StringBuilder(x.length() * 11/10);

        int stringLength = x.length();

        for (int i = 0; i < stringLength; ++i) {
            char c = x.charAt(i);

            switch (c) {
            case 0: /* Must be escaped for 'mysql' */
                sBuilder.append('\\');
                sBuilder.append('0');

                break;

            case '\n': /* Must be escaped for logs */
                sBuilder.append('\\');
                sBuilder.append('n');

                break;

            case '\r':
                sBuilder.append('\\');
                sBuilder.append('r');

                break;

            case '\\':
                sBuilder.append('\\');
                sBuilder.append('\\');

                break;

            case '\'':
                sBuilder.append('\\');
                sBuilder.append('\'');

                break;

            case '"': /* Better safe than sorry */
                if (escapeDoubleQuotes) {
                    sBuilder.append('\\');
                }

                sBuilder.append('"');

                break;

            case '\032': /* This gives problems on Win32 */
                sBuilder.append('\\');
                sBuilder.append('Z');

                break;

            case '\u00a5':
            case '\u20a9':
                // escape characters interpreted as backslash by mysql
                // fall through

            default:
                sBuilder.append(c);
            }
        }

        return sBuilder.toString();
    }
}

2
मुझे लगता है कि यह कोड उपरोक्त लिंक में स्रोत कोड का विघटित संस्करण है। अब नए में mysql-connector-java-xxx, case '\u00a5'और case '\u20a9'कथनों को हटा दिया गया लगता है
zhy

मैंने आपके कोड के साथ sqlmap की कोशिश की और इसने मुझे फ्रिस्ट अटैक से नहीं बचाया `टाइप: बूलियन-आधारित ब्लाइंड शीर्षक: और बूलियन-आधारित अंधा - WHERE या HAVING क्लॉज पेलोड: q = 1% 'और 54% = 5430 और'% ' = '`
शरीफ़

खेद है कि इसका काम कर रहा था, लेकिन पिछले संग्रहीत सत्र परिणामों को देख रहा था .. मैंने भविष्य के लिए टिप्पणी समान रखी ..
shareef

आप उपयोग कर सकते हैं org.ostermiller.utils.StringHelper.escapeSQL()या com.aoindustries.sql.SQLUtility.escapeSQL()
मोहम्मद एन्नहदी एल इदरीसी

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

0

लीगल सिस्टम के मामले में sql इंजेक्शन से sqlmap को रोकने के लिए समाधान की एक परीक्षण खोज करने के बाद, जहां हर जगह तैयार की गई मूर्तियां लागू नहीं हो सकती हैं।

जावा-सुरक्षा-क्रॉस-साइट-स्क्रिप्टिंग-xss-and-sql-injection विषय WAS THE SOLUTION था

मैंने @ रिचार्ड के समाधान की कोशिश की लेकिन मेरे मामले में काम नहीं किया। मैंने एक फिल्टर का इस्तेमाल किया

इस फ़िल्टर का लक्ष्य अनुरोध को स्वयं-कोडित आवरण MyHttpRequestWrapper में बदलना है।

विशेष वर्ण (<,>,, ...) के साथ HTTP पैरामीटर HTML कोड में org.springframework.web.util.HtmlUtils.htmlEscape (…) विधि के माध्यम से। नोट: Apache Commons में समान क्लैसे है: org.apache.commons.lang.StringEscapeUtils.escapeHtml (…) SQL इंजेक्शन वर्ण (“,”,…) एप्स कॉमन्स classe org.apache.commons.lring.StringEscapeUtils के माध्यम से। escapeSql (...)

<filter>
<filter-name>RequestWrappingFilter</filter-name>
<filter-class>com.huo.filter.RequestWrappingFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>RequestWrappingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>




package com.huo.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletReponse;
import javax.servlet.http.HttpServletRequest;

public class RequestWrappingFilter implements Filter{

    public void doFilter(ServletRequest req, ServletReponse res, FilterChain chain) throws IOException, ServletException{
        chain.doFilter(new MyHttpRequestWrapper(req), res);
    }

    public void init(FilterConfig config) throws ServletException{
    }

    public void destroy() throws ServletException{
    }
}




package com.huo.filter;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang.StringEscapeUtils;

public class MyHttpRequestWrapper extends HttpServletRequestWrapper{
    private Map<String, String[]> escapedParametersValuesMap = new HashMap<String, String[]>();

    public MyHttpRequestWrapper(HttpServletRequest req){
        super(req);
    }

    @Override
    public String getParameter(String name){
        String[] escapedParameterValues = escapedParametersValuesMap.get(name);
        String escapedParameterValue = null; 
        if(escapedParameterValues!=null){
            escapedParameterValue = escapedParameterValues[0];
        }else{
            String parameterValue = super.getParameter(name);

            // HTML transformation characters
            escapedParameterValue = org.springframework.web.util.HtmlUtils.htmlEscape(parameterValue);

            // SQL injection characters
            escapedParameterValue = StringEscapeUtils.escapeSql(escapedParameterValue);

            escapedParametersValuesMap.put(name, new String[]{escapedParameterValue});
        }//end-else

        return escapedParameterValue;
    }

    @Override
    public String[] getParameterValues(String name){
        String[] escapedParameterValues = escapedParametersValuesMap.get(name);
        if(escapedParameterValues==null){
            String[] parametersValues = super.getParameterValues(name);
            escapedParameterValue = new String[parametersValues.length];

            // 
            for(int i=0; i<parametersValues.length; i++){
                String parameterValue = parametersValues[i];
                String escapedParameterValue = parameterValue;

                // HTML transformation characters
                escapedParameterValue = org.springframework.web.util.HtmlUtils.htmlEscape(parameterValue);

                // SQL injection characters
                escapedParameterValue = StringEscapeUtils.escapeSql(escapedParameterValue);

                escapedParameterValues[i] = escapedParameterValue;
            }//end-for

            escapedParametersValuesMap.put(name, escapedParameterValues);
        }//end-else

        return escapedParameterValues;
    }
}

क्या यह अच्छा है java-security-cross-site-scripting-xss-and-sql-injection topic? मैं विरासत आवेदन के लिए एक समाधान खोजने की कोशिश कर रहा हूं।
caot

0

से: [स्रोत]

public String MysqlRealScapeString(String str){
  String data = null;
  if (str != null && str.length() > 0) {
    str = str.replace("\\", "\\\\");
    str = str.replace("'", "\\'");
    str = str.replace("\0", "\\0");
    str = str.replace("\n", "\\n");
    str = str.replace("\r", "\\r");
    str = str.replace("\"", "\\\"");
    str = str.replace("\\x1a", "\\Z");
    data = str;
  }
return data;

}


0

यदि आप PL / SQL का उपयोग कर रहे हैं तो आप भी उपयोग कर सकते हैं DBMS_ASSERT तो आप इसका उपयोग अपने इनपुट को भी सुरक्षित कर सकते हैं ताकि आप एसक्यूएल इंजेक्शन के बारे में चिंता किए बिना इसका उपयोग कर सकें।

उदाहरण के लिए यह उत्तर देखें: https://stackoverflow.com/a/21406499/1726419

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.