在下方公众号后台回复:【网络安全】,可获取给你准备的最新网安教程全家桶。
1、目录结构
使用规范的文件目录结构,有助于提高项目的逻辑结构合理性,对项目扩展、团队合作研发以及安全部署均有好处。
首先,网站的根目录(Public目录)下建议只存放PHP项目的入口文件,将其他的库文件和不允许用户直接访问的文件与入口文件进行隔离存放,这样可以避免攻击者遍历网站目录。
动态文件和静态文件要分离到不同的目录中。
wwwroot // 方目录|—App // 项目目录
||—Common // 公共模块
||—Function // 公共函数目录
||—Class // 公共类
||—Controller // 控制器目录
||—Model // 模型目录
||—View // 视图模板目录
|—Public // 网站根目录
||—index.php // 网站入口
||—statics // 静态资源
|||—Js // JavaScript脚本目录
|||—Css // Css样式目录
|||—Images // 图片目录
|||—... // 其他静态资源
|—Upload // 上传目录
||—images // 上传的图片
||—files // 上传的文件
||—... // 其他上传资源
2、目录权限
从整体上考虑系统的安全性,应该限制Web目录和文件的权限。一般情况下,对目录,建议只设置R(读取)和X)执行)权限,对脚本文件只设置R(读取)权限。
为了防止用户之间互相窥探到对方的源码,应该限制用户组的权限,以使得除root权限之外,不能随意互相窥探其他人的源码、数据库资料等。建议去掉同用户组和其他用户组的R(读取)权限,具体做法是设置目录权限为500(读取+执行),同时文件权限为400(读取)。
#find /wwwroot -type f -execchmod 400 {} \; #对目录和子目录里的文件设置权限#find /wwwroot -type f -execchmod 500 {} \; #对目录和子目录设置权限
设置较为安全的目录、文件权限,应遵循下面的原则。
1)尽可能减少Web路径下可写入目录的数量。
2)文件的写入和执行权限只能选择其一,避免同时出现写入和执行权限。例如,Upload中被用户上传到服务器上的文件只允许写入权限,严格禁止可执行权限。在Nginx和Apache中配置禁止PHP的可执行权限。
Apache下禁止指定目录运行PHP脚本,只需在虚拟主机配置文件中增加php_flag engine off指令即可,配置如下。
<Directory /Upload>Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
# 禁止上传目录中的PHP脚本执行
php_flag engine off
<Directory>
Apache也可以在.htaccess文件中进行配置。
RewriteEngine on RewriteCond % !^$RewriteRule Upload/(.*).(php)$ -[F]
RewriteRule Public/statics/(.*).(php)$ -[F]
Nginx下禁止指定目录运行PHP脚本,在server配置段中增加配置,可以通过location条件匹配定位后进行权限禁止。
# 单个目录禁止PHP执行location ~* ^/uploads/.*\.(php|PHP5)$
{
deny all;
}
# 多个目录禁止PHP执行
location ~* ^/(Public/statics|upload)/.*\.(php|PHP5)$
{
deny all;
}
# 注意:上面的配置一定要放在下面的配置的前面才可以生效
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
3、避免敏感配置硬编码
在PHP项目中通常把数据库密码、加密用的salt、加密密钥、加密向量等保存在程序文件中,一旦代码投入生产环境中使用,除非对代码进行修改,否则再也不能改变密码了。
所有拥有代码读取权限的人都能得到这个密码,如代码保存在GIT、SVN中,随时存在泄露的风险,密码硬编码会削弱系统安全性。
建议将配置密码保存在专业的密匙配置管理系统中的密钥管理服务(Key Management Serice,KMS)系统中。
图1中将系统中的密码进行加密处理,再将加密后的密码存入KMS,由于纯文本密钥不会被写入磁盘,KMS管理员无法从该服务中检索纯文本密钥。系统在使用时再从KMS系统中取出进行解密。
同时可以使用多个KMS系统,将单个密码进行加密后,随机拆分成多个数据包,存储在不同的KMS系统中,确保每一个KMS没有完整的数据包,在使用时再将其拼装起来进行解密,在最大程度上保障密码安全。
- End -
近期课程上新:
web架构安全分析 | Windoes Server系统管理 | 文件上传漏洞 | 日志审计系统 | 服务器提权与隧道技术 | VPN技术 | 渗透测试导论 | 安全化概述与虚拟化 | 跨站脚本攻击 | 企业组网IP规划与安全防护