5.3.2 漏洞防范
关于命令执行漏洞的防范大致有两种方式:一种是使用 PHP 自带的命令防注入函数,包括 escapeshellcmd() 和 escapeshellarg(),其中 escapeshellcmd() 是过滤的整条命令,所以它的参数是一整条命令,escapeshellarg() 函数则是用来保证传入命令执行函数里面的参数确实是以字符串参数形式存在的,不能被注入。除了使用这两个函数,还有对命令执行函数的参数做白名单限制,下面我们来详细介绍。
5.3.2.1 命令防注入函数
PHP 在 SQL 防注入上有 addslashes() 和 mysql_[real_]escape_string() 等函数过滤 SQL 语句,在命令上也同样有防注入函数,一共有两个 escapeshellcmd() 和 escapeshellarg(),从函数名我们可以看出,escapeshellcmd() 是过滤的整条命令,它的函数说明如下:
string escapeshellcmd ( string $command )
输入一个 string 类型的参数,为要过滤的命令,返回过滤后的 string 类型的命令,过滤的字符为'&'、';'、'`'、'|'、'*'、'?'、'~'、'<'、'>'、'^'、'('、')'、'['、']'、'{'、'}'、'$'、'\'、'\x0A'、'\xFF'、’%’,'和"仅仅在不成对的时候被转义,我们在 Windows 环境测试下,测试代码:
<?php echo ( escapeshellcmd ( $_GET['cmd'] ));? >
结果如图 5-12 所示。
可以看到这些字符过滤方式是在这些字符前面加了一个^符号,而在 Linux 下则是在这些字符前面加了反斜杠(\)。
escapeshellarg() 函数的功能则是过滤参数,将参数限制在一对双引号里,确保参数为一个字符串,因此它会把双引号替换为空格,我们来测试一下:
<?php echo 'ls '.escapeshellarg ( 'a"' );? >
图 5-12
最终输出为 ls"a"
5.3.2.2 参数白名单
参数白名单方式在大多数由于参数过滤不严产生的漏洞中都很好用,是一种通用修复方法,我们之前已经讲过,可以在代码中或者配置文件中限定某些参数,在使用的时候匹配一下这个参数在不在这个白名单列表中,如果不在则直接显示错误提示即可,具体的实施代码这里不再重复。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论