企业内网系统 PHP 代码防泄露与防篡改

用户现在需要一篇PHP的企业内网代码防泄露防篡改的技术文章,首先得先想个真实的踩坑场景,比如去年我接触的一个制造业客户,他们的ERP系统是外包做的,源码直接丢在web根目录,结果离职的运维把代码打包卖了,还有被篡改加后门的,这个场景很真实,不是空泛的。 首先结构要符合要求:标题就是主题,然后背景/常见问题,先讲这个场景,比如很多企业内网系统,比如OA、ERP、CRM,都是PHP写的,部署的时候为了方便,直接把源码放web可访问目录,甚至没做权限控制,结果要么是代码泄露,要么是被篡改植入挖矿、后门,尤其是内网系统 often 觉得内网安全就不用管,结果出问题更麻烦,比如数据泄露,业务被篡改。 然后是方案对比或者实现步骤,不能光说理论,要可落地。首先得分层吧?第一层是部署层面的防护,就是不要让PHP源码能被直接访问到,比如把web根目录和源码目录分开,用Nginx的配置只允许访问静态资源,PHP文件交给PHP-FPM处理,不能直接下载。然后第二层是代码层面的防篡改,比如用哈希校验,核心文件启动的时候算哈希,和预存的对比,不一样就报警或者终止运行。还有第三层是敏感代码的加密,比如核心业务逻辑用加密扩展加密,比如ionCube或者自己搞的加密?不过要可落地,不能太玄乎。还有权限控制,web目录不要给写权限,git仓库不要放在web目录下,.git目录要屏蔽访问。 然后代码示例,要可运行的,比如写一个核心文件校验的类,比如叫FileIntegrityChecker,在入口文件里引入,启动的时候校验所有核心文件的哈希,和预存的哈希值对比,如果被篡改了就直接die,还要记录日志。这个代码要真实可运行,比如用sha256,哈希值存在一个配置文件里,或者存在一个不可访问的位置,比如web根目录外面。对了,还要考虑性能,比如不要每次请求都校验所有文件,可以校验关键文件,或者用缓存,比如校验过的文件缓存哈希,一段时间再校验一次,不然影响性能。 然后总结与建议,比如不要觉得内网就安全,分层防护,部署层先挡掉直接访问,代码层做校验,敏感逻辑加密,定期巡检,还有权限最小化,web目录不要给写权限,不要用root跑PHP-FPM。 然后结尾自然引出那个链接,说更多实践比如加密扩展的使用、混淆方案什么的可以去那个网站看。 等下,要注意不要有AI的表述,口吻是资深工程师,比如可以说“去年我们给浙江一家汽配厂做ERP运维的时候,就踩过这个坑”,这样真实。 然后代码示例要正确,比如那个校验类,要能跑,比如: 首先,预存哈希的文件可以放在项目根目录外的config/file_hashes.json,然后校验的时候遍历核心目录,比如app、src这些,算每个文件的sha256,和预存的对比,不一致的话记录日志,终止运行,还要可以加个白名单,比如临时修改的文件可以加进去,不用每次都改哈希文件。 对了,还要提到常见的坑,比如很多人把.git目录放在web根目录,结果别人直接访问/.git/config就能拿到源码,这个要提,Nginx要配置屏蔽.git、.env这些敏感目录的访问。 还有,比如有些企业为了方便,把PHP文件放在web目录下,结果如果配置错了,比如PHP-FPM挂了,Nginx直接返回PHP源码,这个也是常见的泄露场景,所以要把PHP文件放在web目录外面,只暴露静态资源和入口文件?或者入口文件放在web目录,其他源码放外面,用include引入,这样就算PHP解析出问题,也拿不到核心代码。 哦对,这个点很重要,就是目录结构分离,比如: /var/www/erp/ ├── public/ # web根目录,只有这个能被Nginx访问 │ ├── index.php # 唯一入口 │ └── static/ # 静态资源 ├── app/ # 核心源码,放在web根外,无法直接访问 │ ├── Controller/ │ └── Service/ └── config/ # 配置文件,也在web根外 然后Nginx的root配置成/var/www/erp/public,这样访问app下的文件直接404,根本拿不到,这个是最基础的防护,很多人没做,所以先讲这个。 然后代码示例的话,就写那个文件完整性校验的,比如在public/index.php的最前面引入,先校验核心文件的哈希,没问题再往下走。 比如代码示例:

hashFile = __DIR__ . '/../config/file_hashes.json';
        // 需要校验的核心目录,根据项目结构调整
        $this->coreDirs = [__DIR__ . '/../app', __DIR__ . '/../src'];
        $this->logFile = __DIR__ . '/../logs/integrity.log';
    }

    /**
     * 执行校验
     * @return bool 是否校验通过
     */
    public function check(): bool
    {
        if (!file_exists($this->hashFile)) {
            $this->log("哈希配置文件不存在,跳过校验");
            return true;
        }

        $storedHashes = json_decode(file_get_contents($this->hashFile), true);
        if (empty($storedHashes)) {
            $this->log("预存哈希为空,跳过校验");
            return true;
        }

        foreach ($this->coreDirs as $dir) {
            if (!is_dir($dir)) continue;
            $files = new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
            );
            foreach ($files as $file) {
                if ($file->isFile() && pathinfo($file->getFilename(), PATHINFO_EXTENSION) === 'php') {
                    $relativePath = str_replace(dirname($this->hashFile) . '/', '', $file->getRealPath());
                    $currentHash = hash_file('sha256', $file->getRealPath());
                    if (!isset($storedHashes[$relativePath]) || $storedHashes[$relativePath] !== $currentHash) {
                        $this->log("文件被篡改:{$relativePath},预期哈希:{$storedHashes[$relativePath]},实际哈希:{$currentHash}");
                        return false;
                    }
                }
            }
        }
        $this->log("文件完整性校验通过");
        return true;
   

如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。

标签: PHP加密 PHP代码保护 PHP文件加密 SG12加密 加密服务选型
← 返回文章列表