हमारे वेब ऐप को पीसीआई अनुपालन करने की आवश्यकता है, यानी इसे किसी भी क्रेडिट कार्ड नंबर को स्टोर नहीं करना चाहिए। ऐप एक मेनफ्रेम सिस्टम के लिए एक अग्रभाग है जो सीसी संख्याओं को आंतरिक रूप से संभालता है और - जैसा कि हमने अभी पाया है - कभी-कभी अभी भी इसकी प्रतिक्रिया स्क्रीन में से एक पर एक पूर्ण सीसी संख्या थूकता है। डिफ़ॉल्ट रूप से, इन प्रतिक्रियाओं की पूरी सामग्री डीबग स्तर पर लॉग होती है, और इनसे पार्स की गई सामग्री को कई अलग-अलग स्थानों में लॉग किया जा सकता है। तो मैं इस तरह के डेटा रिसाव के स्रोत का शिकार नहीं कर सकता। मुझे यह सुनिश्चित करना होगा कि हमारी लॉग फ़ाइलों में सीसी संख्याओं को मुखौटा किया गया हो।लॉग 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 का उपयोग करता हूं क्योंकि मैं झूठी सकारात्मक
कोड इकाई परीक्षण किया गया है, इसलिए मुझे काफी आश्वस्त है कि यह ठीक से काम करता है। बेशक, अगर आप इसे सुधारने के लिए किसी भी संभावना का पता, मुझे पता है :-)
यह सुनिश्चित नहीं है कि आप ईवेंट को पहले स्ट्रिंग करने के लिए सुपर पार्स क्यों नहीं देते हैं और फिर इसे फ़िल्टर करते हैं। आप अपने आप को बहुत कोडिंग छोड़ देंगे। –
धन्यवाद दोस्तों - आपने मेरी जिंदगी बचाई ... !! – user381878
@ avok00, क्योंकि LoggingEvent अपरिवर्तनीय है। –