学习一个PHP中用于检测危险函数的扩展Taint
在日常的开发中,安全性一直是我们要研究的重点内容之一。而在安全性中,最主要的一点就是我们的输入数据。所有的攻击和越权,都是从一个不经意间遗留的请求漏洞发生的。当然,现在很多框架已经为我们解决了大部分的安全性问题,但百密一疏,总会有意想不到的地方忘了加过滤或者遗漏了某些验证。今天我们要学习的这个扩展就是为我们解决这种问题而诞生的。 什么是 Taint
上篇文章中就得到过,我们还要介绍一个鸟哥的扩展工具,Taint 这个扩展就是鸟哥大神的作品之一。不过这个扩展是不推荐安装在生产环境的,它主要的战场是在我们的测试环境中使用。它的主要功能就是如果我们使用了未经处理的 $_GET 、 $_POST 、 $_COOKIE 之类的变量,就会报出警告信息。注意,只是警告,而不是错误或者异常。一般在线上环境我们都会习惯性地关掉警告信息的报错,所以这个扩展在线上的功能有限。
扩展的安装非常简单,下载对应的扩展然后进行普通的扩展安装即可,不需要额外的其它操作系统中组件的支持。对于这个扩展的详细信息,可以参考文末第二条链接中鸟哥文章的说明。 怎么用?
php.ini 中打开扩展,然后设置 taint.enable = 1 。就正式启用这个扩展了。然后我们通过代码来测试。 $a = $_GET["a"]; $file_name = "/tmp" . $a; $output = "Welcome, {$a} !!!"; $var = "output"; $sql = "Select * from " . $a; echo $a, "
"; // Warning: main() [echo]: Attempt to echo a string that might be tainted in /data/www/blog/taint/1.php on line 10 echo $output, "
"; // Warning: main() [echo]: Attempt to echo a string that might be tainted in /data/www/blog/taint/1.php on line 12 print $var; echo "
"; // Warning: main() [print]: Attempt to print a string that might be tainted in /data/www/blog/taint/1.php on line 14 include($file_name);echo "
"; // Warning: main() [include]: File path contains data that might be tainted in /data/www/blog/taint/1.php on line 16 mysqli_query(null, $sql);echo "
"; // Warning: main() [mysqli_query]: SQL statement contains data that might be tainted in /data/www/blog/taint/1.php on line 18
我们使用 php -S 来调试这个测试文件,当访问这个测试文件并且带上 a 参数之后,就可以看到下面的这些操作都会报出警告信息。未经过滤的这个 $a ,不管是拼接到字符串中,还是作为可变变量,只要是通过 echo 、 print 、 include 或者是 mysqli_query() 这些函数调用后,都会马上出现报警,提示你使用的这个数据字符串是需要进行过滤的。taint 的意思是 污点 。might be tainted 也就是有污点内容的意思。
大部分输出或者操作数据库之类的函数都会报出这些警告,这些内容的具体信息可以在官方文档中查询到。
我们还可以通过一个判断函数来验证一个变量中是否包含这类未处理的数据。 var_dump(is_tainted($var)); // bool(false) echo "
"; var_dump(is_tainted($output)); // bool(true) echo "
"; 怎样不报警?
怎样不让它报警?那当然就是对数据进行处理啦。 $output = "Welcome, ".htmlentities($a)." !!!"; echo $output, "
"; $sql = "Select * from " . mysqli_escape_string(null, $a); mysqli_query(null, $sql);echo "
";
在输出的时候进行 html 编码一下,对应的就是 XSS 攻击的防范。在数据库操作的时候 escape 一下,对应的就是处理掉 SQL 注入的攻击。使用了这些处理函数对数据进行安全性处理之后就不会报警告信息了。
由此可以看出,这个扩展确实是我们在日常开发调试中,特别是测试环境中的好帮手。就像前面所说的,总会有遗漏和遗忘的地方,通过这个扩展让程序来自动发现这些内容,对于我们开发的安全来说就能够有非常大的提高。 检测及转换函数
最后在 Taint 扩展中,还提供了两个函数用于强制进行警告和解除警告的作用,当然,也是为了我们在测试环境中的调试方便。 $newOutput = "Welcome !!!"; echo $newOutput, "
"; var_dump(taint($newOutput)); // bool(true) echo $newOutput, "
"; // // Warning: main() [echo]: Attempt to echo a string that might be tainted in /data/www/blog/taint/1.php on line 39 $newOutput = "Welcome {$a} !!!"; echo $newOutput, "
"; // Warning: main() [echo]: Attempt to echo a string that might be tainted in /data/www/blog/taint/1.php on line 42 var_dump(untaint($newOutput)); // bool(true) echo $newOutput, "
";
taint() 函数可以让一个正常的语句报出警告。而 untaint() 则可以让一个本身应该报警的数据不报警。 总结
同样还是非常小众的扩展,但是学习了之后发现还真的是挺有用的,而且特别适合在我们的测试环境中向大家提供一个全面检测安全质量的报警系统。就像文中一直强调的那样,对于中大型的项目开发来说,遗漏是不可避免的,即使有完善的 code review 机制,但也总会有所有人都遗漏的漏洞存在。通过程序的方式来检验自然是最好不过的,大家可以多多尝试一下。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/02/source/1.学习一个PHP中用于检测危险函数的扩展Taint.php
参考文档:
https://www.php.net/manual/zh/book.taint.php
https://www.laruence.com/2012/02/14/2544.html
还记得这些手机的型号吗?还有朋友用过这些手机的吗?现在拿出来看看,回想一下当年留下的记忆吧!这手机应该有十几年了,按键都掉了还记得三星的手机吗以前有一台手机用已经很有面子的了,以前一部手机可以用几年,又省
聊一款表里如一的低调游戏本一提到惠普游戏本,大家的第一反应可能是暗影精灵系列,但其实惠普游戏本阵营有两大系列暗影精灵和光影精灵。相比于暗影,光影精灵系列要低调得多,造型商务内敛,不搞杀马特RGB,今年还换了
十大最有价值的手机,全都是古董1973年4月3日,位于纽约曼哈顿的摩托罗拉实验室里爆发出一阵阵掌声。我们成功了!研究团队的领导者马丁库帕举着他们的研究成果世界上第一部手机。它的诞生意味着一个新时代的开始无线通信
闭着眼都能选的手机,目前这4部手机最值得考虑,你会怎么选?闭着眼都能选的手机,目前这4部手机最值得考虑,你会怎么选?第一部小米MIX4新发布的小米MIX4手机,你们看了没有?不得不说还是非常惊艳的,有两点让我也无法抗拒。第一点就是实现了真
摩托罗拉两款手机发布1亿像素摄像头加持2021年8月6日,根据多家科技媒体的消息,摩托罗拉在上海举行新品手机发布会,正式发布了旗下edge两款新机,分别为edgespro和edges轻奢版。其中,对于摩托罗拉edges
今年小米手机汇总小米MIXFOLD售价9999MIXFOLD小米折叠屏手机5G2K折叠屏骁龙888一亿像素哈曼卡顿立体声四扬声器12GB256GB黑色游戏手机,三月上市小米11Ultra小米11U
小米MIUI12。5开始推送,推送的型号有你的手机吗近日,小米手机开始全新的MIUI小部件内测征募,官网表明,这次将让负一屏和手机桌面面目一新。据内测征募数据表明,MIUI小部件将新增加好几个基本功能全新的网格机制新增加224244
小米,在东南亚智能手机市场也超越三星电子小米小米在欧洲取得出色的成绩Canalys,出货量增加107,占据22的市场份额,三星19小米在东南亚智能手机市场上首次超过三星电子成为龙头企业。国内媒体援引市场调查企业Canal
电商时代已成过去式?未来有哪些发展模式?最近十几年,对我们的生活产生巨大的改变应该就是互联网时代了。互联网的普及与发展造就新生了很多互联网产业,其中电商的整体规模也是非常大。马云创立的阿里巴巴毫无疑问是电商行业里头的领头
更懂你的智能手表三星GalaxyWatch4图赏三星不但发布了折叠屏手机新品,还带了GalaxyWatch4搭载由三星与谷歌深度合作的WearOStrade操作系统。搭载BioActive身体活力传感器,可以测量血氧水平,还能够
TikTok被评为2020年下载量最大的应用英国BBC根据数字分析公司AppAnnie的数据,TikTok是2020年全球下载量最大的应用程序,因为它从FacebookMessenger中夺得头把交椅。这个中国视频分享平台是