有这样一个案例:一个网站的用户信息被发现泄漏了,刚提交了新的用户手机号码,过一会就有人打电话来营销。php
根据分析有多是SQL注入得到权限,把查询SQL提交到了服务器上得到后台数据(能够在网站入口的地方,增长特殊符号的过滤,能够阻断SQL注入的漏洞)。shell
再仔细排查:一、监控数据库查询,抓包。每隔一分钟抓包一次,保存到文件中分析。抓到能够的SQL查询,与网站上的原生的SQL查询不同,定位到时间点,再去看访问日志。数据库
二、访问日志有个很是明显的请求,是执行 在图片上传upload目录下的某个php文件。查看代码发现是一句话木马,从而得到了服务器的权限。浏览器
三、咱们能够把该上传文件的目录(网站的入口),禁止php解析。安全
<Directory /data/wwwroot/111.com/upload> php_admin_flag engine off </Directory>
禁止解析php后,访问该目录下的php文件时,只会返回该php文件的源代码。服务器
四、还能够再加多一层防御:使用访问控制,禁止访问该目录下的php文件curl
<FilesMatch (.*)\.php(.*)> Order allow,deny Deny from all </FilesMatch>
设定访问控制后,直接会返回403 Forbidden状态码。socket
user_agent能够理解为浏览器标识,限制他能够防止CC攻击(用软件或者肉鸡)函数
配置以下:网站
<IfModule mod_rewrite.c> //使用rewrite模块 ReWriteEngin on //打开模块 ReWriteCond %{HTTP_USER_AGENT} .*curl+[NC,OR] //定义条件 [NC]忽略大小写,[OR] 两个条件或匹配 ReWriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] //定义条件 ReWriteRule .* -[F] //定义规则,[F] 是禁止。 </IfModule>
验证:
curl -A “abcde” -x127.0.0.1:80 '111.com/1.php'
-A选项:指定user_agent。
查看php配置文件的位置:
/usr/local/php/bin/php -i |grep -i "loaded configuretion file" //这个方法有时候不太准确
最好使用phpinfo()函数查看:在网站目录新建一个phpinfo函数的文件,经过浏览器访问
若是没有加载php.ini,就从源码包里复制一个到/usr/local/php/etc/ 下
修改/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
二、设置时区:
date.timezone=Aisa/ShangHai
三、错误日志相关设置:
display_errors=off //不显示错误信息,防止网站目录暴露 log_errors=on //打开php错误日志 error_log=/tmp/php.errors.log //定义错误日志的存放路径。权限要777 error_reporting =E_ALL & -E_NOTICE //定义日志信息的级别
若是定义了日志存放目录,可是没有生成,检测日至目录是否有写入权限,写入的用户是Apache的进程运行用户,daemon。
四、安全相关的:站点目录
若是有多个站点运行在一台服务器中,当A站点被黑,只可以在A站点的目录下操做,不会影响其余站点的目录。可使用open_basedir。
open_basedir=/data/wwwroot/111.com:/tmp //若是是在php.ini下定义,只能定义一个open_basedir,是针对全部站点和临时目录
若是要对每一个站点单独限定相互隔离,能够在httpd-vhosts.conf 下,在每一个虚拟主机的配置段里定义:
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp"