-1

わかりましたので、乱数を作成し、データベースをチェックし、ユーザー ID 行に番号が存在する場合は、新しい番号を再作成し、使用可能な番号が見つかるまで続行するスクリプトを作成しました...しかし、考え始めました。私のサイトが巨大になった場合、ランダムに数字を見つけようとして、おそらく継続的に繰り返さなければならないのはひどいことではないでしょうか...これを行うためのより良い方法はありますか、それともこれが進むべき道ですか?

ユーザーIDは、ユーザープロファイルにアクセスするために使用できるため、プライベート番号ではありません...Facebookのように設定されており、長い数字の文字列またはユーザー名が個人プロファイルに移動できます.

4

2 に答える 2

1

あなたは(何らかの理由で)誰かが次のようなページにアクセスするのを止めようとしていると思います

profile/<user_id>、そしてそれを見てuser_id= 100、それから、、、などを試しprofile/101ますprofile/102

その場合は、次のようなものを使用できます(自動インクリメントIDとともに)

class Crypt {

    public static function encrypt($data) {

        $config = LoadSomeConfig();

        // open the module to be used.  There are several listed at http://www.php.net/manual/en/mcrypt.ciphers.php     
        $mod = mcrypt_module_open($config->cipher, '', $config->mode, '');

        // use config set initialization vector.  We will use a constant here as we do not want to include this for decryption
        if (isset($config->vector)) {
            $iv = $config->vector;
        } else {
            die("NO IV SET!");
        }

        $key_size = mcrypt_enc_get_key_size($mod);
        $key = substr($config->key, 0, $key_size);
        mcrypt_generic_init($mod, $key, $iv);

        // Do the encryption using the cipher module defined
        $encrypted = mcrypt_generic($mod, $data);

        // cleanup
        mcrypt_generic_deinit($mod);
        mcrypt_module_close($mod);

        // Changed the output based on the config encoding value.  Currently supported values, base64 and hex.
        switch ($config->encoding) {
            case "base64":
                $encrypted = base64_encode($encrypted);
                break;
            case "hex":
                $encrypted = bin2hex($encrypted);
                break;
            default:
                break;
        }
        return $encrypted;
    }

    public static function decrypt($data){

        if (empty($data)) {
            return '';
        }

        // config options set include the cipher, mode and secret key
        $config = LoadSomeConfig(); 

        // Change encrypted data base to binary based on the encoding mechanism used to generate the data
        switch ($config->encoding) {
            case "base64":
                $data = base64_decode($data);
                break;
            case "hex":
                $data = pack("H*", $data);
                break;
            default:
                break;
        }


        if (isset($config->vector)) {
            $iv = $config->vector;
        } else {
            die("NO IV SET!");
        }

        $mod = mcrypt_module_open($config->cipher, '', $config->mode, '');
        $key_size = mcrypt_enc_get_key_size($mod);
        // max key size is 448 bits
        $key = substr($config->key, 0, $key_size);
        mcrypt_generic_init($mod, $key, $iv);

        // decrypt the data
        $decrypted = mdecrypt_generic($mod, $data);

        // cleanup
        mcrypt_generic_deinit($mod);
        mcrypt_module_close($mod);

        return trim($decrypted);
    }
}

次に、次のようなルートがありますprofile/c2ffd340ea3b71ca065e6add4143f36d

プロファイル ページで、user_id が でアクセス可能であると仮定すると、次のようにuser_id簡単に実行できます。

$user_id = Crypt::decrypt($user_id);

そして、通常どおりに進みます。誰かのプロフィールページへのリンクを作成するときは、次のようなものを使用しますprofile/<?php echo Crypt::encrypt($user->user_id); ?>

于 2012-11-27T03:00:42.543 に答える
0

ユーザー名は一意なので (私は推測します)、 /profile/ コントローラーに URL からユーザー名を取得させてプロファイルをロードさせる方がよいでしょう。

コードに難読化を追加するだけでなく、何らかの理由で暗号化コードが変更された場合はどうでしょうか。すべての外部リンク、ブックマークなどが機能しなくなります。また、URL 内のユーザー名は暗号化されたものよりもはるかに価値があるため、検索エンジンのカバレッジが向上します。ああ、そうです。ハッシュすることに決めたときに、選択したアルゴリズムの理論的に可能な衝突はありません;)

于 2012-11-27T03:27:00.460 に答える