Безопасная версия Path.Combine - PullRequest
       21

Безопасная версия Path.Combine

2 голосов
/ 30 апреля 2009

У меня есть rootPath, которому я доверяю, и relativePath, которому я не доверяю. Я хочу объединить их таким образом, чтобы быть уверенным, что результат меньше rootPath и что пользователь не может использовать .., чтобы вернуться за начальную точку Я делаю хочу, чтобы относительный путь разрешал такие вещи как: hello\..\world == world

Ответы [ 3 ]

6 голосов
/ 30 апреля 2009

System.IO.Path.GetFullPath

Чтобы расширить: используйте Path.Combine, затем вызовите GetFullPath для результата и убедитесь, что этот результат начинается с rootPath.

Он не защитит вас от жестких ссылок, но должен ловить простые вещи, такие как двойные точки.

выше как код:

string Resolve(string fileName)
{
    string root = FileRoot();
    string ret = Path.GetFullPath(Path.Combine(root, fileName));
    if (ret.StartsWith(root.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar)) return ret;
    throw new ArgumentException("path resolved to out of accesable directroy");
}
2 голосов
/ 30 апреля 2009

Вы можете просто позвонить Path.GetFullPath() и проверить, начинается ли он с вашего доверенного rootPath. Если вы склонны к паранойе, проверьте также, что rootPath имеет корни.

public Boolean IsPathSafe(String rootPath, String relativePath)
{
  return rootPath.EndsWith(Path.DirectorySeparatorChar.ToString()) &&
    Path.IsPathRooted(rootPath) &&
    Patch.Combine(rootPath, relativePath).GetFullPath().StartsWith(rootPath);
}

Для объяснения первого теста см. Комментарий Алекса Мартелли к ответу технофила.

0 голосов
/ 30 апреля 2009

Единственное, что вы можете сделать, - это подсчитать количество обратных косых черт (\) и двойных точек (..) и убедиться, что число двойных точек меньше, чем число обратных косых черт. Чтобы превысить rootPath в структуре папок, вам потребуется как минимум столько же обратных косых черт, сколько двойных точек - таким образом, если вы разрешите relativePath s хотя бы с еще одной обратной косой чертой, вы должны быть в безопасности.

...