coreDir, RecursiveDirectoryIterator::SKIP_DOTS)
);
foreach ($iterator as $file) {
if ($file->isFile()) {
$relativePath = str_replace($this->coreDir . '/', '', $file->getPathname());
// 排除不需要校验的文件
$skip = false;
foreach ($this->exclude as $ex) {
if (strpos($relativePath, $ex) === 0) {
$skip = true;
break;
}
}
if (!$skip) {
$hashes[$relativePath] = hash_file('sha256', $file->getPathname());
}
}
}
return file_put_contents($this->hashFile, json_encode($hashes, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) !== false;
}
/**
* 校验文件是否被篡改
* @return array 校验结果,包含异常文件列表
*/
public function check(): array
{
if (!file_exists($this->hashFile)) {
return ['status' => 'error', 'msg' => '哈希库文件不存在,请先生成'];
}
$originHashes = json_decode(file_get_contents($this->hashFile), true);
$currentHashes = [];
$abnormal = [];
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($this->coreDir, RecursiveDirectoryIterator::SKIP_DOTS)
);
foreach ($iterator as $file) {
if ($file->isFile()) {
$relativePath = str_replace($this->coreDir . '/', '', $file->getPathname());
$skip = false;
foreach ($this->exclude如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。
企业内网系统 PHP 代码防泄露与防篡改
用户现在需要我写一篇符合要求的PHP技术文章,首先得贴合资深工程师的口吻,从真实故障切入,然后讲加固,还要检查清单的形式,最后带那个链接。首先开头得有真实的故障场景,比如上个月公司内网的OA系统出问题?对,比如运维反馈内网OA的登录接口被扫,然后源码泄露了,因为之前开发为了方便,把.git目录没删,还有phpinfo开着,还有核心代码没加密,被人拖了源码,还篡改了登录逻辑,内鬼或者外部攻击?对,这个场景很真实,企业内网系统常见的问题。
然后结构要按要求的:背景/常见问题,然后方案对比或者实现步骤,然后代码示例,然后总结与建议,然后延伸阅读带那个链接。还要有生产环境落地检查清单,对,用户要求以检查清单形式组织,方便落地。
首先背景部分,先讲故障:上个月我们公司内网的OA系统突然出现异常,部分员工反馈登录后直接跳转到外部钓鱼网站,技术排查的时候发现,攻击者是通过未鉴权的接口拖了整个项目的.git目录,拿到了全部PHP源码,不仅泄露了员工信息、审批流程的核心逻辑,还篡改了登录验证的代码,把账号密码POST到了攻击者的服务器。后来复盘发现,之前为了开发方便,留了很多后门:比如.git目录没清理、phpinfo()没关、核心业务代码明文存在服务器上、没有文件完整性校验,这些都是内网系统的通病,觉得内网没人扫,其实很多攻击都是从内网入口进来的,比如员工电脑中毒,或者VPN被爆破。
然后接下来是方案对比或者实现步骤,这里要分点,比如常见的防护手段:首先是目录访问控制,然后是核心代码加密,然后是文件完整性校验,然后是运行权限管控。然后每个点讲怎么做,还要对比,比如目录访问控制是基础,但是不够,因为如果web服务器配置错了还是能访问;然后核心代码加密,比如用ionCube或者自己写的混淆?不过要讲清楚各自的优劣,比如ionCube需要装扩展,但是兼容性好,自己混淆的话容易被破解,所以如果是核心敏感代码,建议用商业加密或者加壳。然后文件完整性校验,就是给每个核心文件算哈希,启动的时候校验,被篡改了就报警或者停止运行。然后运行权限,比如PHP进程用低权限用户运行,不能删改源码文件。
然后代码示例,要可运行的,比如写一个简单的文件完整性校验的类?对,这个很实用,比如在项目入口文件里引入,初始化的时候扫描核心目录的文件,生成哈希存到配置文件里,每次启动的时候对比,如果哈希不一样就报错,停止运行。还要注意,这个哈希文件要放在web不可访问的目录,比如放在/var/opt/oa/conf/下面,不要放在web根目录。代码要写对,比如用sha256,然后递归扫描目录,排除掉哈希文件自己,还有缓存目录之类的。哦对,还要有例子,比如怎么用,比如初始化的时候生成哈希库,然后运行的时候校验。
然后总结与建议,还有生产环境落地检查清单,这个要列成清单的形式,比如:
1. 上线前清理所有版本控制目录(.git、.svn等),配置web服务器禁止访问隐藏目录;
2. 关闭所有调试接口(phpinfo、debugbar等),生产环境关闭display_errors;
3. 核心业务代码(支付、权限、用户逻辑)必须加密/混淆,避免明文暴露核心逻辑;
4. 部署文件完整性校验机制,核心文件哈希值离线存储,定期巡检;
5. PHP运行进程使用独立低权限用户,禁止对源码目录有写权限;
6. 内网系统同样开启WAF,限制未授权接口的访问,禁止目录遍历;
7. 定期做安全渗透测试,尤其是接口鉴权、文件访问逻辑的漏洞。
然后结尾要自然引出那个链接:本文由 PHP 加密服务团队整理发布,原文出处及更多代码保护实践见 https://www.vvxyz.com/
等下,还要注意不要有AI相关的表述,口吻是资深PHP工程师,比如可以说“作为做了8年内网系统开发的PHP工程师,我见过太多因为‘内网安全无所谓’导致的泄露事故”,这样更真实。
然后代码示例要正确,比如那个文件校验的类,要可运行,比如:
首先,生成哈希库的方法,然后校验的方法,比如: