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年发布的第一版。

但是,到了PHP8以后,因为JIT的引入,和大量内部结构的改写,我觉得要迁移的成本实在是太大,太难,甚至觉得不太可能了。因为原来的标记我们是保存在GC_FLAGS里面,而到PHP8.0以后,已经没有任何一个bit是可用的了。再加上,这些bits是非常内部的,也就是说如果要维护这个扩展可用,我需要随时监控对这些bits的使用,发现破坏就需要调整。
另外,Taint劫持了大量的PHP的方法和Opcodes handler来维持Taint的信息的传递,基本上就是要实现同样的功能,然后保证字符串的Taint位不被丢弃,所以我就也需要监控这些方法和Opcodes handler的变化,如果有变化,我就需要在Taint对应的地方同步变化。
实在是太复杂了。。。。并且我当时还需要同时维护PHP本身,以及自己其他的几个项目,以及这个是比较无趣的纯体力活,所以就。。。

申明放弃维护。
Taint的转机:
在Vibe Coding已然成为一种新型生产力的今天,我其实也一直没想过说要让AI来干这活,觉得过于复杂,需要了解PHP的很多内部定义和实现细节。前几天看到了阿里千问发布了Qwen-3.8,2.4T,核心强调了它的编程能力,于是我就想试试看看千问是否可以。
我本地用的是Obsidian+Claudian+CC Switch用qwen-3.8-max, 所有的一切都开始于我给它了一句话(当然,本地我有php-src的源代码,和Taint本身的代码,和我其他的开源项目源代码可以供他查看):

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

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

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

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

经过我大概半小时的Review,我觉得,它大概率,看起来,应该是靠谱的, 嗯Qwen-3.8-Max编程能力,我觉得是可以的, 能满足我日常的项目维护需求。....
总结一下:
全程耗时接近5个小时,今天一共消耗了2亿Token(当然其中有点其他工作,但应该影响不大),花费406RMB,客观讲这个消耗量有点大,2000多行的项目来说,大量的Token应该消耗在了理解PHP庞大的代码库内的各种细节吧,后续类似的项目应该有很大提升空间。


完成了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