php
那什么又是cgi呢?html
CGI(Common Gateway Interface)。CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。CGI规范容许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。mysql
简单的说,就是:cgi就是专门用来和web 服务器打交道的。web服务器收到用户请求,就会把请求提交给cgi程序(php的fastcgi),cgi程序根据请求提交的参数做应处理(解析php),而后输出标准的html语句返回给web服服务器,再返回给客户端,这就是普通cgi的工做原理。nginx
yum install php php-mysql php-fpm
安装成功。web
php-fpm配置文件路径:/etc/php-fpm.d/www.confsql
php配置文件路径:/etc/php.ini数据库
说明:apache
php-mysql,这个是后续连接mysql须要的浏览器
php.ini安全
将 ;cgi.fix_pathinfo=1 改成 cgi.fix_pathinfo=1 只要把前面的分号去掉就能够了;
fix_pathinfo是用来干吗的呢?
为CGI提供真正的PATH_INFO / PATH_TRANSLATED支持,不打开,nginx是解析不了路径的。
www.conf
将 user = apache group = apache
改成 user = nginx group = nginx
/etc/nginx/conf.d目录下新增php-fpm.conf,内容配置以下
server { listen 80; server_name 192.168.189.134; location ~ .php$ { try_files $uri =404; root /usr/share/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
SCRIPT_FILENAME这个参数在fastcgi_params也有,默认是$fastcgi_script_name,能够看出只是添加了网站根目录
开启自启动
sudo systemctl enable php-fpm
/usr/share/nginx/html目录下新建phpinfo.php文件,内容以下:
<?php echo 6666666666; phpinfo(); ?>
重启nginx
sudo systemctl restart nginx
能够访问,已经成功安装了。
修改/etc/php-fpm.d/www.conf
将 user = apache group = apache
改成 user = nobody group = nobody
PHP 环境提供的安全模式是一个很是重要的内嵌安全机制,PHP 安全模式能有效控制一些 PHP 环境中的函数(例如system()
函数,官网有个列表),对大部分的文件操做函数进行权限控制,同时不容许对某些关键文件进行修改(例如 /etc/passwd)。默认的 php.ini 配置文件并无启用安全模式
php5.4之前的版本修改/etc/php.ini
safe_mode = on
下面是安全模式下的功能
当您启用安全模式后,若是safe_mode_gid
选项被关闭,PHP 脚本可以对文件进行访问,且相同用户组的用户也可以对该文件进行访问。
safe_mode_gid = off
若是启用了安全模式后,想要执行某些程序的时候,能够指定须要执行程序的主目录,例如:
safe_mode_exec_dir = /usr/bin
通常状况下,若是不须要执行什么程序,建议您不要指定执行系统程序的目录。您能够指定一个目录,而后把须要执行的程序拷贝到这个目录便可,例如:
safe_mode_exec_dir = /temp/cmd
可是,更推荐您不要执行任何程序。这种状况下,只须要将执行目录指向网页目录便可:
safe_mode_exec_dir = /usr/www
若是您须要在安全模式下包含某些公共文件,您只须要修改如下选项便可:
safe_mode_include_dir = /usr/www/include/
通常状况下,PHP 脚本中包含的文件都是在程序已经写好的,能够根据您的具体须要进行设置。
doc_root = /usr/share/nginx/hml/
上图是修改后的,访问的phpinfo.php不在这个目录下,因此不被解析并访问
查看日志,如今不能打开这个php,起到限制php的执行目录,doc_root目录之外的php没法被解析
修改成正确的路径
doc_root = /usr/share/nginx/html/
重启pgp-fpm
能够被解析并访问
修改/etc/php.ini
open_basedir = /usr/share/nginx/htm/
访问的phpinfo.php不在上面的目录下,则禁止访问
修改成正确路径则访问成功
若是您启用了安全模式,那么能够不须要设置函数禁止,但为了安全考虑,仍是建议您进行相关设置。例如,您不但愿执行包括system()
等在内的执行命令的 PHP 函数,以及可以查看 PHP 信息的phpinfo()
等函数,那么您能够经过如下设置禁止这些函数:
disable_functions=phpinfo
上面作测试禁用了phpinfo,重启php-fpm
phpinfo.php里面使用了这个函数,咱们看下是否能执行
没有php的信息,函数被禁用了。
暴露给黑客的信息越少,攻击成功就会越高,php版本也是同样的,不知道版本就不能针对具体版本进行研究入侵了。
修改/etc/php.ini文件以下
expose_php=off
重启php-fpm
咱们验证是否设置成功了,图片可看出生效了,没有了php版本信息
display_errors = Off
error_reporting = E_WARNING & E_ERROR
通常 PHP 环境在没有链接到数据库或者其余状况下会有错误提示信息,错误信息中可能包含 PHP 脚本当前的路径信息或者查询的 SQL 语句等信息,这类信息若是暴露给黑客是不安全的,所以建议您禁止该错误提示:
修改/etc/php.ini
display_errors = Off
#若是您确实要显示错误信息,必定要设置显示错误信息的级别。例如,只显示警告以上的错误信息:
error_reporting = E_WARNING & E_ERROR
打开错误信息提示
关闭错误信息提示
对比上面的错误信息,打开状态直接暴露了phpinfo.php的路径了,给黑客很好的信息了。
在 PHP 环境中提交的变量,包括使用 POST 或者 GET 命令提交的变量,都将自动注册为全局变量,可以被直接访问。这对您的服务器是很是不安全的,所以建议您将注册全局变量的选项关闭,禁止将所提交的变量注册为全局变量。
register_globals = off
注意: 该选项参数在 PHP 5.3 之后的版本中已被移
php5.4之前的版本,有一个自动将进入 PHP 脚本的数据进行转义的过程。
当打开时,全部的 '(单引号),"(双引号),*\*(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。这和 addslashes() 做用彻底相同。最好在编码时不要转义而在运行时根据须要而转义,被称为魔术引号(Magic Quote),不过php5.4开始就被移除了.
php5.4之前的版本修改配置/etc/php.ini
magic_quotes_gpc = On
https://help.aliyun.com/knowledge_detail/50218.html
https://www.php.net/manual/zh/security.php
http://www.ttlsa.com/safe/php-environment-security-reinforcement-configuration/