1

コンテンツが表示されるページへの URL を難読化しようとしています。コンテンツページは、URL の GET 変数としてコンテンツ ID 番号を取得することによって表示されます。URL を難読化したい (この SO 投稿で説明されているように)。両方の回答で方法を試しましたが、一方の方法では過度に長いコードが得られ、もう一方の方法では過度に予測可能なコードが得られました。

私は PHP で作業しており、MySQL テーブルを使用してコンテンツを保存しています。コンテンツ ID は、自動的に増加する列です。つまり、URL を難読化しなければ、ユーザーは URL で Web サイトにある投稿の正確な数を確認でき、URL を変更して別の投稿を表示できることを意味します。これは避けたい。

Imgur.com のような難読化を期待していました。コンテンツ ID コードはそれぞれ、文字、大文字、小文字を含む 5 文字のコードです。

4

3 に答える 3

1

一連の「暗号化」と「復号化」を行う必要を避けるために、各ページに一意のキー ペアを使用できます。key という名前のページ テーブルに別のフィールド (VARCHAR 5) を追加し、ページごとにランダムにキーを生成します。

キーを生成するには、乱数を暗号化できます

function random_key(){
    $crypt = crypt(rand(0,9999999), 'Whatever you want to say here.');
    return substr($crypt, 0, 5);
}

?page=55-so3ph( ?page={$id}-{$key})のような URL になります。

そして、それを使用するには、次のようなことができます

<?php

if(empty($_GET['page']))
    die('missing ?page');

$page = explode('-', $_GET['page']);

if(count($page) != 2)
    die('invalid ?page');

list($page_id, $page_key) = $page;

if(!is_numeric($page_id))
    die('invalid page id');

$Post = your_query_method('SELECT * FROM pages WHERE id = ' . $page_id . ' AND key = "' . your_escape_function($page_key) . '"');

if(!$Post){
    header('Location: /invalid_page.html');
    exit;
}

//At this point we know that they ID key pair is correct
于 2013-07-02T01:06:26.720 に答える
0

私がやったことは非常に単純です: 数値を暗号化し (暗号の出力が特定の範囲内にあることを確認します)、次に数値を base 62 に変換します。

Base 62 の文字は数字、大文字のアルファベット、小文字のアルファベットであるため、Base 62 を選択しました。暗号の出力が特定の範囲内であることを確認して、base 62 に変換したときに特定の桁数になるようにしました (私の場合、base 62 で 6 桁を選択しました)。

コードを逆にするために、基数 10 に戻し、暗号を逆にします。

于 2013-07-03T03:47:25.517 に答える