去年帮朋友搭一个本地花店的免费码展示站,预算零。站源我翻了三天源码站,免费码下过七个压缩包,站源最后能跑起来的免费码只有两个。这不是站源源码的问题,是免费码我没搞懂“免费”这两个字在PHP圈里的真实含义。
免费PHP源码分三种。站源一种是免费码真开源,MIT或GPL协议,站源代码扔在GitHub上,免费码作者偶尔修修bug。站源另一种是免费码“免费版”,功能砍掉一半,站源数据库表少几个字段,免费码后台处处提示你升级付费版。还有一种是打包站从别人付费产品里扒出来的,里面可能藏着后门,或者干脆连安装说明都是错的。
我下过一个号称“企业级CMS”的源码,解压后目录结构挺像样,admin、api、config一应俱全。打开config.php,数据库配置项旁边有一行注释:// 请勿删除以下验证代码。下面是一段base64编码的字符串。解码后是一个远程URL,每次访问后台都会向那个地址发送服务器IP和PHP版本。这玩意儿不叫源码,叫木马。
真正能用的免费源码,往往长得不起眼。我现在常备的是一个单文件PHP图床程序,不到200KB,没有后台,上传接口就一个upload.php。作者在文件头部写了三行注释:别删这行,别改那个变量,出问题看README。README是英文的,最后一句是“If it breaks, you get to keep both pieces.” 挺实在。
选源码之前先想清楚你要什么。如果只是做个静态展示页,其实用不着PHP,纯HTML加CSS半小时搞定。需要动态内容再考虑PHP,比如用户登录、文章发布、订单提交。这时候你要评估的是:数据库表结构合不合理,有没有SQL注入防护,文件上传有没有做MIME校验。这些比界面好不好看重要得多。
有个简单的测试方法。把源码里的所有文件用grep搜一遍,找eval、base64_decode、exec、system这几个函数。如果出现在核心逻辑文件里,直接删。正常的业务代码用不着这些。再搜curl_init,看看请求的URL是不是指向作者自己的服务器。如果是,问清楚干什么用的。
安装过程也能看出问题。好的源码会提供install.php,引导你填数据库信息,自动建表。差的源码让你手动导入SQL文件,结果SQL里字段类型写错了,导入报错,作者早就不维护了。更差的是连SQL文件都没有,让你照着截图自己建表。
我现在的做法是:先看GitHub上的star数和最近commit时间。超过一年没更新的,除非功能极简,否则不考虑。再看issue区,如果有人在问“这个漏洞修了吗”而作者没回复,跳过。最后下载下来在本地虚拟机跑一遍,用Burp Suite扫一下登录接口。花两小时做这些,比上线后被挂马强。
免费不等于廉价。好的免费源码是作者用业余时间维护的,你提issue他可能回,你捐杯咖啡他可能笑。但别指望他给你做定制开发。心态摆正:你得到的是一个起点,不是终点。想加功能,自己读代码改。改不动,要么换,要么学。
那个花店站最后用的是我改过的单文件图床程序加一个手写的留言板。总共不到400行代码。朋友问为什么不用现成的CMS,我说现成的CMS有3000个文件,出问题我不知道从哪查。这400行每一行我都知道在干什么。免费源码最大的价值不是省了钱,是让你有机会把每一行都搞明白。