如何在给定路径(从Web服务器)上执行安全检查以提供文件

时间:2009-12-22 09:58:00

标签: security winapi posix filesystems

我需要为Web服务器编写一个小文件服务组件。服务有很多问题 文件。因为“原样”是一个很大的安全漏洞,就像这样

www.somesite.com/../../../../etc/passwd

有许多问题,包括“..”解决和许多其他像在Windows下有许多“不寻常的方式来引用某些路径”。还有一些符号链接问题......它们可能会让我们远离文档根。

是否有关于提供文件和对其进行安全检查的好文章或材料?

感谢。

P.S。:我需要主要用于POSIX系统的解决方案,但我也需要Win32的解决方案。

P.P.S:

  • 检查“..”和符号链接是否足以支持POSIX系统? (据我所知,它不适用于Windows)
  • 据我所知,Windows为这些目的提供了某种API,有人可以指出它吗?

为什么我需要这个:

CppCMS有一个简单的内部Web服务器用于调试目的(我已经编写了一个),我试图弄清楚这个服务器对现实世界是否有用是多么困难(即直接听80)然后在Web服务器和FastCGI或SCGI连接器后面运行。

这是我在此时使用的file serving application。它做了非常原始的检查。我主要想让它安全。

我的回答:

有答案https://www.securecoding.cert.org/confluence/display/seccode/FIO02-C.+Canonicalize+path+names+originating+from+untrusted+sources

似乎足够好......

简而言之:在UNIX下使用realpath,在Windows下使用GetFullPathName

最后注意事项:如果有什么东西会建议更详细的功能我会接受它(特别是对于路径测试很痛苦的Win32)。

2 个答案:

答案 0 :(得分:1)

对于Windows API产品,有一组Shell函数,它们以PathUrl开头,可以帮助规范化目录,路径和文件名。例如,PathCanonicalize将帮助您获得标准表单的任意路径。从那里你可以做进一步的分析。

通常,使用特定的事物列表来允许,而不是禁止的事物列表。坏人总会想到你没想到的新事物。

答案 1 :(得分:0)

看起来你正在处理Path Traversal - http://www.owasp.org/index.php/Path_Traversal 该链接主要处理Web应用程序,但我认为那里的一些信息会有所帮助。我认为POSIX系统的最佳实践是chroot并且不允许访问应用程序根目录之外的路径。