5

私は CakePHP にはかなり慣れていません。そのため、Zend Framework で行っていたいくつかの基本的なことで、Cake で打ちのめされてしまいました。

名前付きパラメーターをコントローラー/アクションに渡す必要があるプロジェクトに取り組んでいます。ルートを設定してパラメーターを渡すのはかなり簡単です。私の問題は、パラメーターが urlencoded url の場合です。

例: http://www.cakephp.com/controller/action/http%3A%2F%2Fwww.google.comは、コントローラーとアクションのセットアップに関係なく、404 をスローしますが、/controller/action/http を渡します。 //www.google.com は何らかの方法で機能しますが、唯一の問題は、http が名前付きパラメーターとして識別されることです。別の方法として、 /controller/action?url=http://www.google.com を実行すると動作します。

これに使用した回避策は、base64 でエンコードされた文字列として値を渡すことですが、いくつかの制限があります。たとえば、API の場合、API を使用するシステムが文字列を base64 でエンコードできることを保証できる方法はありません。

とにかく、最善の解決策は、URL でエンコードされた文字列を名前付きパラメーターに渡すことです。質問は、CakePHP が urlencoded 文字列をパラメーターとして受け入れないのはなぜですか? また、なぜ 404 をスローするのですか?

よろしくお願いします。

4

2 に答える 2

5

この問題の回避策を追加しました。投稿を指摘した以前の回答は、実際にそれが起こっている理由と解決策の1つに回答しました。Apache での .htaccess の回避策は、セキュリティ基準が無効になるため、少し危険です。

これをコードで解決するには 2 つの方法があります (私は両方を使用しています)。

  1. すべての URL を base64 でエンコードされた文字列として送信する
  2. URL を名前付きパラメーターとして受け入れますが、お気づきのように、http:// を http:/ に変換するため、これがいつ発生したかを正しく識別し、文字列を修正する必要があります。

これは決して美しい解決策ではありませんが、実用的な解決策であることは間違いありません。

于 2011-01-21T21:22:21.480 に答える
0

私は Cakephp 4.x でこの同じ問題に出くわしました

**どうやら、デフォルトの urldecoding を無効にするカスタム ルートを作成できます。問題を修正しています。

だから今、私base64_encode(Security::encrypt($val))は関数に値を投げRouter::url()ます。これにより、デフォルトでパラメーターが url_encode されるため、有効な/機能する URL になります。

Cakephp はデフォルトで urldecodes を実行しますが、これは良いことです。しかし、それは2回行いますか?存在する場合、パラメーターを分割し/ます。これは良くありません。

だから私のroutes.phpに追加しました:

$builder->connect('/orders/callback/**', ['controller' => 'orders', 'action' => 'callback']);

これがどのように機能するかちょっと面倒ですが、現在は機能しています。4.x の魅力のように動作し、午後全体の費用がかかります。他の誰かがこの問題を抱えている場合に備えて、ここに残しておいてください。(そして将来の私のために)。

ソース: https://github.com/cakephp/cakephp/issues/4723#issuecomment-56912905

于 2021-01-05T15:00:42.790 に答える