1.  使用open_basedir 限制虚拟主机跨目录访问

    ....

    [HOST=www.xxxx.com]

    open_basedir=/data/site/www.xxx.com/:/tmp/

    [HOST=test.xxxx.com]

    open_basedir=/data/site/test.xxxx.com/:/tmp/


    如上配置的意思是 www.xxxx.com 下的 php 程序被限制在 open_basedir 配置的两个目录下, 不可以访问到其他目录。如果没有做以上的配置,那么 test.xxxx.com 与 www.xxxx.com 的程序可以互相访问.

  2. 如果其中一个站点有漏洞被***植入了 webshell,那么他可以通过这个站点拿下同一台服务器的其他站点,最后挂***.

    [warning]注意:目录最后一定要加上/. 比如你写/tmp,你的站点同时存在/tmp123 等等以/tmp 开头的目录,那么***也可以访问到这些目录,另外, php5.3 以上支持这个写法,5.2 不支持。[/warning]


2.禁用不安全的php函数

disable_functions = show_source,system,shell_exec,passthru,exec,popen,proc_open,proc_get_status,phpinfo


禁止 php 执行以上 php 函数,以上 php 程序可以执行 linux 命令, 比如可以执行 ping、netstat、mysql 等等.如果你的系统有提权 bug,后果你懂得.


3.php用户只读


4.关闭php错误日志

display_errors = On

改为

display_errors = Off

程序一旦出现错误,详细错误信息便立刻展示到用户眼前,其中包含路径、有的甚至是数据库账号密码. 注入***密码基本上都是通过这个报错来猜取。生产环境上强烈关闭它


5.php上传分离

将文件上传到远程服务器,例如 nfs 等。当然也可以调用你们写好的 php 接口. 即使有上传漏洞,那么文件也被传到了静态服务器上。***等文件根本无法执行.

举个例子:

php 站点 www.xxx.com,目录/data/site/www.xxx.com

静态文件站点 static.xxx.com,目录/data/site/static.xxx.com

文件直接被传到了/data/site/static.xxx.com,上传的文件无法通过 www.xxx.com 来访问,只能使用

static.xxx.com 访问,但是 static.xxx.com 不支持 php.


6.关闭php 信息

expose_php = On

改为

expose_php = Off

不轻易透露自己 php 版本信息,防止***针对这个版本的 php 发动***.


7.禁止动态加载链接库

disable_dl = On;

改为

enable_dl = Off;