मुझे उपयोगकर्ता से इनपुट के रूप में, एक निश्चित फ़ाइल का पथ मिलता है।

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

उदाहरण के लिए:

  • "उपयोगकर्ता/1/2/3" अच्छा है।
  • "उपयोगकर्ता/1/../2" अच्छा है।
  • "उपयोगकर्ता/1/../../2" अच्छा नहीं है ("उपयोगकर्ता/" फ़ोल्डर के बाहर जाता है)।
  • "माता-पिता/../उपयोगकर्ता/1/2/3" अच्छा है।

जावा में इसे जांचने का कोई आसान तरीका है?

2
Erel Segal-Halevi 14 मार्च 2017, 15:34
शायद normalize के बाद startsWith, देखें docs .oracle.com/javase/tutorial/आवश्यक/io/pathOps.html
 – 
user180100
14 मार्च 2017, 15:40
हां, उत्तर के रूप में पोस्ट क्यों न करें?
 – 
Markus Benko
14 मार्च 2017, 15:57
क्योंकि यह एक अस्पष्ट विचार है, उत्तर नहीं;)
 – 
user180100
14 मार्च 2017, 19:21

3 जवाब

कैसा रहेगा:-

boolean allowed = new File("the/path").getCanonicalPath().contains("User/");
1
Steve Smith 14 मार्च 2017, 15:40
क्यों "शामिल है" और "शुरू होता है" नहीं?
 – 
Erel Segal-Halevi
15 मार्च 2017, 13:55
आपके उदाहरण के अनुसार, "माता-पिता/../उपयोगकर्ता/1/2/3" सही लौटना चाहिए, लेकिन "उपयोगकर्ता/" से शुरू नहीं होता है। getCanonicalPath() पूरा पथ लौटाता है, इसलिए यह "c:\folder\User" जैसा कुछ होगा।
 – 
Steve Smith
15 मार्च 2017, 14:03

आप एक File दिए गए पथनाम और लूप से File#getParent() चेन:

public boolean check(final String pathname) throws IOException {
    for(File target = new File(pathname).getCanonicalFile();
        null != target;
        target = target.getParentFile()) {

        if("User".equals(target.getName())) {
            return true;
        }
    }
    return false;
}

बस File#getCanonicalFile() का उपयोग करके दिए गए पथनाम को हल करना याद रखें।

0
Izruo 14 मार्च 2017, 16:07

आप File#getCanonicalPathका इस्तेमाल कर सकते हैं. नीचे आप इसके जावाडोक का एक अंश पा सकते हैं।

इस सार पथनाम की विहित पथनाम स्ट्रिंग लौटाता है। ए विहित पथनाम निरपेक्ष और अद्वितीय दोनों है। सटीक परिभाषा विहित रूप प्रणाली पर निर्भर है। यह विधि पहले इसे परिवर्तित करती है यदि आवश्यक हो तो निरपेक्ष रूप में पथनाम, जैसे कि का आह्वान करके गेटएब्सोल्यूटपाथ () विधि, और फिर इसे अपने अद्वितीय रूप में मैप करता है a सिस्टम-निर्भर तरीका। इसमें आमतौर पर अनावश्यक नामों को हटाना शामिल होता है जैसे कि "।" और ".." पथनाम से, सांकेतिक लिंक का समाधान (on .) UNIX प्लेटफॉर्म), और ड्राइव अक्षरों को एक मानक मामले में परिवर्तित करना (on .) माइक्रोसॉफ्ट विंडोज प्लेटफॉर्म)।

-1
mike 14 मार्च 2017, 15:40