0

を使用して PHP でセッション Cookie を生成します

$cookie = random_bytes(64);

次に、この変数の値を Cookie として設定します。

setcookie('access', $cookie, time()+31536000, '/', false);

を使用して目的の値を探すとき

function getAccessToken(){
    var n = document.cookie.match(/access=([^;]+)(?:$|;)/i);
    if (n && n.length)
        return n[1];
}

クライアント側では、私は得る

"%1D%D8%E1%3F%7E%3E%D7b%A5%04%3Bl%3A%ADB%DF%DAg%E5%1DH%0A%21%5E%15%D9%2Be8k%3A%E2%AF%CE7%F2%BF%5B%CB%14%95%CEO%28%60p%DF%FBeY%95%3C%86%B99U%B7%F1p%E0%AC%2B%C5%2F"

この値は、ユーザーを認証するために Node.js Websocket サーバーに送信されますが、クライアント側で値が既に間違っているため、接続は失敗します。PHP がこの Cookie を受け取ると、自動的にデコードされ、$_COOKIE['access']正しく含まれています。

��?~>�b�;l:�B��g�H
!^�+e8k:���7��[���O(`p��eY�<��9U��p ��+�/

どこを見てもdecodeURI/decodeURIComponentとを使うように言われましescapeたが、最初のスローURIError: URI malformedと 2 番目のスローはまったく役に立ちません。

この生の URL エンコード文字列を、クライアントまたは Node.js で実際の文字/バイトの文字列に変換するにはどうすればよいですか (どちら側でデコードするかは関係ありません)。

4

2 に答える 2

1

@BlackBurn027のコメントに基づいてbin2hex、Cookie の値を設定する前に追加の手順を追加するだけで済みました。

$cookie = bin2hex(random_bytes(64));

これにより、両方の言語が問題なく簡単に理解できる文字列が生成されます。

于 2016-06-18T10:29:27.093 に答える
-1

問題は、バイトをランダムに生成しているため、それらを「デコード」しようとすると、ASCII 文字が表示されないため、「?」が表示されることです。他の言語の文字 (日本語、ロシア語など) のような記号やよりランダムな文字...

最善の方法は、A ~ Z、a ~ z、0 ~ 9、および「!?=$#」などの特殊文字または許可したものを返すことが確実にわかっている関数を作成することです。

したがって、私が通常行うことは、phpsession id を取得して MD5 を実行し、次に MD5 のランダムな部分 (文字列全体ではありません) を取得し、他の MD5 を実行してから、現在の年 + 月 + 日付、または任意のランダムを合計することです。何番でもいいです。それから他のMD5...わかりますか?

これがあなたの質問に答えたかどうか教えてください!

于 2016-06-18T10:25:55.633 に答える