如何使用c#使文件名Web安全

时间:2011-07-19 10:00:26

标签: c# asp.net path

这不是关于编码URL的问题,更多的是与我注意到的问题有关,我注意到你在IIS上有一个有效的文件名,如“test& test.jpg”,但由于& amp;导致错误。还有其他角色也可以在Windows中有效,但不适用于网络。

我的快速解决方案是在使用下面的正则表达式保存之前更改文件名...

    public static string MakeFileNameWebSafe(string fileNameIn)
    {
        string pattern = @"[^A-Za-z0-9. ]";
        string safeFilename = System.Text.RegularExpressions.Regex.Replace(fileNameIn, pattern, string.Empty);
        if (safeFilename.StartsWith(".")) safeFilename = "noname" + safeFilename;

        return safeFilename;
    }

但我想知道是否有更好的内置方式来做到这一点。

5 个答案:

答案 0 :(得分:3)

内置我不知道。

您可以做的就是扫描原始文件名并生成Web安全版本。

对于此类Web安全版本,您可以将其显示为博客和博客类别中的slu((这些是搜索引擎优化的):

  • 仅限小写字符
  • 允许使用数字
  • 允许破折号
  • 空格由短划线替换
  • 不允许其他任何内容
  • 可能你可以替换"&" by" -and - "

所以"测试& test.jpg放在"会翻译成" test-and-test.jpg"。

答案 1 :(得分:3)

回顾这个问题,因为它相当受欢迎。虽然我会在这里发布我当前的解决方案,并为任何想要它的人提供各种重载...

public static string MakeSafeFilename(string filename, string spaceReplace)
    {
        return MakeSafeFilename(filename, spaceReplace, false, false);
    }

    public static string MakeSafeUrlSegment(string text)
    {
        return MakeSafeUrlSegment(text, "-");
    }

    public static string MakeSafeUrlSegment(string text, string spaceReplace)
    {
        return MakeSafeFilename(text, spaceReplace, false, true);
    }

    public static string MakeSafeFilename(string filename, string spaceReplace, bool htmlDecode, bool forUrlSegment)
    {
        if (htmlDecode)
            filename = HttpUtility.HtmlDecode(filename);
        string pattern = forUrlSegment ? @"[^A-Za-z0-9_\- ]" : @"[^A-Za-z0-9._\- ]";
        string safeFilename = Regex.Replace(filename, pattern, string.Empty);

        safeFilename = safeFilename.Replace(" ", spaceReplace);

        return safeFilename;
    }

答案 2 :(得分:1)

我认为您指的是“从客户端检测到一个潜在危险的Request.Path值(%)”错误,Asp.Net针对包含可能表示跨站点脚本尝试的字符的路径抛出错误:

有一篇关于如何解决这个问题的好文章:

http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx

答案 3 :(得分:1)

这是我使用的那个:

public static string MakeFileNameWebSafe(string path, string replace, string other)
{
    var folder = System.IO.Path.GetDirectoryName(path);
    var name = System.IO.Path.GetFileNameWithoutExtension(path);
    var ext = System.IO.Path.GetExtension(path);
    if (name == null) return path;
    var allowed = @"a-zA-Z0-9" + replace + (other ?? string.Empty);
    name = System.Text.RegularExpressions.Regex.Replace(name.Trim(), @"[^" + allowed + "]", replace);
    name = System.Text.RegularExpressions.Regex.Replace(name, @"[" + replace + "]+", replace);
    if (name.EndsWith(replace)) name = name.Substring(0, name.Length - 1);
    return folder + name + ext;
}

答案 4 :(得分:0)

如果您不关心保留原始名称,也许您只需用guid替换名称?