2

私は自分で使用するプライベート CMS を構築しており、ユーザー名とパスワードの保存機能の構築を開始するところです。SQL を使用してデータベースに保存するのではなく、管理者のユーザー名、パスワード、およびユーザーの詳細をすべて PHP ファイル内の多次元配列に保存する可能性を検討しています。

ユーザー情報を保存するこの非伝統的なアプローチを使用したい理由は、攻撃者がユーザー情報 (ユーザー名、パスワード、IP アドレスなど) への不正アクセスを取得するのが難しくなると考えているためです。 MySQL データベースに接続します。

コードの大まかな概要:

add_user.php

// set the last referrer session variable to the current page 
$_SESSION['last_referrer'] = 'add_user.php';

// set raw credential variables and salt
$raw_user = $_POST['user'];
$raw_pass = $_POST['pass'];
$raw_IP = $_SERVER['REMOTE_ADDR'];
$salt = '&^${QqiO%Ur!W0,.#.*';

// set the username if its clean, else its false
$username = (is_clean($raw_user)) ? $raw_user : false; // is_clean() is a function I will build to check if strings are clean, and can be appended to an array without creating a parsing error.

// set the salted, sanitized, and encrypted password if its clean, else its false
$password = (is_clean($raw_pass)) ? $salt . encrypt($raw_pass) : false; // encrypt() is a function I will build to encrypt passwords in a specific way

// if username and password are both valid and not false
if( $username && $password ) {

    // set the users IP address
    $IP = sanitize($raw_IP);

    // create a temporary key
    $temp_key = $_SESSION['temp_key'] = random_key(); 

    // random_key() is a function I will build to create a key that I will store in a session only long enough to use for adding user info to the database.php file

    // add user details array to main array of all users
    $add_user = append_array_to_file('database.php', array($username, $password, $IP)); 

    // append_array_to_file() is a function I will build to add array's to the existing multidimensional array that holds all user credentials. 

    // The function will load the database.php file using cURL so that database.php can check if the temp_key session is set, the append_array_to_file() function will stop and return false if the database.php file reports back that the temp_key is not set.

    // The function will crawl database.php to read the current array of users into the function, will then add the current user's credentials to the array, then will rewrite the database.php file with the new array. 

    // destroy the temporary session key
    unset($_SESSION['temp_key']);
}
else {
    return false;
}

データベース.php

$users_credentials = array(1 => array('username' => 'jack', 
                                      'password' => '&^${QqiO%Ur!W0,.#.*HuiUn34D09Qi!d}Yt$s',
                                      'ip'=> '127.0.0.1'), 
                           2 => array('username' => 'chris', 
                                      'password' => '&^${QqiO%Ur!W0,.#.*8YiPosl@87&^4#',
                                      'ip'=> '873.02.34.7')
                          );

次に、ログインしようとしているユーザーの確認に使用するSELECTなどの SQL クエリを模倣するカスタム関数を作成します。

私の質問

  1. これは悪い考えですか? もしそうなら、それはなぜですか?

  2. 私はリモートデータベースに接続していないので、ハッカーが無許可のアクセスを取得したり、パスワードを盗んだり盗んだりする可能性を減らすことができると考えるのは正しいですか?

4

2 に答える 2

2

利点はありません。テキスト ファイル、mysql データベース、または php ファイル ( === テキスト ファイル) のいずれを使用しても、それらはすべて、情報を保存するファイルであるという意味で「データベース」です。違いは、そのようなもののために SQL データベースが作成されていることです。

あなたが考えなければならない潜在的な穴がもっとあるので、私は欠点を見ます. いくつかの例(コメントに記載されているものを除く):

  • php が停止した場合に備えて、パスワード ファイルが常に web-root の外にあるように注意する必要があります。
  • ソース管理などでパスワードファイルを渡さないようにする必要があります。

これらは解決するのが難しいことではありませんが、通常のデータベースを使用すれば、それらを気にする必要さえありません。

それとは別に、ソルトの目的を誤解しています。暗号化されたパスワードの前にソルトを追加するだけでは、ソルトを使用しても意味がありません。それをencrypt関数に送信して、テキストパスワードでハッシュする必要があります。データベース全体に対してテーブルを 1 つだけ生成するのではなく、パスワードごとにテーブルを生成する必要があります。そのため、すべてのユーザーに単一のソルトを使用するのではなく、それぞれに異なる固有のソルトを使用する必要があります。

于 2012-12-16T02:18:06.420 に答える
1

従来のデータベースではなく、任意の種類のテキスト ファイルに任意の種類の構成データを保存する場合は、.ini ファイルの使用を検討してください。私が間違っていなければ、php.iniファイルと同じように、Web ルートの外に保存することもできます。

これを行う方法を正確に説明した素晴らしい投稿があります: Using ini files for PHP application settings

PHP マニュアル: get_cfg_var()

于 2012-12-16T02:26:35.353 に答える