1

ソフトウェア ライセンス キーを mysql データベースのフィールドに保存したいのですが、データベースが侵害された場合にライセンス キーが使用できないように、ライセンス番号をスクランブル形式で保存したいと考えています。

ライセンス キー フィールドには、次の 3 つのシナリオが考えられます。

  1. null の可能性があります - 一部のユーザーはまだライセンス キーをデータベースに保存していません。
  2. 5 文字ごとにハイフンで区切られた 25 桁のライセンスの場合があります。例: ABCD1-EFGH2-IJKL3-MNOP4-QRST5
  3. 10 桁のライセンスで、すべて数字で、区切り記号はありません。例: 1234567890

保存する前にライセンスをスクランブルしたいのですが、一度ログインしたユーザーに表示するときに、同じスクランブル関数を再度実行してライセンスのスクランブルを解除します。

ライセンスの strlen を確認することから始める必要があると思います。

  1. 0 の場合、何もしません。関数をロードする前に null かどうかを確認できます。
  2. 29 の場合は、ハイフン区切りを使用してライセンスのセクション (2 番目と 4 番目など) をシャッフルし、str_rot13 を使用してアルファ文字を変更します。
  3. 10 の場合は、3 番目、5 番目、7 番目、9 番目の文字を選択して、順番を変更します。5 番目と 9 番目、3 番目と 7 番目など。

私は以下をセットアップしました:

    function scramble($scramblestr) {

    // check string length
    $length = strlen($scramblestr);

    // if 10 digit license (all numbers)
    if ($length == 10) {
        $1st = substr($scramblestr, 0, 1);
        $2nd = substr($scramblestr, 1, 1);
        $3rd = substr($scramblestr, 2, 1);
        $4th = substr($scramblestr, 3, 1);
        $5th = substr($scramblestr, 4, 1);
        $6th = substr($scramblestr, 5, 1);
        $7th = substr($scramblestr, 6, 1);
        $8th = substr($scramblestr, 7, 1);
        $9th = substr($scramblestr, 8, 1);
        $10th = substr($scramblestr, 9, 1);

        // swap 3rd character with 7th / swap 5th character with 9th
        $scramblestr = $1st . $2nd . $7th . $4th . $9th . $6th . $3rd . $8th . $5th . $10th;

    // if 25 digit license (with hyphen separators)
    } elseif ($length == 29) {
        $scramblestr = array_filter(explode('-', $scramblestr), 'strlen');

        // swap 2nd & 4th sections
        $scramblestr = $scramblestr[0] . "-" . $scramblestr[3] . "-" . $scramblestr[2] . "-" . $scramblestr[1] . "-" . $scramblestr[4];

        // swap alpha characters 13 places in the alphabet
        $scramblestr = str_rot13($scramblestr);

    // if null or if stored incorrectly (for example if the license is not null but contains an invalid number of characters)
    } else {
        $scramblestr = "Unknown";
    }

    return $scramblestr;
}

ただし、これにより次のサーバー 500 エラーが発生します。

PHP 解析エラー: 構文エラー、予期しない '1' (T_LNUMBER)、変数 (T_VARIABLE) または '$' が必要です

これは、最初の substr 参照を指します。ただし、php.net によると、文字列の長さを示すためにここで使用される整数である必要があります。

何か案は?

または、このアクションを実行するより効率的な方法はありますか? または、誰かが適切な代替方法を持っていますか?

4

3 に答える 3

4

「@Fred と CaptainCarl はどちらも正しかったのですが、どうすればそれに気付かなかったのでしょうか... $st を $first に変更するなど... – BottyZ」

回答として送信:

ここでの問題は、変数が数値で始まることです。それはできません。文字で始まるのでは$a1stなく、次のようなことを行います。$1st

あなたが読むことができるスタックの参照:

于 2016-04-13T14:14:20.573 に答える
1

有効な変数名は、文字またはアンダースコアで始まり、任意の数の文字、数字、またはアンダースコアが続きます。正規表現としては、次のように表現されます: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

https://secure.php.net/manual/en/language.variables.basics.php

たとえば、変数の命名$1stが無効です。

于 2016-04-13T14:13:12.263 に答える
0

MySQL 5.7 または MariaDB 10.1 のデータベースのデータを暗号化することもできます。単一のフィールド、テーブル、またはログファイルなどを含む完全なテーブルスペースで実行できます。

参照: https://mariadb.com/kb/en/mariadb/encryption/

于 2016-04-13T14:36:05.313 に答える