PHP - $setting 是否需要在“putenv”调用中转义?

Luk*_*ber 5 php escaping environment-variables

putenv函数采用单个参数,即字符串。该字符串应采用以下格式:KEY=VALUE

参考: http: //php.net/manual/en/function.putenv.php

将以下代码作为潜在用例:

if(getenv(ON_SOME_ENVIRONMENT)) {

  // What happens if $dir contains an '=' character?
  $dir = dirname(__FILE__);

  putenv('SOME_KEY=' . $dir);
}
Run Code Online (Sandbox Code Playgroud)

上面的例子中是否$dir需要转义?如果是这样,需要进行什么样的逃避?

gre*_*les 3

我不确定正确的答案,但我希望这能有所帮助。

一般来说,过滤用户输入取决于使用输入的上下文以及该上下文中的控制字符是什么。看来 = 是一个控制字符,您希望避免将其解释为控制字符,因此这是要过滤的一件事。如果有一种适当的语言内置函数可以用来进行过滤,并且该函数适合该上下文,那么您应该使用该函数。例如,我猜您知道,在将用户输入传递exec(). 在调用之前我没有看到类似的函数可以使用putenv。如果您可以基于白名单方法创建过滤器,那么通常会更强大。例如,在大多数情况下,只允许 az 中的 ASCII 字母表是允许英文名称而不让控制字符潜入的好方法。

防止恶意输入的另一种策略是使用白名单方法来代替(或补充)过滤方法。因此,如果您知道接受的输入是ASCENDINGDESCENDING,那么不要向用户提供文本框,而是给他们提供一个下拉列表,并确保他们在函数中使用它之前选择ASCENDING或(升序和降序是可能预期的随机示例,但根据您的情况进行调整)。当然,如果用户输入的内容多种多样,那么这就行不通了。DESCENDINGputenv

一些实际测试:

某些行为似乎确实与版本和/或平台相关。

在 MacOS 上使用 PHP 7.3,我得到了与 @michfuer 相同的结果。

在运行 Linux 和 PHP 7.4 的 ddev docker 容器上进行相同的测试,5.10.25-linuxkit我得到不同的结果:

$ php -a
Interactive mode enabled
php > putenv('SOME_KEY=foo/bar=baz');
php > var_dump(getenv('SOME_KEY'));         // value "foo/bar=baz"
string(11) "foo/bar=baz"
php > var_dump(getenv('SOME_KEY='));        // value "foo/bar=baz"
bool(false)
php > var_dump(getenv('SOME_KEY=foo'));     // value "foo/bar=baz"
bool(false)
php > var_dump(getenv('SOME_KEY=foo/bar')); // value "foo/bar=baz"
string(3) "baz"
php > var_dump(getenv('SOME_KEY=blarg'));   // value "foo/bar=baz"
bool(false)
php > var_dump(getenv('SOME'));             // value false
bool(false)
Run Code Online (Sandbox Code Playgroud)