半年没碰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。
五、最后
刚完成核心功能,还有不少界面要再修饰。外包公司总免不了接一些奇怪的活。忙活了大半个月终于快忙完了…
Comments | NOTHING