Common Lisp确定一个目录是子目录还是另一个目录

Common Lisp确定一个目录是子目录还是另一个目录,lisp,common-lisp,Lisp,Common Lisp,我正在使用hunchentoot构建一个简单的web应用程序,以向web公开目录树。我遇到的问题是找到一种可靠而安全的方法来确定请求的目录是否实际上是*共享根*的子目录,即/srv/share 我花了很多时间在cl时尚上,但这并不是我所需要的(或者我没有用它来解决我的问题) 我的目标是能够接收如下路径:/srv/share/media/../../../../,并意识到请求应该被忽略,因为它请求的是共享之外的内容 我建议结合:如果 是相对路径名,则foo位于bar下。 换言之: (defun p

我正在使用hunchentoot构建一个简单的web应用程序,以向web公开目录树。我遇到的问题是找到一种可靠而安全的方法来确定请求的目录是否实际上是
*共享根*
的子目录,即
/srv/share

我花了很多时间在cl时尚上,但这并不是我所需要的(或者我没有用它来解决我的问题)

我的目标是能够接收如下路径:
/srv/share/media/../../../../
,并意识到请求应该被忽略,因为它请求的是共享之外的内容

我建议结合:如果

是相对路径名,则
foo
位于
bar
下。 换言之:

(defun pathname-under-p (under top)
  (case (car (pathname-directory (enough-namestring (truename under)
                                                    (truename top))))
    ((nil :relative) t)
    (t nil)))
或者只是

(defun pathname-under-p (under top)
  (not (eq :absolute (car (pathname-directory (enough-namestring (truename under)
                                                                 (truename top)))))))
如果您的实现不支持目录上的
truename
,则必须使用特定于实现的函数或


非常感谢@Svante的调试。

(足够多的名称字符串#p“src/”/“#p“src/”)
在Linux x64上的SBCL 1.1.18中为我返回
“src/”
。@Svante:
(truename“src/”)
工作吗?(请参见编辑)这将为我提供绝对目录,而不是以
:up
开头的相对目录,因此
pathname-under-p
始终返回true。@Svante:您的意思是
足够的路径名
返回绝对路径?是的。对我来说,你可以用
:absolute
替换
:up
,这样就行了。不过,我不确定这是否是一个可移植的解决方案。
(defun pathname-under-p (under top)
  (not (eq :absolute (car (pathname-directory (enough-namestring (truename under)
                                                                 (truename top)))))))