php安全模式-PHP的一些安全设置

(1)打开php的安全模式

PHP的安全模式是一个非常重要的内置安全机制,它可以控制PHP中的一些函数,例如system()、

同时很多文件操作功能都被控制了,个别关键文件是不允许的,比如/etc/passwd,

并且默认php.ini没有开启安全模式,我们开启它:

安全模式=开启

(2) 用户组安全

当safe_mode开启时,safe_mode_gid关闭,这样php脚本就可以访问该文件了,同样的

组中的用户也可以访问这些文件。

推荐设置为:

安全模式_gid=关闭

如果不设置的话,我们可能很难操作我们服务器网站目录下的文件,比如我们需要

对文件进行操作时。

(3)安全模式下执行程序主目录

如果开启了安全模式,但想要执行单个程序,可以指定要执行的程序的主目录:

safe_mode_exec_dir=D:/usr/bin

一般情况下不需要执行任何程序,所以建议不要执行系统程序目录,可以指向一个目录,

然后复制需要执行的程序,例如:

?safe_mode_exec_dir=D:/tmp/cmd

但是,我不想执行任何程序,这样我们就可以指向我们的 Web 目录:

safe_mode_exec_dir=D:/usr/www

(4)安全模式下包含文件

如果您想在安全模式下包含单个公共文件,请更改选项:

safe_mode_include_dir=D:/usr/www/include/

虽然php脚本中包含的文件通常是在程序本身中编写的,但这可以根据具体需要进行设置。

(5)控制php脚本可以访问的目录

使用open_basedir选项控制PHP脚本只访问指定目录,从而防止PHP脚本访问

不应该访问的文件在一定程度上限制了phpshell的危害。 我们通常可以设置为只访问网站目录:

open_basedir=D:/usr/www

(6)关闭危险功能

如果安全模式开启的话,这样的功能禁止是没有必要的,我们还是出于安全考虑。 例如,

我们认为我们不想执行包括system()等在内的php函数来执行命令,或者查看php信息

phpinfo()等函数,所以我们可以严格禁止它们:

disable_functions=系统、passthru、exec、shell_exec、popen、phpinfo、escapeshellarg、escapeshellcmd、proc_close、proc_open、dl、show_source、get_cfg_var

如果想严格禁止任何文件和目录操作,可以关闭很多文件操作

disable_functions=chdir、chroot、dir、getcwd、opendir、readdir、scandir、fopen、取消链接、删除、复制、mkdir、rmdir、重命名、文件、file_get_contents、fputs、fwrite、chgrp、chmod、chown

以上只是列出了一些常用的文件处理函数,你还可以将执行命令功能与该函数结合起来,

你能谴责大多数phpshell吗?

(7) 关闭http header中PHP版本信息的泄露

为了防止黑客获取服务器中php版本的信息,我们可以在http header中关闭该信息的斜路径:

hide_php=关闭

例如,当黑客在telnet80上时,将很难看到PHP信息。

(8) 关闭全局变量的注册

PHP中提交的变量,包括使用POST或GET提交的变量,都会被手动注册为全局变量,可以直接访问。

这对于服务器来说是非常不安全的,所以我们不能让它注册为全局变量,所以关闭注册全局变量选项:

register_globals=关闭

其实如果这么设置的话,在获取response的时候是不是需要采用合理的方法呢? 例如获取GET提交的变量var,

所以需要使用$_GET['var']来获取php安全模式,这个PHP程序员要注意了。

(9)开启magic_quotes_gpc以避免SQL注入

SQL注入是一个非常危险的问题。 小的话,网站后台被入侵php安全模式,严重的话,整个服务器瘫痪。

所以要小心。 php.ini中有一个设置:

magic_quotes_gpc=关闭

默认情况下此功能处于关闭状态。 如果开启,用户提交给sql的查询将被手动转换。

比如转‘to’等,对于避免sql注入有很大的作用。 所以我们建议设置为:

magic_quotes_gpc=开

(10)错误信息控制

通常php在未连接数据库或者其他情况下会提示错误。 通常错误消息将包含 php 脚本

向黑客提供此类信息是不安全的,比如之前的路径信息或者查询的SQL语句,因此服务器通常建议严格禁止错误提示:

显示错误=关闭

如果要显示错误消息,请务必设置显示错误的级别,例如仅显示警告以上的消息:

error_reporting=E_WARNING&E_ERROR

事实上,我仍然建议关闭错误消息。

(11)错误日志

建议关闭display_errors后记录错误信息,以便查找服务器运行的原因:

log_errors=开

同时,还需要设置错误日志的存放目录。 建议root apache的日志一起存在:

error_log=D:/usr/local/apache2/logs/php_error.log

注意:该文件必须允许 apache 用户和组具有写入权限。