如何验证 Unix 路径?

rae*_*ae1 1 c# unix asp.net validation

我正在尝试编写一个简单的 C# 函数来验证用户输入的 shell 脚本的完整 Unix 路径,以避免出现以下情况:

  • 路径格式正确,没有无效符号,例如空格或分号
  • 没有可疑的命令,例如rm -rf /
  • 该路径代表完整路径,没有亲属关系
  • 脚本是否实际存在并不重要

该函数的形式如下:

public bool IsUnixPathValid(string path)
{
    return !path.IsEmptyOrNull() 
        && path.StartsWith("/") 
        && !path.ContainsCharacters(";', \"")
}
Run Code Online (Sandbox Code Playgroud)

问题:是否有现有的库可以执行类似的操作?如果没有,最好的方法是什么以及我应该注意哪些小细节(考虑安全)。

Cel*_*ada 5

如果您不想验证指定路径中是​​否确实存在任何文件,那么您唯一应该做的可能就是检查路径是否以以下开头/(因为您只需要绝对路径)并且没有嵌入NUL(0) 个字节(因为 POSIX 路径不能包含这些字节)。就是这样。绝对任何其他东西都可以是有效路径。值得注意的是,路径中允许使用空格和分号。

我想您还可以检查多个相邻的斜杠,因为这些是多余的......但是它们仍然被接受(每组多个斜杠与单个斜杠具有相同的含义),因此它们实际上并不是无效的。

检查路径中嵌入的可疑字符串(例如“rm -rf /”)是一个坏主意。如果您遇到由直接发送到系统命令的未加引号的路径引起的安全问题,那么您需要解决这些安全问题(通过适当地引用路径,或者更好的是,不通过解析它们的 shell 之类的东西传递它们),而不是将它们列入黑名单很少选择嵌入字符串。如果您将其列入黑名单,那么您很可能会错过本应列入黑名单的内容,而且,您很可能会拒绝实际上是有效良性路径的内容。