2

これは、暗号化と復号化の方法に関するものではありません。テキスト ファイルから関数を取得して復号化した後、関数を実行できるかどうかを知りたいです。

たとえば、データベースのパスワードを定義する関数を作成し、それを単なるテキスト文字列であるかのように暗号化し、テキスト ファイルに書き込みます。

次に、dbパスワードを暗号化された読み取り不能な混乱として定義する機能があります。

パスワードが必要な場合は、ファイルの内容を取得して復号化しますが、この時点で関数として実行できるようにする必要があるため、DB_PASSWORD 定数を定義しますが、現在は文字列内の単なるテキストです。

これは、私がこれを行った場合と同じです:

$var = "function define_password(){
   if(!defined('DB_PASSWORD')){define('DB_PASSWORD', 'password');}
}";

変数内の単なるテキストであるため、これでできることはエコーアウトすることだけです。

それで、phpにそれを文字列変数ではなく関数として見せる方法はありますか?

ありがとう

冗長でも教育的なのでXenonさんが指摘したeval()メソッドを使った結果を載せておきます。以下は、root が所有する www データへの読み取り専用アクセス権を持つ、www 以外のディレクトリにある .nothing という名前の暗号化された隠しファイルです。

Pswo0DlrEPMNEs7ExyFs8Zh2n+bSj6yr4NI9zV7gTP9qFiesrFKLxsjoo3R3CnsYJNkojeo0v2gQtI4iJGLzKUS8zdhePLElk3BwhliB3dxYwvRkJFMqbtw7k/UBo0pHPLR/jVRnWq+cTByr0xp8p7X9v8Olbfrz4zwo+VXIDwLA6GsOJTK14Hy0E4jksgeuEQ7/PDtxCgWoMPQ2OomPwjFjukdrAofbF5jxU9zCUK5Cs1UZ8+PYA79w0lccEpUA9vWBPZ6Xuwhr4KuGeyoUCchK9wGgaXDD6Oc845OsmnR/wi+EMnYacvGGeLxN96wEAt9vh/dwmYIkHmpuBtPWUP1vRT/HzTv39HfXoFFKx1kGww4Xph/cjS8joYwAgh+C+LT61sBjlfazkDRNabpmZFd2yyocD+6lQeHrmKuvYxa0cfMSYa8ScAQaBz6Ycg99ldOinEbd+mTnZKltFialAoHOvha4Surc0XZX7vtFx1TxSMctjkgCmLw4bHhJ6B3htLkhOysb6Oz5M1rniogFwEZnFaqLsqD1etpYv1RpceB8FPSss7/Zu0vGwbGeSMldr06FeHylRlB6n25QiH3qaKieHuD8ErKvQjm3YAVCshU04ydR0lTU5ckKnFGGxAGtiXjK9rV3Hle69vk7RjtYJVVuPCbmdSETdE/zHem+w1THKw4/NUROdxiOIDYQtQ6oDY0ORiwAqjU9QHlqwFyadPrDG37AYXSCzLgwFCw76J6uGyYzDsIVDUnP6Dv3yV1yvjrpxAFb5lA9APrnU8qIgNrgEoaZAznpX91QQxt6ztgJFVHyOSyUP8DkkFpsPamHwg22jb1oUZlOVsCgzMSj9G1M4sgokW6lpQjXCtuDYXVrAwoWHk6Bh+UiBXVUoOPIvEjG4PtCIRQl84lEtKiUPAQSWA/7rgN1O308j9tRtNBzho2xYMTPg2g5DOS82RRSS7/ehGxEWlbh9cqig6Xux+oyLLXK4uIp8qA4kLqvuVX9w/UAfJRRfV89t5xQsshMP8TnFn3KrAZtGJ7lQDOduzMiHXpu9Wu91IsEfbHr/v2U0CD+sMc7h9K755fYpdNUptpaRvyz0sVZW96sldPsxY26LktnQaKIAAoDNgcIFbNOmGOBnIuUVOQBUVxbC+e2cYJy8xQsjsJBe0AChfTZB+Vi0TiERyA28OCti4T4PTA=

以下のコードの暗号化関数を使用して作成しました。これは、stackoverflow の誰かから提供されたものです。

<?php 
define('SALT', 'whateveryouwant');

function encrypt($text) 
{ 
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
}

function decrypt($text) 
{ 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
}

$dec_db = decrypt(file_get_contents('.nothing'));

eval($dec_db);



defineit();
echo ET_APP_USERNAME;

暗号化された部分は、3 つの異なるデータベースのユーザー名とパスワードを定義する関数ですが、最初のユーザー名をエコーアウトすると、完全に機能することがわかります。そしてもちろん、指摘されたように、誰かがサーバーにアクセスできる場合、SALT 定数と暗号化/復号化関数が表示され、file_get_contents メソッドからそれがどこにあるかがわかるので、これは私にとって単なる教育だったと思います。

4

4 に答える 4

2

ここで得られる利点は、サイトがハッキングされた場合に、攻撃者がデータベースのパスワードを読み取ることができないことだと思います。その仮定に基づいて、私は言います:

  1. 暗号化されたパスワード コードを取得できる攻撃者は、おそらくパスワードを解読するコードを取得し、パスワードを自分で解読することもできます。何も得られませんでした。
  2. パスワードを設定するコードである必要があるのはなぜですか? パスワード自体を暗号化するだけです。次に、それを復号化すると、パスワードが文字列として得られ、この質問は無関係になります。実行する必要があるコードを要求することには、何の利点もありません。
  3. 任意のコードを実行する必要があると、セキュリティ上の問題が増え、コード インジェクションが発生する可能性があります。
于 2012-04-04T01:29:24.707 に答える
0

あなたが探しているのはeval()、文字列を受け取り、それを PHP コードとして実行する だと思います。

これを使用する際は十分に注意し、次の警告に注意してください。

eval() 言語構造は、任意の PHP コードを実行できるため、非常に危険です。したがって、その使用はお勧めできません。この構文を使用する以外に選択肢がないことを慎重に確認した場合は、ユーザーが提供したデータを事前に適切に検証せずに渡さないように特に注意してください。

したがって、たとえば、次のようにすることができます。

$var = "function define_password(){
   if(!defined('DB_PASSWORD')){define('DB_PASSWORD', 'password');}
}";

eval($var);
于 2012-04-04T01:24:18.190 に答える
0

create_function()を試してください。それからそれを呼び出します。失敗した場合は、NULL または FALSE または smth を返します。

于 2012-04-09T06:32:49.700 に答える
0

これで達成しようとしていることの説明がなければ、私は何も言わなかっただろう. ただし、これらすべてで達成しようとしているのは、ファイル (何らかの理由で関数内) に保存されているパスワードを読み取ることだと言っているので、攻撃方法を確認することを強くお勧めします。

http://www.php.net/manual/en/function.parse-ini-file.phpの利点について説明します。parse_in_file()

可能であれば、単に変数を定義するために関数を保存しないでください。それを行うにははるかに優れた方法があり、ini ファイルを使用することは非常に優れた/より良い代替手段です。define()情報へのアクセスをさらに簡単にしたい場合は、パスワードを設定することもできます。

于 2012-04-04T01:37:26.730 に答える