某PHP+MySQL商城二次开发踩坑记

发布于 2017-03-21  5.03k 次阅读


半年没碰PHP了,实习公司忽然给安排了一个PHP+MySQL的商城二次开发的活。跟客户简单聊了几句以后,发现他也懂不少技术,然后明白了原来是他先进行了一部分开发,估计是遇到困难了才丢给我们干。这种活要是我自己的话根本就不接的,不过既然已经接下来了我就只好硬着头皮干了。

一、配置环境的问题

一开始我直接用docker建了一个php 5.6+nginx 1.10的镜像,具体见这里。结果上来就有错,打不开网页。

然后我定睛看了一下,根目录下有.htaccess文件,应该是apache。然后我又建了个apache 2.4 + PHP 5.6的镜像,还是打不开网页。

果断建个文件info.php,内容是 <?php phpinfo(); ?> 传到FTP上看一下,原来是PHP 5.3+apache 2.2,而且是Windows NT系统。寻思着用PHPStudy建的不就是5.3环境么?迅速下载安装PHPStudy,果然正常运行了。

可是开发的时候开一个Windows虚拟机太费电了,我就google了一个PHP 5.3+apache的docker镜像,果然也成功的跑起来了。把开发目录映射到容器的/var/www/html,不打开网站的话几乎不占系统资源。

至于数据库,我直接用的mariadb镜像,用docker-compose将db和apache镜像连起来,apache镜像中直接使用db就能访问。不使用的时候直接退出docker。

二、哪里入手分析?

我先看了一下.htaccess文件,看到所有的非admin页面流量都导到了index.php中,打开index.php发现关联很复杂,没办法继续分析。

然后我登入后台,搜索了一个字符串,看到这个字符串在XXXsys/admin/template/admin.temp.php中。这里应该就是template模板目录。

导航中的URL类似于/member/user/lists,找到外层的member/member.action.php果然有public function lists()方法。也就是说,访问/member/user/lists就会执行lists()方法。

往下拉lists方法看到了类似于include member.user.list的字样,在member/template/member.user.temp.php中果然有它的模板文件。而lists()函数就是逻辑了。

我试着自己建立了一个public function addAgent()方法,然后建了相应的temp.php,在addAgent最后包含它,刷新,后台成功的出现了我新加的页面。到这里就已经完全明白了它的逻辑。

三、数据库的坑

我建立了一个新数据库,结果执行更新操作无法进行,一直有warning:

*************************** 1. row ***************************
Level: Warning
Code: 1292
Message: Truncated incorrect INTEGER value: '上海市'

*************************** 2. row ***************************
Level: Warning
Code: 1292
Message: Truncated incorrect DOUBLE value: '上海市'

明明申明的是varchar类型,插入的时候也没问题,更新的时候怎么就出现了转换到数字和浮点数问题?

谷歌了半天也没解决。最后忽然发现是UPDATE语句中,SET后面多个字段应该用,(逗号)而不是AND连接,吐血。各种调试代码,最后直接在数据库执行才发现问题。特此记录一下。

四、停止使用字符串过滤

可能因为年代比较久远,没想到这个系统中还使用_htmlguolv()这种函数来过滤$_POST和$_GET请求,然后用字符串.拼接的方式拼成sql语句运行查询。最为讽刺的是他用的是mysqli,却一直使用mysqli->query()方法——把面向对象的方式当面向过程用,醉醉的。

其实几年前人们就普遍发现,特殊符号和单词过滤的方法并不能防止SQL注入。要想真正防止,得用预处理的方法。也就是这样:

$statement = $this->mysqli->prepare("SELECT `name` FROM `table` WHERE `id` = ?");

这样以后mysql就接受到了一个命令,即,我接下来要根据id从table表中选出name列。那么不管?中是怎样精心处理的恶意代码,mysql都不可能去执行诸如删库跑路这种操作。

详细的过程请参阅PHP Manual - Mysqli

五、最后

刚完成核心功能,还有不少界面要再修饰。外包公司总免不了接一些奇怪的活。忙活了大半个月终于快忙完了…