将路径限制在文件夹内
Constraint a path to be within a folder
假设您想将文件存储在文件夹中 C:\A\B\C
并让用户提供文件名。
把它们结合起来,对吗?
错了。
如果用户选择 \..\..\Ha.txt
you might be in for a surprise.
那么我们如何将结果限制在 C:\A\B\C
以内呢?如果它在子文件夹中就可以了,只是不要超过它。
如果您要文件名,那么它应该只是文件名。您授予用户对子目录的控制权越多,他们就越能打扰您。
这里的想法是用两个可能的斜线(/
和 \
)分割您的路径,并查看数组中任何条目的值是否为 ..
。
string input = @"\..\..\Ha.txt";
bool containsBadSegments = input
.Split(new [] { '/', '\' })
.Any(s => s is "..");
这个答案只负责检测路径中的 \..\
。还有很多其他方法可以输入错误的值,例如 OS 的文件系统不允许的字符,或者绝对路径或根路径。
我用过我的一个测试项目,真的没关系:
使用 c#10
internal class Program
{
static void Main(string[] args)
{
string template = @"F:\Projectes\Test\SourceGenerators";
string folder = @"..\..\..\..\Test1.sln";
Console.WriteLine(MatchDirectoryStructure(template, folder)
? "Match"
: "Doesn't match");
}
static bool MatchDirectoryStructure(string template, string folder)
=> new DirectoryInfo(folder).FullName.StartsWith(template);
}
如您所见,new DirectoryInfo(fileName).FullName;
returns目录的真实名称。
从这里您可以检查它是否与所需结果匹配。
在这种情况下,返回值为:
Match
假设您想将文件存储在文件夹中 C:\A\B\C
并让用户提供文件名。
把它们结合起来,对吗?
错了。
如果用户选择 \..\..\Ha.txt
you might be in for a surprise.
那么我们如何将结果限制在 C:\A\B\C
以内呢?如果它在子文件夹中就可以了,只是不要超过它。
如果您要文件名,那么它应该只是文件名。您授予用户对子目录的控制权越多,他们就越能打扰您。
这里的想法是用两个可能的斜线(/
和 \
)分割您的路径,并查看数组中任何条目的值是否为 ..
。
string input = @"\..\..\Ha.txt";
bool containsBadSegments = input
.Split(new [] { '/', '\' })
.Any(s => s is "..");
这个答案只负责检测路径中的 \..\
。还有很多其他方法可以输入错误的值,例如 OS 的文件系统不允许的字符,或者绝对路径或根路径。
我用过我的一个测试项目,真的没关系:
使用 c#10
internal class Program
{
static void Main(string[] args)
{
string template = @"F:\Projectes\Test\SourceGenerators";
string folder = @"..\..\..\..\Test1.sln";
Console.WriteLine(MatchDirectoryStructure(template, folder)
? "Match"
: "Doesn't match");
}
static bool MatchDirectoryStructure(string template, string folder)
=> new DirectoryInfo(folder).FullName.StartsWith(template);
}
如您所见,new DirectoryInfo(fileName).FullName;
returns目录的真实名称。
从这里您可以检查它是否与所需结果匹配。
在这种情况下,返回值为:
Match