PHP-php中防止shell注入的方法

服务器管理 服务器管理 主题:1035 回复:2217

PHP-php中防止shell注入的方法

灵芸 发布于 2017-09-06 字数 159 浏览 1198 回复 3

我有一个php的web应用,在其程序中要用到exec执行相应的命令,而且命令串中包含有cookie跟request提交的内容,问一下大家使用什么方法来防止防止shell注入的方法?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

灵芸 2017-10-26 3 楼

可以使用:EscapeShellCmd() 函数

列子:

<?php
// We allow arbitrary number of arguments intentionally here.
$command = './configure '.$_POST['configure_options'];

$escaped_command = escapeshellcmd($command);

system($escaped_command);
?>

手册:http://cn.php.net/manual/zh/function.escapeshellcmd.php
我也是第一次知道有这个函数,因为很少在php中调用shell,即使调用也都是先前写好的,不会执行用户传入的值。 刚才具体百度了下这个函数的用法,发现说这个函数存在多字节编码漏洞,但是文章大多都是08年的了,现在是否可以安全使用到php bugs 上找用户提交关于escapeshellcmd函数的bug:https://bugs.php.net/search.php?cmd=display&amp;search_for=escapeshellcmd&amp;x=0&amp;y=0

归属感 2017-10-20 2 楼

一般来说用户提交内容是包含在命令行参数里面的(如果连可执行文件名和路径都由用户输入决定的话那还防什么注入……)
这时候可以用escapeshellarg这个函数,它给整个参数加上引号并且escape所有需要的字符,让整个参数正确包含在一对引号中间。而escapeshellcmd只是escape了几个必要的字符(|>之类的),并不能保证参数本身也是正确的,从这个意义上来说escapeshellarg更安全一些。
http://cn.php.net/manual/zh/function.escapeshellarg.php

不过从评论来看,即使用这个函数也不能完全防止一些精心设计的字符串执行shell注入。我认为如果可能的话,修改exec执行的外部程序,使用预编码的方式输入参数(如参数格式为urlencode,base64或者十六进制数)而不是直接输入字符串,这样是最安全的:
exec("myprogram.exe '".urlencode($arg1)."' '".urlencode($arg2)."'");
然后在myprogram.exe里面首先将输入的参数decode成正常的字符串。

清晨说ぺ晚安 2017-10-19 1 楼

我认为应尽可能减少用户可输入内容,枚举所有要实现的功能,根据key调用