আমি খুঁজে পেয়েছি যে কিছু ইউআরএল সরাসরি পাঠানো হলে FilenameUtils.getName
অযাচিত ফলাফলগুলি ফেরত দেয় এবং শোষণগুলি এড়ানোর জন্য এটি আবৃত করা দরকার।
উদাহরণ স্বরূপ,
System.out.println(FilenameUtils.getName("http://www.google.com/.."));
আয়
..
আমি সন্দেহ করি যে কেউ অনুমতি দিতে চায়।
নিম্নলিখিত ফাংশনটি ঠিকঠাকভাবে কাজ করছে বলে মনে হচ্ছে এবং এর মধ্যে কয়েকটি পরীক্ষার কেস দেখায় এবং null
ফাইল নাম নির্ধারণ করা না গেলে এটি ফিরে আসে ।
public static String getFilenameFromUrl(String url)
{
if (url == null)
return null;
try
{
// Add a protocol if none found
if (! url.contains("//"))
url = "http://" + url;
URL uri = new URL(url);
String result = FilenameUtils.getName(uri.getPath());
if (result == null || result.isEmpty())
return null;
if (result.contains(".."))
return null;
return result;
}
catch (MalformedURLException e)
{
return null;
}
}
এটি নিম্নলিখিত উদাহরণে কয়েকটি সাধারণ পরীক্ষার কেস দ্বারা আবৃত রয়েছে:
import java.util.Objects;
import java.net.URL;
import org.apache.commons.io.FilenameUtils;
class Main {
public static void main(String[] args) {
validateFilename(null, null);
validateFilename("", null);
validateFilename("www.google.com/../me/you?trex=5#sdf", "you");
validateFilename("www.google.com/../me/you?trex=5 is the num#sdf", "you");
validateFilename("http://www.google.com/test.png?test", "test.png");
validateFilename("http://www.google.com", null);
validateFilename("http://www.google.com#test", null);
validateFilename("http://www.google.com////", null);
validateFilename("www.google.com/..", null);
validateFilename("http://www.google.com/..", null);
validateFilename("http://www.google.com/test", "test");
validateFilename("https://www.google.com/../../test.png", "test.png");
validateFilename("file://www.google.com/test.png", "test.png");
validateFilename("file://www.google.com/../me/you?trex=5", "you");
validateFilename("file://www.google.com/../me/you?trex", "you");
}
private static void validateFilename(String url, String expectedFilename){
String actualFilename = getFilenameFromUrl(url);
System.out.println("");
System.out.println("url:" + url);
System.out.println("filename:" + expectedFilename);
if (! Objects.equals(actualFilename, expectedFilename))
throw new RuntimeException("Problem, actual=" + actualFilename + " and expected=" + expectedFilename + " are not equal");
}
public static String getFilenameFromUrl(String url)
{
if (url == null)
return null;
try
{
// Add a protocol if none found
if (! url.contains("//"))
url = "http://" + url;
URL uri = new URL(url);
String result = FilenameUtils.getName(uri.getPath());
if (result == null || result.isEmpty())
return null;
if (result.contains(".."))
return null;
return result;
}
catch (MalformedURLException e)
{
return null;
}
}
}