3

这是一个非常愚蠢的问题,对不起。有一个很大且相当复杂的系统有一个错误,我设法将其追踪到这一部分

return str_replace('%2F', '/', rawurlencode(str_replace('%20', ' ', $key)));

有一条注释解释了为什么要替换斜线 - 以保留路径结构,例如编码 1/编码 2/等。但是,没有任何解释为什么 %20 被空格替换,而这部分是错误的直接原因。我很想删除 str_replace() 但看起来它是出于某种原因放在那里的,我觉得这样做会破坏其他东西。有没有人遇到过类似的事情?也许这是对某些 PHP 错误的肮脏修复?任何猜测和见解都非常感谢!

4

3 回答 3

1

这样做会阻止%20(编码空间)被编码为%2F20. 但是,它仅用于防止双重转义空格;其他特殊字符仍会被双重编码。

这是错误代码的标志;首先不应允许传递给此函数的字符串具有编码字符。

我建议创建涵盖所有引用代码的单元测试,然后重构此函数以删除str_replace()以确保它不会破坏测试。

于 2013-02-14T16:44:32.443 回答
1

首先想到的是作为一种针对双重编码的缓解技术。

并不是说我会建议以这种方式做这样的事情,因为它会很快变得非常混乱(而且人们已经想知道为什么只有那个实体,也许“他们”从未与任何其他实体发生过问题......但是)。

于 2013-02-14T16:38:35.440 回答
1

这可能是对rawurlencode()vs误解的结果urlencode()

urlencode()+用符号替换空格

如果原作者认为rawurlencode()做同样的事情,他们会尝试对空格进行预编码,这样它们就不会变成+s

于 2013-02-14T16:39:17.680 回答