在system()函数中使用$_GET-安全问题



所以假设我们有以下代码:

<?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"本身不会受到任何有效字符串或语法的影响,这就是为什么它仍然无法安全使用的原因。

相关内容

  • 没有找到相关文章

最新更新