5

rawurlencode() でエンコードしたトークンを使用して、ユーザーのアクティベーション時に HTML メールを送信します。

そのため、リンクは次のように電子メールに表示されます。

<a href="http://site.com/auth?action=confirmActivation&amp;user=79&amp;token=zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh%5EG%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861" target="_blank">Click here to activate your account</a>

ただし、このリンクをクリックすると、ページの URL は次のようになります。

http://site.com/auth?action=confirmActivation&user=79&token=zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh^G%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861

だから-前のトークン(これは私のメールに表示される方法です):

zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh%5EG%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861

次の後のトークン:

zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh^G%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861

クリックすると、ブラウザが自動的に何らかの変換を行うように見えますか? なんで?

4

1 に答える 1

3

これは、%5E (^) が PHP によって urlencode されているためです (-_ を除くすべての英数字以外の文字をエンコードします)。これは RFC に準拠していません。ブラウザーはこれを確認し、すべてをデコードしてエンコードを RFC 準拠に「修正」し、URL で問題を引き起こす文字のみをエンコードします (^ はその 1 つではありません)。php のrawurlencodeは RFC に準拠していますが、実際には、ブラウザ自体が RFC に準拠していない可能性があり、スペースや ~ などのものしかエンコードできない場合があります。取得したトークンを urldecode してその結果を使用することをお勧めします。いずれかの方法で一貫してください。トークンに問題のある文字がある場合は、base64 エンコードして解決します。

于 2011-07-28T03:12:25.437 に答える