限定某个目录禁止解析 php
防止黑客上传一个目录文件 php, 网站会从而解析 php, 对我们的网站有很大的危险
因此, 我们需要在能上传文件的目录直接禁止解析 PHP 代码
禁止步骤
1. 编辑虚拟主机配置文件: 增添内容
核心配置文件内容
- /data/wwwroot/111.com/upload>
- php_admin_flag engine off // 禁止解析 PHP 这行即可
- (.*)\.php(.*)> // 加上这个 deny 是可以防止解析我们 xxx.php(.*) 源代码
- Order deny,allow
- Deny from all
修改完后:
改完了配置文件需要重新加载一下:
- /usr/local/apache2.4/bin/apachectl -t (检测)
- /usr/local/apache2.4/bin/apachectl graceful (加载)
创建 upload 目录:(在 / data/wwwroot/111.com / 下创建)
- cd /data/wwwroot/111.com
- mkdir upload
复制 admin.php 到 upload 下并改名为 test.php
测试:
此时只是显示 test.php 源代码
去掉这个标签内容, 再测试, 连访问的权限都没有
测试
限制 user_agent
user_agent: 为浏览器的标识
当很多用户同时访问同一个站点, 这样会很消耗服务器资源
针对 user_agent 做访问控制步骤:
1. 编辑虚拟主机配置文件: 增添内容
- mod_rewrite.c>
- RewriteEngine on
- RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
- RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
- RewriteRule .* - [F]
限制.*curl. 或者.*baidu.com. 这两个 user_agent 的访问
改完了配置文件需要重新加载一下:
- /usr/local/apache2.4/bin/apachectl -t (检测)
- /usr/local/apache2.4/bin/apachectl graceful (加载)
测试:
在日志文件可以看出: user_agent 是我们的定义的 curl
指定 user_agent 进行测试 curl -A(加 - A 选项)
curl -A "cansheng" -x192.168.136.133:80 'http://111.com/admin.php' -I
访问日志查看 user_agent
curl 的常用选项意义:
-A : 指定 user_agent
-I : 显示状态码
-x : 相当省略了 hosts
PHP 相关配置
查看我们的配置文件位置:(111.com 虚拟主机)
(1) 网页上查看:
首先得在 /data/wwwroot/111.com/index.php 下编辑添加
phpinfo();
网页上查看信息:
cp /usr/local/src/php-5.6.30/php.ini-development /usr/local/php/etc/php.ini
复制后则会出现这样的信息
这就是我们配置文件 php.ini 的位置
(2) 命令行查看
usr/local/php/bin/php -i|grep -i "loaded configuration file"
(上面的 PHP Warning: 这个不是报错需要取消的话编辑 php.ini 找到 data.timezone
把 PHP 里的一些函数禁掉:
步骤:
1. 修改配置文件: vim /usr/local/php/etc/php.ini
增添要禁止的函数
- disable_functions
- eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close
禁止了 phpinfo() 函数后再次访问 111.com/index.php(内有 phpinfo()) 则不会显示函数的内容:
配置 error_log (不让错误信息显示在浏览器中)
1. 修改 display_errors = Off
修改以后就不会把错误信息显示在浏览器中
2. 定义错误日志的路径:
(1) 确保: log_errors =On
(2) 路径: error_log = /tmp/log/php/php_errors.log(自定义路径)
(3) 定义 error_log 级别: error_reporting
创建 错误日志路劲文件:
并修改权限:
测试:
配置 open_basedir:(安全选项)
open_basedir: 作用是将网站限制在指定的目录里, 就算黑客黑了这个网址也只能在这个目录下操作, 影响不了其他目录下的网站 (一台服务器可以跑多个网站)
步骤:
1. 修改配置文件, 增加内容
增加限定所在目录 (多个目录用: 隔开
测试:
故意把限定目录改成不存在的一个目录:
运行: curl -x192.168.136.133:80 111.com/index.php -I
(index.php 是在 111.com 目录下的)
报错
错误日志内容显示:
正确修改完后
访问正常:
如果我们的服务器上有很多个网站都在同一个目录, 那么直接修改 php.ini 就不是这么合适 php.ini 是针对所有的站点的
解决方法:
对单个虚拟主机设置 open_basedir
步骤:
修改虚拟主机配置文件:
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
增添内容:
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"
php_admin_value 可以定义 php.ini 里面的参数:
这样两台虚拟主机都限定在各自的目录下
(/tmp 目录基本都得添加到限制目录中, 这个是因为一些临时限制文件一般的都是先存放在 / tmp, 不加 tmp 则类似图片上传也不能正确使用)
(切记: 每次修改完配置文件都要检测和加载
- /usr/local/apache2.4/bin/apachectl -t (检测)
- /usr/local/apache2.4/bin/apachectl graceful (加载)
- )
PHP 扩展模块安装
PHP 动态扩展模块
当我们的需求变更时, 我们的模块在一开始配置完成后没有变更时的模块, 那么就需要动态扩展:
查看 PHP 目前都加载了什么模块
/usr/local/php/bin/php -m
下面安装一个 redis 的模块 ( 放在 / usr/local/src / 目录下)
1. 先下载 redis 的包:
2. 修改一下名字:
mv develop phpredis-develop.zip
3. 解压:
unzip phpredis-develop.zip
4. 进入到包里:
cd phpredis-develop
5. 生成 configure 文件
/usr/local/php/bin/phpize
yum install -y autoconf
安装完成后再执行 / usr/local/php/bin/phpize
6. 执行
./configure --with-php-config=/usr/local/php/bin/php-config
- make
- make install
安装完后: 生成有 redis.so 这个文件, 这正是我想要的
但是此时我们的 php 并没有加载到这个模块
9. 配置, 让 php 加载这个 redis 模块:
(1) 查看扩展模块存放目录,(我们可以在 php.ini 中去自定义该路径)
/usr/local/php/bin/php -i |grep extension_dir
下载的模块都是默认放在这里的:
(2) 编辑 php.ini
vim /usr/local/php/etc/php.ini
增加一行配置 (可以放到文件最后一行)
extension = redis.so
最后就可以查看到 php 加载了这个模块
(编译一个扩展模块的时候, 如果如果自带的源码包里 (php) 的 ext 目录下有我们想要的模块, 那么就可以直接在 ext 编译它 , 不用下载, 先进入该包然后执行生成 configure 文件这里开始的步骤
)
来源: http://www.bubuko.com/infodetail-2532117.html