如何防止尝试访问服务目录之外的文件的URL中的相对path?

我如何确保我受到相对path的保护,如:

/catalog.php?F=S&BrandCode=AE///index.php%3foption=com_g2bridge&controller=../%2520../../../../../../../../ ../../../../../../proc/self/environ%2500

我最近在日志中收到了这些信息,尽pipe我知道这个方法不会有效,但我对如何防范这类威胁感兴趣。

(使用php5,apache2,debian)

一些不同的select;

1)某种forms的preg_replaceexpression式,用于删除双点,扭曲的连字符(我不记得那里叫什么,但看起来像〜),以/等开头的path

2)创build一个允许使用reg-exps或in_array等可以打开的URL /path。

3)启用PHP安全模式并设置open_basedir或chroot PHP / Apache,以便它们无法打开该树之外的任何文件

我会build议使用chroot:

http://www.howtoforge.com/chrooting-apache2-mod-chroot-debian-etch

PS:消毒GET / POST / …参数和input一般当然也有帮助;)

对这种攻击100%安全的唯一答案是永远不允许用户input触摸访问文件系统的命令。 不要fopen($_GET['foo']) ,不要include($_POST['bar']) ,甚至不要mkdir($_COOKIE['baz']) 。 决不。 期。 没有理由。

如果必须使用用户input从文件系统中select文件,则可以在数据库查询中使用用户input(在清理数据库查询之后,当然,要防范SQL注入),或者通过switch语句运行它; 在这两种情况下,您应该使用硬编码或软编码已知安全的值来表示实际的文件名,而不是用户input本身的任何变化。

一切都在$ _POST,$ _GET,$ _COOKIES,$ _REQUEST,甚至$ _FILES(除了'tmp_name'和'错误' – 是的,'type'是用户input!)是用户input,你有精确的控制。 所以不要相信它。 甚至$ SERVER中的一些值(例如'HTTP *'值)是用户input! 不要让这些值在你的文件系统附近的任何位置,也不要让它们在你的数据库附近的任何地方,而不要先逃脱它们(例如mysql_real_escape_string() )或将它们绑定到准备好的语句(如果你使用的是PDO)。

是的,你可以清理input,但是如果你忘记了什么? 如果你忘记了代字符(〜)字符在* nix系统上有特殊含义呢? 或者如果你为你的Linuxnetworking服务器做了一个完美的工作消毒,但是后来又转到了Windows环境呢? 或者如果你从来没有预见到你的环境会发生什么变化 – 就像一个新的特殊字符? 等等等等。 最安全的select,最有前途的select,就是不让用户在文件系统附近input。

但有一点要记住的是,有很多Web应用程序易受到日志中的攻击。 但这并不意味着你的服务器上任何东西都是这样的:很多时候,脚本小子只会在他们可以find的任何服务器上指出他们的最新发现,而不会先打听到他们是否可能受到攻击。 如果你不容易受到这种背景噪音的干扰,