所以假设我们有以下代码:
<?php
$str = addslashes($_GET['str']);
$cmd = 'sometool "'.$str.'"';
system($cmd);
?>
它安全吗?我能以某种方式摆脱双引号吗?linux中的操作系统。
纯粹的理论考虑。我没有在代码中使用它;(
它不安全。您仍然可以传递一些恶意的参数,即执行系统中的其他文件。
$var = '$(sh file.sh)';
$str = addslashes($var);
$cmd = 'sometool "'.$str.'"';
system($cmd);
应该使用escapeshellarg
方法来转义shell参数。
$str = escapeshellarg($_GET['str']);
$cmd = 'sometool ' . $str;
system($cmd);
请注意,必须按原样使用参数$str
,并且它将是一个单独的参数。不能用引号'
或双引号"
将其括起来
最终不安全
与任何用户的输入一样,您不仅必须转义引号,还必须验证所提交数据的一致性,并且必须严格遵守这一点。
例如:如果"sometool"命令正在等待路径,则必须确保用户输入是有效的路径。如果路径必须位于受限制的位置,则必须检查该限制。
假设您的"str"必须是一个有效的字符串,那么您可以从filter输入函数开始。
https://www.php.net/manual/en/function.filter-input.php
确保使用适当的过滤器(用于引号、编码等(:https://www.php.net/manual/en/filter.filters.php.
要绕过这里的逃生通道是不可能的。
这在某种程度上确保了数据的一致性,但仍然必须确保命令"sometool"本身不会受到任何有效字符串或语法的影响,这就是为什么它仍然无法安全使用的原因。