1

ディレクトリトラバーサルを防ぐにはこれで十分であることを確認したいと思います。また、提案やヒントをいただければ幸いです。ディレクトリ "/wwwroot/Posts/" は許可されている唯一のディレクトリです。

    [HttpGet("/[controller]/[action]/{name}")]
    public IActionResult Post(string name)
    {
        if(string.IsNullOrEmpty(name))
        {
            return View("Post", new BlogPostViewModel(true)); //error page
        }

        char[] InvalidFilenameChars = Path.GetInvalidFileNameChars();

        if (name.IndexOfAny(InvalidFilenameChars) >= 0)
        {
            return View("Post", new BlogPostViewModel(true));
        }

        DirectoryInfo dir = new DirectoryInfo(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/Posts"));

        var userpath = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/Posts", name));

        if (Path.GetDirectoryName(userpath) != dir.FullName)
        {
            return View("Post", new BlogPostViewModel(true));
        }

        var temp = Path.Combine(dir.FullName, name + ".html");
        if (!System.IO.File.Exists(temp))
        {
            return View("Post", new BlogPostViewModel(true));
        }
        BlogPostViewModel model = new BlogPostViewModel(Directory.GetCurrentDirectory(), name);
        return View("Post", model);
    }
4

1 に答える 1