【问题标题】:What is the safest and most convenient option to validate file paths of uploaded files for my webform?为我的网络表单验证上传文件的文件路径的最安全和最方便的选项是什么?
【发布时间】:2018-01-23 23:08:02
【问题描述】:

我目前在客户端有一个 ValidationExpression,它(在某种程度上)限制用户上传除 (.txt) 文件以外的任何内容。

^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.txt)$

我想知道,由于此验证器限制了一些特殊字符,如果我的一个用户将他希望上传的文件放在名称中包含特殊字符的文件夹中,我会遇到麻烦吗?

我想知道是否有更好的 ValidationExpression 可以在客户端使用,以防止给我的用户带来任何不便。我正在设置服务器端验证,但我仍然希望有一个好的客户端验证器,它允许使用风险不大的特殊字符。

谁有好的解决方案?

【问题讨论】:

  • 您能否举一些有效和无效输入的示例,特别是您认为可能导致问题的输入?
  • 好吧,我担心脚本会以某种方式传递,或者在使用特殊字符时遇到任何兼容性问题,我在想也许有人可以重命名文件夹
  • 为什么不使用<asp:FileUpload ID="FileUpload1" runat="server" accept=".txt" />之类的东西?是的,用户始终可以选择all files,但无论如何您都必须进行服务器端验证,所以为什么要让自己变得困难。甚至可以轻松绕过脚本。
  • @VDWWD 我目前确实在验证器上使用了 accept=".txt" 。接受上传的文件时接受所有字符是否没有风险?
  • 字符和上传的文件没有任何关系。您检查、重命名文件并将其存储在您自己的路径服务器端。

标签: asp.net regex validation file-upload special-characters


【解决方案1】:

上传 txt 文件的快速简单方法。

<asp:FileUpload ID="FileUpload1" runat="server" accept=".txt" />
<br />
<asp:Button ID="Button1" runat="server" Text="Upload" OnClick="Button1_Click" />
<br />
<asp:Label ID="Label1" runat="server" Text="" ForeColor="Red"></asp:Label>

然后是后面的代码

protected void Button1_Click(object sender, EventArgs e)
{
    //check if the upload contains a file
    if (FileUpload1.HasFile == false)
    {
        Label1.Text = "No file uploaded.";
        return;
    }

    //check the file extension
    string extension = Path.GetExtension(FileUpload1.FileName);
    if (extension.ToLower() != ".txt")
    {
        Label1.Text = "Not a text file.";
        return;
    }

    //read the content of the text file
    string content = ""; ;
    using (StreamReader sr = new StreamReader(FileUpload1.PostedFile.InputStream))
    {
        content = sr.ReadToEnd();
    }

    //if there is no txt content
    if (string.IsNullOrEmpty(content))
    {
        Label1.Text = "No contents in text file.";
        return;
    }

    Label1.Text = content;

    //save the file
    File.WriteAllText(Server.MapPath("myTextFile.txt"), content);
}

理论上,用户可以上传扩展名为 .txt 的二进制文件。这将导致Label1 中有很多不可打印的字符。您甚至可以通过多种方式进行检查。请参阅以下链接。

C# - Check if File is Text Based

How can I determine if a file is binary or text in c#?

【讨论】:

  • 后面的代码在哪里插入?我是否在我的 bin 文件夹中创建一个新文件?我制作的那个文件的扩展名是什么?
  • 更新了我的答案。后面的代码是属于一个aspx页面的.cs文件。代码可以内联,但通常不会完成。
  • 所以我只是将您的代码粘贴到一个新文件中并将其重命名为“test.cs”并将其放在我的 bin 文件夹中?
  • 我创建了一个名为:Button1_Click.cs 的文件,但随后我的网络表单返回了错误。当我删除 OnClick="Button1_Click" 时,我可以再次查看我的网站,但该功能不起作用。我错过了什么吗?我需要编辑您的代码还是应该按原样工作?
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2011-01-30
  • 2011-10-02
  • 2012-06-14
  • 2016-11-25
  • 1970-01-01
相关资源
最近更新 更多