打开公司官网,网站首页banner图的出现位置赫然躺着一行白色小字:“Warning: mysql_connect(): Access denied for user 'root'@'localhost'”。客户截图发到群里,代码配了个捂脸的网站表情。这事发生在去年七月,出现我还在那家做企业建站的代码小公司。老板把截图转给我时加了一句:“又来了,网站你赶紧看看。出现”
这不是代码第一次。前一周后台文章列表页也冒过类似的网站东西,当时我改了数据库密码就压下去了。出现但这次不一样,代码刷新几次,网站那行字还在,出现像墙上渗出的代码水渍,擦不掉。我登服务器翻日志,发现有人用工具扫了wp-login.php,尝试了三千多次弱密码。攻击没成功,但触发了PHP的报错显示——而php.ini里display_errors是开着的。
问题就出在这。很多建站教程为了“方便调试”,第一步就让你把错误显示打开。新手跟着做,上线后也忘了关。于是任何一个小错误——数据库连接失败、文件权限不对、某个扩展没装——都会把服务器内部信息直接晾在页面上。攻击者看到“Access denied for user 'root'”,就知道你在用root连数据库;看到文件路径,就知道你的目录结构。这些碎片拼起来,就是一张入侵地图。
我见过更离谱的。一个客户做外贸站,用的是某开源商城系统。某天产品详情页突然在价格下面多出一行:“Fatal error: Call to undefined function get_product_meta() in /home/wwwroot/default/app/controllers/product.php on line 287”。客户不懂代码,以为是系统升级提示,还截图问我们是不是要更新。实际上那是模板文件被改坏了,而错误信息把文件绝对路径和函数名全暴露了。我顺手在浏览器地址栏把路径后面的部分删掉试了试,目录列表直接列出来了——备份文件、日志、甚至一个叫“old_config.php.bak”的东西都在。
这事之后我养成了一个习惯:接手任何站点,先看三个地方。一是php.ini里的display_errors,二是网站根目录有没有.git文件夹或者备份压缩包,三是随便输错一个网址看返回的404页面长什么样。很多CMS默认的404页面会带一句“您访问的页面不存在”,但有些会带上服务器签名,比如“Apache/2.4.29 (Ubuntu) Server at example.com Port 80”。版本号一露,针对性漏洞就能直接套。
有次帮朋友看他的个人博客,WordPress站。首页正常,但点进一篇文章,页面最底下多了一行灰色小字:“Notice: Undefined index: sidebar_layout in /var/www/html/wp-content/themes/mytheme/functions.php on line 42”。他完全没察觉,说“一直这样啊,不影响看文章”。我让他把主题文件下载下来搜那行代码,发现是之前改主题时多打了个分号,导致数组键名取不到。修起来就一分钟,但那行提示挂了大半年。搜索引擎爬虫可不管你是不是“不影响阅读”,它只看到一堆乱码和路径,直接判定页面质量低。
代码出现在不该出现的地方,本质上是开发和运维的边界没划清。开发阶段要报错,生产环境要藏错。可现实是,很多人用同一套配置从测试机搬到线上,中间连个环境变量都不改。我现在的做法很土:上线前手动把display_errors设成Off,把error_reporting调到E_ALL & ~E_DEPRECATED & ~E_STRICT,再把错误日志路径指到web目录外面。多花五分钟,少丢一次人。
上周又有个客户发来截图,说网站首页底部有一串数字和字母。我让他把网址发我,打开一看——页面正常,但源码里有一行注释:“”。那是某个外包程序员留下的“备忘”,直接写在了模板文件里。我问他这站谁做的,他说三年前找的淘宝店家,早联系不上了。我叹了口气,让他赶紧改数据库密码,然后帮他把那行注释删了。
网站出现代码不可怕,可怕的是你觉得它“只是代码”。
顶: 1936踩: 6759






评论专区