2012-02-15 13 views
1

多くの場合、ユーザーのリダイレクトやリンクの電子メールを送信したいのですが、URLのパラメータをマスクして、どのような情報が送信されているかわからないようにしたい場合があります。例えばマスキングURLパラメータ

、私はhttp://www.example.com/directory/へのリンクを提示したいが、私はまた、電子メールアドレス、誰かのためにハッシュの追加のパラメータを渡す場合:

メール: [email protected]

ハッシュ: 22sd359d5823ddg4653dfgfFSG2

私は、このリンクに送ることができますが、私は彼らがパラメータを表示したくない:

http://www.example.com/directory/someone%40example.com/22sd359d5823ddg4653dfgfFSG2

私の最初の考えはちょうどbase64_encode()ですが、余分なバイトの最後にこれらのばかげた==記号があります。また、base64エンコーディングも非常に長い文字列を生成します。

文字列をエンコードしてコンテンツを非表示にすることは、URLにやさしい方法がありますか?

これは通常どのように行いますか? base64_encode()は標準的な方法ですか?

+1

「私は望んでいない」...私は尋ねるかもしれません - なぜですか? –

+1

最後に '=='の何が問題になっていますか? – Phil

+1

@Phil ==は、あまりにも明白で、base64でエンコードされているようです。もっと重要なことに、このようなリンクをプレーンテキストのメールで送信すると、==はリンクの一部とみなされません(少なくともOutlookではなく、他のメールクライアントではまだテストしていません)。だから、最後に黒で==の青いリンクがあります。 – BadHorsie

答えて

2

short idを生成し、それをデータベースに格納することができます。したがって、例えば、

http://www.example.com/directory/K2SP26 

のように、人の電子メールアドレスをデータベースに格納することになります。チェックアウトhttp://kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl/

+0

ええ、あなたが意味することを理解していますが、これは過剰です。何百万ものリンクが存在する可能性があります。また、新しいリンクにリダイレクトするたびにデータベースを更新したくありません。 – BadHorsie

+0

ユーザーが特定の時間枠内でページにアクセスする必要がありますか?おそらく、6ヶ月以上経過したレコードを削除したり、レコードの有効期限を設定したりして、クリーンアップを行うこともあります。適切な索引付けとクリーンアップがこの作業を行うはずです。ハッシュを使用すると、デコードしなければならなくなります...リソースの違いは何だろうかと思います。 –

-5

その少しハックが、あなたは彼らに含むページ送信する場合:負荷、それらはリダイレクトされます(これらは、JavaScriptを有効にしていると仮定)あなたがそれらを配置したい場所をそのようなURLをできるだけ早く

<form id="getme" action="directory/someone" method="POST"> 
<input type="hidden" name="email" value="[email protected]"> 
</form> 
<script> document.getElementById("getme").sumbit();</script> 

を汚れ。

+0

醜い解決策「ハッキー」を呼んではいけません。質問の電子メール部分はもちろん、 –

+0

申し訳ありませんが、これは本当に悪い解決策です。 – BadHorsie

+0

「ハッキー」は、それが設計されたもの以外に何か技術を使用する行為だと思いましたか? ...私は私の答えが電子メールの問題に対処していないが、それは言及する価値があると思った。私自身の学習のために、あなたは私にとって醜い対ハッキーを説明できますか? –

-1

リダイレクトがPHPによってトリガーされた場合は、データをsessionに格納することが明らかです。あなたのアイデアを把握するのに役立つかもしれない

<?php 

function redirectTo($url, $data) { 
    session_start(); 
    $hash = md5(uniqid("rediredt", true)); 
    $_SESSION[$hash] = array(
     'my' => 'data', 
     'is' => 'invisible', 
     'to' => 'the user', 
    ); 

    $delim = strpos($url, '?') ? '&' : '?'; 
    $url .= $delim . 'redirection-key=' . $hash; 
    // might want to send 301/302 header… 
    header('Location: ' . $url); 
    exit; // might want to avoid exit if you're running fcgid or similar 
} 

function isRedirected() { 
    if (empty($_GET['redirection-key'])) { 
     return null; 
    } 

    if (!isset($_SESSION[$_GET['redirection-key']])) { 
     return array(); 
    } 

    $t = $_SESSION[$_GET['redirection-key']]; 
    unset($_SESSION[$_GET['redirection-key']]); 
    return $t; 
} 

...

+0

心配しないでください...私はそれらにメールを送っていませんでした。それが基本的な考えであれば、@ Aaronの考えに従ってください。これは、ユーザーからのデータを真に隠す唯一のソリューションです。私がbase64でエンコードされたデータを見ると、私はそれを好奇心から解読します。 – rodneyrehm

-2

は、次の2つの選択肢の1持っている:

  1. メールアドレスがハッシュされるので、サヴィユーザによって復号化することができます。
    -
  2. 電子メールアドレスはサーバー(データベース)に格納され、電子メールリンクにはデータベースのプライマリIDのみが含まれています。

あなたは絶対にこのようBASE64など、共通のハッシュを使用するか、その後、データベース内のメールアドレスを保存したくない場合は、また、きれいなURLを与える最も安全な方法、使用方法2.をしたい場合またはrot13、またはあなた自身のロール。あなたは自分自身を回転させることは単純ではありませんが、ほとんどのカジュアルユーザーがハッシュの中を覗き見るのを止めるでしょう。

1

おそらくばかげた答えですが、少なくともよりカジュアルなユーザーからパラメータを隠すためにmcrypt関数を使用しないのはなぜですか?

1

文字列をエンコードするためにbase64_encode()、gzcompressなどのようなものを使用することは、それをデコードするのが簡単ではないため、難読化するのには適していません。そして、はい、別のオプションは、データベースに値を格納し、人々が示唆したようにキーを渡すだけです。しかし、あなたがそれを気にしたくないと思うなら、あなたが本当にすべきことは、秘密鍵を使ってそれを実際に暗号化し、同じ鍵でもう一方の端でそれを解読することです。例えば

function obfuscateString($s) 
{ 
    $secretHash = "BA2EC9E717B68176902FF355C23DB6D10D421F93EAF9EE8E74C374A7B0588461"; 
    return openssl_encrypt($s, 'AES-256-CBC', $secretHash, 0, '123456789'); 
} 

function unobfuscateString($s) 
{ 
    $secretHash = "BA2EC9E717B68176902FF355C23DB6D10D421F93EAF9EE8E74C374A7B0588461"; 
    return openssl_decrypt($s, 'AES-256-CBC', $secretHash, 0, '123456789'); 
} 

は(PHPのバージョン> = 5.3.0が必要です。)あなた自身の秘密の16進文字列で$ secretHashを交換してください。

注:この例では、初期化ベクトル( '123456789')は単なるフィラー文字列ですが、問題ありません。独自の初期化ベクトルを使用する方法を考え出すこともできますが、ほとんどの場合、URLパラメータを難読化する目的では重要ではありません。