これは、暗号化と復号化の方法に関するものではありません。テキスト ファイルから関数を取得して復号化した後、関数を実行できるかどうかを知りたいです。
たとえば、データベースのパスワードを定義する関数を作成し、それを単なるテキスト文字列であるかのように暗号化し、テキスト ファイルに書き込みます。
次に、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 メソッドからそれがどこにあるかがわかるので、これは私にとって単なる教育だったと思います。