关于php:学习一个PHP中用于检测危险函数的扩展Taint

40次阅读

共计 2914 个字符,预计需要花费 8 分钟才能阅读完成。

在日常的开发中,安全性始终是咱们要钻研的重点内容之一。而在安全性中,最次要的一点就是咱们的输出数据。所有的攻打和越权,都是从一个不经意间遗留的申请破绽产生的。当然,当初很多框架曾经为咱们解决了大部分的安全性问题,但百密一疏,总会有意想不到的中央忘了加过滤或者脱漏了某些验证。明天咱们要学习的这个扩大就是为咱们解决这种问题而诞生的。

什么是 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, "<br/>"; // Warning: main() [echo]: Attempt to echo a string that might be tainted in /data/www/blog/taint/1.php on line 10

echo $output, "<br/>"; // 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 "<br/>"; // 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 "<br/>"; // 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 "<br/>"; // 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 "<br/>";
var_dump(is_tainted($output)); // bool(true) 
echo "<br/>";

怎么不报警?

怎么不让它报警?那当然就是对数据进行解决啦。

$output    = "Welcome,".htmlentities($a)."!!!";
echo $output, "<br/>";

$sql       = "Select *  from" . mysqli_escape_string(null, $a);
mysqli_query(null, $sql);echo "<br/>";

在输入的时候进行 html 编码一下,对应的就是 XSS 攻打的防备。在数据库操作的时候 escape 一下,对应的就是解决掉 SQL 注入的攻打。应用了这些处理函数对数据进行安全性解决之后就不会报正告信息了。

由此能够看出,这个扩大的确是咱们在日常开发调试中,特地是测试环境中的好帮手。就像后面所说的,总会有脱漏和忘记的中央,通过这个扩大让程序来主动发现这些内容,对于咱们开发的平安来说就可能有十分大的进步。

检测及转换函数

最初在 Taint 扩大中,还提供了两个函数用于强制进行正告和解除正告的作用,当然,也是为了咱们在测试环境中的调试不便。

$newOutput = "Welcome !!!";
echo $newOutput, "<br/>";
var_dump(taint($newOutput)); // bool(true) 
echo $newOutput, "<br/>"; // // 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, "<br/>"; // 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, "<br/>";

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

正文完
 0