6

我们有一个 Java IRC 应用程序,允许用户执行任意 PHP 并获得结果。以下是其用途的一个示例:

btc: <php>$btc = json_decode(file_get_contents('https://btc-e.com/api/2/1/ticker'), true); $ticker = $btc['ticker']; echo "Current BTC Ticker: High: $".$ticker['high']." Low: $".$ticker['low']." Average: $" . $ticker['avg'];

我们也有一个 python 设置,但我们喜欢 PHP,因为 PHP 在任何地方的代码中都不需要换行符。(因为这是 IRC,我们不能给它换行,除非我们执行一个 web 加载的 .py 文件)

问题是如何防止人们试图利用该系统,例如:

<php>echo readfile("/etc/passwd");

很明显,它会读出 passwd 文件供所有人查看。
在我们尝试阻止 readfile() 之后,我们也遇到了这个问题:

<php>$rf = readfile; echo $rf("/etc/passwd");

我们应该如何保护这个系统?(完整代码在 github 上,有兴趣的可以访问:https ://github.com/clone1018/Shocky )

顺便说一句,没有真正的敏感信息被暴露,因为整个事情都在虚拟机中,所以它不是“定时炸弹”或任何东西。不过,我们仍然想锁定它。

4

2 回答 2

4

这听起来像是在滤锅上堵了一个洞。文件系统安全应该由操作系统而不是应用程序来处理。就目前/etc/passwd而言,操作系统已经在保护它。

这是我的第一行/etc/passwd- 是的,我将公开发布:

root:x:0:0:root:/root:/bin/bash

通常,密码实际上并不存储在/etc/passwd. 用户信息是,但密码被替换为x,真正的密码仅对 root 用户可用。

但是,您应该在某种程度上锁定 PHP。您可以在运行时更改许多 PHP 选项ini_set,包括open_basedir. http://www.php.net/manual/en/ini.core.php#ini.open-basedir

于 2012-05-14T18:21:37.633 回答
-4

如果您只想限制文件读取,也许这可以帮助 http://www.php.net/manual/en/ini.core.php#ini.open-basedir

如果您使用的是旧版本的 php < 5.4 可以考虑使用 php 安全模式

http://php.net/manual/en/ini.sect.safe-mode.php

将以下变量设置为安全模式以限制 php

safe_mode_exec_dir
disable_functions = readfile,system

和许多其他

此外,用户将无法读取任何 uid 不同的文件,例如 /etc/password。请注意,安全模式已从最新版本的 php 中折旧/删除

于 2012-05-14T18:32:27.917 回答