2010-03-17 9 views
26

हमारे वेब ऐप को पीसीआई अनुपालन करने की आवश्यकता है, यानी इसे किसी भी क्रेडिट कार्ड नंबर को स्टोर नहीं करना चाहिए। ऐप एक मेनफ्रेम सिस्टम के लिए एक अग्रभाग है जो सीसी संख्याओं को आंतरिक रूप से संभालता है और - जैसा कि हमने अभी पाया है - कभी-कभी अभी भी इसकी प्रतिक्रिया स्क्रीन में से एक पर एक पूर्ण सीसी संख्या थूकता है। डिफ़ॉल्ट रूप से, इन प्रतिक्रियाओं की पूरी सामग्री डीबग स्तर पर लॉग होती है, और इनसे पार्स की गई सामग्री को कई अलग-अलग स्थानों में लॉग किया जा सकता है। तो मैं इस तरह के डेटा रिसाव के स्रोत का शिकार नहीं कर सकता। मुझे यह सुनिश्चित करना होगा कि हमारी लॉग फ़ाइलों में सीसी संख्याओं को मुखौटा किया गया हो।लॉग 4 जे के साथ लॉग फाइलों में क्रेडिट कार्ड नंबर कैसे मास्क करें?

रेगेक्स भाग कोई मुद्दा नहीं है, मैं रेगेक्स का पुन: उपयोग करूंगा जिसे हम पहले से ही कई अन्य स्थानों में उपयोग करते हैं। हालांकि मुझे लॉग 4 जे के साथ लॉग संदेश के हिस्से को बदलने के तरीके पर कोई अच्छा स्रोत नहीं मिल रहा है। फ़िल्टर अधिक सीमित लगते हैं, केवल यह तय करने में सक्षम होते हैं कि किसी विशेष ईवेंट को लॉग करना है या नहीं, लेकिन संदेश की सामग्री को बदल नहीं सकता है। मुझे Log4J के लिए ESAPI security wrapper API भी मिला जो पहली बार मुझे जो चाहिए वह करने का वादा करता है। हालांकि, स्पष्ट रूप से मुझे कोड में सभी लॉगर्स को ईएसएपीआई लॉगर क्लास के साथ बदलना होगा - बट में दर्द। मैं एक और पारदर्शी समाधान पसंद करेंगे।

कोई विचार है कि Log4J आउटपुट से क्रेडिट कार्ड नंबर कैसे निकालना है?

अपडेट:,

  • मैं + बजाय * साथ मुखौटा क्योंकि मैं बताना चाहता हूँ:

    public class CardNumberFilteringLayout extends PatternLayout { 
        private static final String MASK = "$1++++++++++++"; 
        private static final Pattern PATTERN = Pattern.compile("([0-9]{4})([0-9]{9,15})"); 
    
        @Override 
        public String format(LoggingEvent event) { 
         if (event.getMessage() instanceof String) { 
          String message = event.getRenderedMessage(); 
          Matcher matcher = PATTERN.matcher(message); 
    
          if (matcher.find()) { 
           String maskedMessage = matcher.replaceAll(MASK); 
           @SuppressWarnings({ "ThrowableResultOfMethodCallIgnored" }) 
           Throwable throwable = event.getThrowableInformation() != null ? 
             event.getThrowableInformation().getThrowable() : null; 
           LoggingEvent maskedEvent = new LoggingEvent(event.fqnOfCategoryClass, 
             Logger.getLogger(event.getLoggerName()), event.timeStamp, 
             event.getLevel(), maskedMessage, throwable); 
    
           return super.format(maskedEvent); 
          } 
         } 
         return super.format(event); 
        } 
    } 
    

    नोट्स: @ pgras के मूल विचार के आधार पर, यहाँ एक काम समाधान है इसके अलावा जब सीआईडी ​​को इस लॉगर द्वारा मुखौटा किया गया था, मामलों से जब यह बैकएंड सर्वर द्वारा किया गया था, या जो भी

  • मैं एक सरल regex का उपयोग करता हूं क्योंकि मैं झूठी सकारात्मक

कोड इकाई परीक्षण किया गया है, इसलिए मुझे काफी आश्वस्त है कि यह ठीक से काम करता है। बेशक, अगर आप इसे सुधारने के लिए किसी भी संभावना का पता, मुझे पता है :-)

+1

यह सुनिश्चित नहीं है कि आप ईवेंट को पहले स्ट्रिंग करने के लिए सुपर पार्स क्यों नहीं देते हैं और फिर इसे फ़िल्टर करते हैं। आप अपने आप को बहुत कोडिंग छोड़ देंगे। –

+0

धन्यवाद दोस्तों - आपने मेरी जिंदगी बचाई ... !! – user381878

+0

@ avok00, क्योंकि LoggingEvent अपरिवर्तनीय है। –

उत्तर

13

आप अपनी खुद की layout लिख सकते हैं और सभी appenders के लिए कॉन्फ़िगर कर सकता है तो कृपया ...

लेआउट एक प्रारूप विधि है जो एक बनाता है लॉगिंग संदेश से स्ट्रिंग जिसमें लॉगिंग संदेश होता है ...

+0

आप अपना नया लेआउट उस मौजूदा व्यक्ति का समग्र बना सकते हैं जिसका आप उपयोग कर रहे हैं: उसमें कुछ भी प्रतिनिधि जो आपकी नियमित अभिव्यक्ति से मेल नहीं खाता है, और फिर क्रेडिट कार्ड नंबर –

+0

युक्त लाइन को हटाएं या तारांकित करें, यह व्यवहार्य प्रतीत होता है। हालांकि मैं इस मामले में एकत्रीकरण पर उपclassing पसंद करेंगे।आइए इसका प्रयोग थोड़ा सा करें ... –

4

क्रेडिट कार्ड नंबर मास्किंग का बेहतर कार्यान्वयन http://adamcaudill.com/2011/10/20/masking-credit-cards-for-pci/ पर है। आप जारीकर्ता और चेकसम लॉग करना चाहते हैं, लेकिन पैन (प्राथमिक खाता संख्या) नहीं।

+2

अच्छा, बेहतर रिश्तेदार है :-) इस मामले में मैं जारीकर्ता को लॉग इन नहीं करना चाहता हूं और न ही चेकसम। मुझे वास्तव में कंक्रीट कार्ड नंबर में दिलचस्पी नहीं है - हमें लॉग इन या कुछ भी खोजने की ज़रूरत नहीं है। यही कारण है कि मुझे झूठी सकारात्मकताओं की परवाह नहीं है। एकमात्र बिंदु यह है कि किसी भी पूर्ण कार्ड नंबर को लॉग में कभी नहीं मिलेगा। लेकिन मैं मानता हूं कि अन्य मामलों में, एडम का समाधान बेहतर हो सकता है। –