Проверка того, что запрошенный пользователем файл находится под базовым каталогом

return обычно возвращается из метода без выполнения каких-либо дополнительных инструкций, поэтому часть else не нужна. Таким образом, вы избавитесь от проблемы № 1.

Что касается перенаправления, почему бы не вернуть какую-то команду redirect :

[HttpPost]
public ActionResult Index(LoginModel loginData)
{
    if (login fails)
    {
        return Json(new {result = "InvalidLogin"}, JsonRequestBehavior.AllowGet);
    }
    return Json(new {result = "Redirect", url = Url.Action("MyAction", "MyController")});
}

И затем в javascript:

$.post(url, data, function (response) {
  if (response.result == 'InvalidLogin') {
      //show invalid login
  }
  else if (response.result == 'Error') {
      //show error
  }
  else if (response.result == 'Redirect'){
      //redirecting to main page from here for the time being.
      window.location = response.url;
  }
 });
3
задан Adrian Smith 13 July 2018 в 15:03
поделиться

2 ответа

startsWith(baseDirectory.getCanonincalPath()+"/") должно быть в порядке.

Лучше использовать новые файлы и amp; Пути классов.

Path path = file.toPath();
path = path.toRealPath();
// Absolute, ".." removed, sym links resolved as no param NOFOLLOW_LINKS.
path = path.normalize(); // Removes ".."
path.startsWith(baseDir); // Base path
2
ответ дан Joop Eggen 17 August 2018 в 12:37
поделиться

Вы можете использовать метод, который проверяет, начинается ли путь кандидата с обязательным родительским путем. Кажется, что Java 7 nio имеет хорошую поддержку для этого.

Вот метод, реализующий эту идею:

/**
 * Check if a candidate path starts with a mandatory parent path
 * @param mandatoryParentPath Mandatory parent path
 * @param candidate Candidate path which should be under the mandatory parent path
 * @return {@code true} if a candidate path starts with a mandatory parent path, else {@code false}
 */
/**
 * Check if a candidate path starts with a mandatory parent path
 * @param mandatoryParentPath Mandatory parent path
 * @param candidate Candidate path which should be under the mandatory parent path
 * @return {@code true} if a candidate path starts with a mandatory parent path, else {@code false}
 */
public static boolean absoluteStartsWith(Path mandatoryParentPath, Path candidate) throws IOException {
    Objects.requireNonNull(mandatoryParentPath, "Mandatory parent path should not be null");
    Objects.requireNonNull(candidate, "Candidate path should not be null");
    Path path = candidate.toRealPath();
    System.out.println(" " + candidate); // debugging code
    return path.startsWith(mandatoryParentPath.toAbsolutePath());
}

Вот простой тест для проверки метода выше:

public static void main (String[] args) throws java.lang.Exception
{
    Path root = Paths.get("d:/work");
    System.out.println(absoluteStartsWith(root, root.resolve("/tmp")));
    System.out.println(absoluteStartsWith(root, root.resolve("..")));
    System.out.println(absoluteStartsWith(root, root.resolve("ems")));
}

Это печатает на моей машине:

 d:\tmp
false
 d:\work\..
false
 d:\work\ems
true

Примечание: если один из путей-кандидатов не существует, тогда исключение IOException будет выведено вышеуказанным методом absoluteStartsWith .

1
ответ дан gil.fernandes 17 August 2018 в 12:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: