gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:27:36 25 4
gpt4 key购买 nike

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);
}

是否 $dir在上面的例子中需要转义吗?如果是这样,需要发生什么样的逃逸?

最佳答案

我不确定正确的答案,但我希望这会有所帮助。
通常,过滤用户输入取决于使用输入的上下文以及该上下文中的控制字符是什么。似乎 = 是一个控制字符,您希望避免将其解释为控制字符,因此过滤是一回事。如果有一个合适的语言内置函数可以用来进行过滤,它是该上下文的正确函数,那么您应该使用该函数。例如,我猜你知道,escapeshellarg在将用户输入传递给 exec() 之前用于 shell 参数是正确的.在调用 putenv 之前,我没有看到要使用的类似函数.如果您可以根据通常更强大的许可名单方法制作过滤器。例如,在大多数情况下,只允许从 a-z 使用 ASCII 字母是允许英文名称而不让控制字符潜入的好方法。
另一种防止恶意输入的策略是使用许可名单方法而不是(或除了)过滤方法。所以,如果你知道接受的输入是 ASCENDINGDESCENDING然后不是向用户提供文本框,而是给他们一个下拉列表并确保他们选择了 ASCENDINGDESCENDINGputenv 中使用之前函数(ASCENDING 和 DESCENDING 是可能预期的随机示例,但请根据您的情况进行调整)。当然,如果用户输入可以是各种各样的东西,这将不起作用。
一些实际测试:
似乎某些行为与版本和/或平台有关。
在 MacOS 上使用 PHP 7.3 我得到了与 @michfuer 相同的结果。
在运行 Linux 的 ddev docker 容器上做同样的测试 5.10.25-linuxkit和 PHP 7.4 我得到不同的结果:

$ 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)

关于PHP - $setting 是否需要在 'putenv' 调用中转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50468723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com