【问题标题】:Ensure users can only save inside a folder确保用户只能保存在文件夹内
【发布时间】:2012-08-05 20:47:15
【问题描述】:

我有一个应用程序可以让用户从填充了一些数据的自定义模板中导出文件,现在他们可以选择保存到的位置。如果文件已经存在,它将根据他们的偏好覆盖它或生成一个新名称。

它将导出到的任何文件夹/文件名以及是否会覆盖该文件(如果存在或不存在)都存储在用户创建和保存的配置文件中。然后他所做的就是运行这个文件,应用程序将开始收集数据并导出这些文件。

所以危险在于我可以向您发送一个保存到 C 驱动器的配置文件,您需要做的就是打开并运行它,如果它们碰巧它可能会覆盖您在 C 驱动器上的文件有相同的名字。我正在考虑做的是让用户选择一个保存文件的文件夹,并将此首选项存储在配置文件中,但将其保存为用户首选项,因此如果我给您一个配置文件,该文件将导出到任何您选择导出到的文件夹。不过,配置文件将确定文件名。

很容易强制他们只输入有效的文件字符作为文件名(这将排除\ 字符),但我希望允许他们输入子文件夹和文件名,而不仅仅是文件名在配置文件中,以便他们可以更好地组织导出的文件。但如果我这样做,他们可以输入类似..\..\something_important.exe 的内容,这将保存在用户为其导出定义的文件夹之外。您如何确保他们可以输入类似\sub\subsub\myfile.txt 但不能输入..\..\myfile.txt 的路径。确保路径中没有..\ 字符串就足够了吗?有没有像..\ 这样的其他代码可以让他们在文件夹树上导航?

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    我建议您使用FolderBrowserDialog 来允许用户选择一个文件夹。这是用户可能有使用经验的常见对话框。如果您有关于用户可以选择哪个文件夹的附加规则,您可以在用户选择文件夹后执行此验证,如果说用户选择了根文件夹,则拒绝它。

    (图片取自FolderBrowserDialog in C#。)

    【讨论】:

      【解决方案2】:

      我真的不明白为什么这个应用程序如此复杂,但我始终相信 KISS 方法(保持简单和愚蠢)。我也相信 UI(用户界面)应该始终引导用户做对他有益的事情,而不是因为尝试不应该做的事情而惩罚他。

      我建议你创建一个在想要的文件夹中打开的表单,并有一个按钮来创建新文件夹和一个像 SaveFileDialog 这样的文本框。不同之处在于它不会让用户进入其他文件夹。在这种情况下,用户只能将文件名写入文本框中,并且您验证文本是否为有效名称。用户无需在文本中指定路径,因为 UI 将为他提供更简单的方式。

      这个简单的表格可以在几分钟内编程,它会像石头一样坚固。 希望对您有所帮助!

      【讨论】:

        【解决方案3】:

        我认为你可以使用Path.GetFullPath 来验证最终路径

        string myRootPath = @"c:\root\subdir\";
        var newPath = Path.Combine(myRootPath, @"..\..\windows\aaa"); //user enters ..\..\windows\aaa
        var usersPath = Path.GetFullPath(newPath);
        
        if (!usersPath.StartsWith(myRootPath))
            MessageBox.Show("ALERT");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多