2

私は、フォームへのリンクをまとめて送信する機能に取り組んでおり、アプリケーションの組み込みの電子メール送信者を介して、送信先のエンティティのIDとタイプを含むURLを送信することを計画しています。フォームのIDと、検索するデータベースを示す識別子(クライアントデータを含む複数のデータベースがあります)。この情報をエンコードする簡単な方法を探しています。

Idを送信してすべてをデータベースに保存することを考えましたが、これらの電子メールはおそらくマーケティングや忠誠キャンペーンのためにまとめて送信されるため、それは良い考えではないと思います。

いくつかの暗号化関数をグーグルで検索しましたが、試したものは「?」のような不正な文字で結果を返すことがありました。と「&」は私のリンクを破壊しました。

4

4 に答える 4

1

暗号化する必要がある場合は、AESのような対称暗号化を探してから、結果をbase64でエンコードします。

エンコードするだけで、Base64でエンコードする必要がある場合は、それがベストショットです。

どちらの場合も、ブラウザのURLの長さまたはWebサーバーのGETサポートがある程度の長さに制限されていることに注意する必要はありません(ブラウザとWebサーバーに応じて2000から80000の間)

また、リンクをどのように送信する必要があるかについても検討してください。非常に長いURLは便利ではありません。yourls.orgなどを非常に簡単にインストールしてURLを短くすることができます。

于 2012-04-30T07:30:30.307 に答える
1

すべてのアプリケーションで、反対側のbase64_encodebase64_decodeを使用してURLをエンコードしました。

機密データをクライアントに送信していないので、これが最善の方法だと思います。

それ以外の場合は、それらのURLをデータベース(またはパラメーター)に保存して、IDを送信する必要があります

于 2012-04-30T07:30:38.870 に答える
1

クライアントが情報をデコードできるようにしたくないので、完全なURLは必要ないことを意味します。つまり、実行スレッドは処理のためにサーバーに戻る必要があります。その場合、なぜ暗号化の費用を気にする必要がありますか?元のIDを参照する乱数を割り当てるだけです(衝突をチェックします)。明らかに、乱数セットがまばらであるほど、衝突が発生する可能性は低くなります。

于 2012-04-30T08:23:27.883 に答える
0

私の自家製のCMSコントロールパネルでは、URLにアクセスしようとしてログインしていない場合、次のようなURLにリダイレクトされます。/?return=Epf7psjPeRHeEsCoa56xvvF9QiaT%2B02P5FUSbA0Ttl%2Bv3LalZ26sqzSAV6WrNKNWK%2FDD%2FngSbVjJ%2FyUuG9QIWA%3D%3D

認証に成功すると、正しいURLに戻ります。このデータの塊を改ざんしようとすると、(圧倒的な確率で)ホームページにたどり着きます。

それがあなたが探しているものなら、これは私がそれを実装した方法です:

if ($_SERVER['REQUEST_URI'] !== '/') {
    if (empty($_SESSION['cms_user_id_key_here'])) {
        $encrypted = \Defuse\Crypto\Crypto::encrypt(
            $_SERVER['REQUEST_URI'],
            URL_KEY_CONST
        );
        header('Location: /?return='.urlencode(base64_encode($encrypted)));
        exit;
    }
}

そして、ログインに成功した後:

if (isset($_GET['return'])) {
    try {
        $decrypted = \Defuse\Crypto\Crypto::encrypt(
            base64_decode($_GET['return'],
            URL_KEY_CONST
        );

        // Defense-in-depth; we always want a relative URL:
        if ($decrypted[0] === '/') {
            header('Location: '.$decrypted);
        } else {
            header('Location: /');
        }
    } catch (\Defuse\Crypto\Exception\CryptoException $e) {
        header('Location: /');
    }
    exit;
}

この不思議なことは何ですか\Defuse\Crypto\Crypto::encrypt()\Defuse\Crypto\Crypto::decrypt()あなたは尋ねますか?もちろん、 defuse /php-encryptionです。

ほとんどの場合、独自の認証されていない暗号化をロールするよりも、認証された暗号化を提供するライブラリを利用することを優先する必要があります。

于 2015-09-30T13:25:32.493 に答える