我正在使用 hunchentoot 构建一个简单的 Web 应用程序以向 Web 公开目录树。我遇到的问题是找到一种可靠且安全的方法来确定请求的目录是否实际上是 *share-root*
的子目录,即 /srv/share
.
我已经花时间使用 cl-fad,但它并不是我所需要的(或者我没有以解决我的问题的方式使用它)。
我的目标是能够接收像这样的路径:/srv/share/media/../../../
并意识到请求应该被忽略,因为它要求共享之外的东西。
最佳答案
我建议 enough-namestring
结合 truename
: 如果
(enough-namestring foo bar)
是相对路径名,则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
,您将不得不使用特定于实现的函数或 directory
.
非常感谢@Svante 的调试。
关于lisp - Common Lisp 确定目录是子目录还是另一个目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25559746/