Press "Enter" to skip to content

Taint支持PHP8啦!

Taint是什么:

在我的几个开源项目中,有一个项目是唯一一个我主动因为实现困难,而“放弃维护”的,就是Taint。

简单来说,Taint是一个用来检测XSS/SQL/Shell注入漏洞的PHP扩展, 当你在PHP代码中尝试直接使用一个来自外部输入的“字符串”的时候,Taint会提示你:

Warning: mysql_query() [function.mysql-query]: First argument contains data that might be tainted in xxx.php on line x

它的实现原理也很简单,对于所有来自外部的字符串,比如来自_GET/_POST之类的,给加一个标记,然后Taint会劫持相关可能会“复制”这些字符串的PHP的Opcode Handler, 如果不对这些字符串做无害化处理,那就持续在复制间传递这个标记。

这个项目最初是2012年发布的第一版。

2026-08-17_1255_taint_article0.png

但是,到了PHP8以后,因为JIT的引入,和大量内部结构的改写,我觉得要迁移的成本实在是太大,太难,甚至觉得不太可能了。因为原来的标记我们是保存在GC_FLAGS里面,而到PHP8.0以后,已经没有任何一个bit是可用的了。再加上,这些bits是非常内部的,也就是说如果要维护这个扩展可用,我需要随时监控对这些bits的使用,发现破坏就需要调整。

另外,Taint劫持了大量的PHP的方法和Opcodes handler来维持Taint的信息的传递,基本上就是要实现同样的功能,然后保证字符串的Taint位不被丢弃,所以我就也需要监控这些方法和Opcodes handler的变化,如果有变化,我就需要在Taint对应的地方同步变化。

实在是太复杂了。。。。并且我当时还需要同时维护PHP本身,以及自己其他的几个项目,以及这个是比较无趣的纯体力活,所以就。。。

2026-08-17_1255_article1.png

申明放弃维护。

Taint的转机:

在Vibe Coding已然成为一种新型生产力的今天,我其实也一直没想过说要让AI来干这活,觉得过于复杂,需要了解PHP的很多内部定义和实现细节。前几天看到了阿里千问发布了Qwen-3.8,2.4T,核心强调了它的编程能力,于是我就想试试看看千问是否可以。

我本地用的是Obsidian+Claudian+CC Switch用qwen-3.8-max, 所有的一切都开始于我给它了一句话(当然,本地我有php-src的源代码,和Taint本身的代码,和我其他的开源项目源代码可以供他查看):

2026-08-17_1255_article2.png

我开始也没报太多希望,因为我自己都觉得比较难,中间也看到它:

2026-08-17_1255_article3.png

所以,我以为它应该会失败吧,过了很久以后,我看他在不断的翻看php-src的各种定义,应该是理解了Taint想要干啥后,已经有了实现方法路径, 验证各种假设,又过了很久后...

2026-08-17_1255_article4.png

啊哈? 你不是吹牛逼吧,哈哈,于是我就让它去做了,它吭哧吭哧吭哧吭哧干了好几个小时,默不做声,中间我去开了一个长会回来,它还在吭哧吭哧:

2026-08-17_1255_article5.png

又吭哧吭哧了很久,它做完了!

2026-08-17_1255_article6.png

经过我大概半小时的Review,我觉得,它大概率,看起来,应该是靠谱的, 嗯Qwen-3.8-Max编程能力,我觉得是可以的, 能满足我日常的项目维护需求。....

总结一下:

全程耗时接近5个小时,今天一共消耗了2亿Token(当然其中有点其他工作,但应该影响不大),花费406RMB,客观讲这个消耗量有点大,2000多行的项目来说,大量的Token应该消耗在了理解PHP庞大的代码库内的各种细节吧,后续类似的项目应该有很大提升空间。

2026-08-17_1255_article7.png

2026-08-17_1255_article8.png

完成了Taint的PHP8适配,后续我也只需要定期让AI帮我看一下PHP的Change Log,如果有更新,就同步调整Taint就好了。

我想说:

在当今的时代,想法可能会变得更重要,而具体的执行,AI真的是完全可以,并且,它越来越可以了。

很多时候我们对AI应用的局限,仅仅在于敢不敢让它去试. 反正Token也越来越便宜了,😂...

Taint的PHP8版本,已经上线我的Github Repo,欢迎大家围观千问的代码。。。。

https://github.com/laruence/taint

Note:本文由 Jarvis(作者的 AI 助理)从公众号「风雪之隅」自动同步至本博客。


微信公众号阅读公众号原文:《Taint支持PHP8啦!- 千问3.8 Coding挑战》

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.