3

かなりばかげた質問です、ごめんなさい。バグのある大きくてかなり複雑なシステムがあり、私はそれをこの部分まで追跡することができました

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

パス構造を維持するためにスラッシュが置き換えられる理由を説明するコメントがあります(例:encoded1 / encode2 / etc)。ただし、%20がスペースに置き換えられ、その部分がバグの直接の原因である理由はまったく説明されていません。str_replace()を削除したいのですが、何らかの理由でそこに配置されたようで、これを行うことで何か他のものを壊してしまうような気がします。誰かが似たようなものに遭遇したことがありますか?おそらくそれはいくつかのPHPバグの汚い修正ですか?推測や洞察は大歓迎です!

4

3 に答える 3

1

最初に頭に浮かぶのは、ダブルエンコーディングに対する軽減手法です。

このようなことをお勧めするわけではありません。すぐに本当に厄介になるからです(そして、なぜそのエンティティだけが、おそらく「彼ら」が他の人との問題を経験したことがないのか疑問に思うでしょう...まだ)。

于 2013-02-14T16:38:35.440 に答える
1

rawurlencode()vsの誤解の結果である可能性がありますurlencode()

urlencode()+スペースを記号に置き換えます

元の作者が同じことをしたと思った場合、スペースがsrawurlencode()に変換されないように、スペースを事前にエンコードしようとします。+

于 2013-02-14T16:39:17.680 に答える
1

そうすると、%20(エンコードされたスペース)がにエンコードされなくなり%2F20ます。ただし、これは二重にエスケープされたスペースを防ぐためだけに役立ちます。他の特殊文字は引き続き二重にエンコードされます。

これは悪いコードの兆候です。この関数に渡される文字列は、そもそもエンコードされた文字を持つことを許可されるべきではありません。

すべての参照コードをカバーする単体テストを作成してから、この関数をリファクタリングしてを削除しstr_replace()、テストが中断されないようにすることをお勧めします。

于 2013-02-14T16:44:32.443 に答える