0

アイテムのスパイダリング/クロールを防ぐ方法で、アイテムIDをブラウザに送信する方法が必要です。

私の考えは、整数IDを秘密の共有ソルトで暗号化することです。これにより、同じ一意のアイテムに対して多数の永続的であるが予測できないURLが許可されます。レコード1と2の結果を送信する必要があるとします。IDを平文で送信するのではなく、次のようにします。

{
    1: "Item One",
    2: "Item Two"
}

まず、WebサーバーでIDを暗号化します。

string RESULT_SET_SALT = "randomValue1";
foreach(ResultItem item in results) {
    item.id = encrypt(SECRET, RESULT_SET_SALT, id);
}

実際にクライアントに送信されるのは、ソルトと暗号化された値です。

{
    RESULT_SET_SALT: "randomValue1",
    387439: "Item One",
    79: "Item Two"
}

クライアントが詳細を表示するアイテムを選択すると、AJAXリクエストにはソルトと暗号化された値が含まれます。

$.get("/ItemDetails/387439?RESULT_SET_SALT=randomValue1");

サーバーでは、リクエストに含まれるクライアントのSECRETとSALTを使用してIDが復号化されます。

int actualRequestedId = decrypt(387439, "randomValue1", SECRET); // result is 1

これは有益です:単純な整数暗号化 そしてこれ:単一のintを暗号化する方法

どちらの記事も、塩の使用については説明していません。おそらく、秘密を2つに分割して半分を送信しただけでは、誰もそれを解読する努力をしませんが、アルゴリズムの悪用のタイプはしばしばそれを破壊することを知っているので、正しく実行したいと思います。

何かお勧めはありますか?IDをintとして保持する必要はありませんが、大量のIDを送信するので、小さく保持する必要があります。IDが多数存在し、暗号化プロセスによって結果のUIがブロックされるため、コストがかかりすぎないようにする必要があります。これがすぐに使える.NET(C#)暗号化を活用できれば素晴らしいと思います

編集:別の(より高い帯域幅の)アプローチは、ソルトを使用するのではなく、各IDにランダムな上位32ビットを追加し、シークレットで暗号化することです。これはアルゴリズムの別の悪用であるため、同じIDから複数の反復を生成するユーザーの能力が秘密(またはそれほど重要ではないが個人ID)を危険にさらす可能性があることを除いて、これはうまく機能します。

4

1 に答える 1

1

フォーマット保存暗号化はおそらくあなたが探しているものですが、実装するのは簡単ではありません。サーバーのセッションにリンクされているランダムキーを使用できます。攻撃者は単にすべての値を要求することはできますが、それらを推測することはできません。

CTR暗号は、任意の値を暗号化し、同じサイズ(ビット単位)を返すことができます。これらは(APIで)より優れた可用性を備えていますが、同じキーを使用する暗号化ごとにNONCEが必要です。

または、サーバーにテーブルを保持し、アイテムIDに対してランダムなIDを記憶することもできます。そうすれば、攻撃者はサーバーを介して送信されたアイテム以外のものを取得する方法がありません。これは他のソリューションよりもはるかに簡単かもしれませんが、テーブル用に追加のメモリが必要になります(もちろん)。

これは、他のリンクで提出された回答に加えて。

于 2012-07-28T12:41:52.403 に答える