php解密加密的函数并运行它?

时间:2012-04-04 01:18:56

标签: php eval

这不是关于如何加密和解密。我想知道在从文本文件中检索和解密后是否可以运行一个函数。

例如,我将创建一个定义数据库密码的函数,然后将其加密,就像它只是一个文本字符串并将其写入文本文件一样。

然后我有一个函数将db密码定义为加密的不可读的混乱。

当我需要密码时,我会获取文件内容并对其进行解密,但此时我需要能够将其作为一个函数运行,因此它将定义DB_PASSWORD常量,但它现在只是字符串中的文本。

就像我刚刚做到的那样:

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

很明显,我能做的就是回应它,因为它只是变量中的文本。

那么,有没有办法让php将其视为函数而不是字符串变量?

谢谢

即使它是多余的,它也很有教育意义,所以我发布了使用Xenon指出的eval()方法的结果。 这是在www之外的目录中名为.nothing的加密和隐藏文件,只读访问root所拥有的www-data:

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=

我使用下面的代码中的encrypt函数创建了它,它来自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 个答案:

答案 0 :(得分:2)

我只是假设您希望获得的好处是,如果您的网站遭到黑客攻击,攻击者将无法读取数据库密码。基于这个假设,我会说:

  1. 可以获取加密密码的攻击者很可能也会获得解密密码并自行解密密码的代码。什么都没有。
  2. 为什么必须设置密码的代码?只需加密密码本身。然后当你解密它时,你将密码作为一个字符串,这个问题变得无关紧要。在要求执行需要执行的代码时,我没有任何优势。
  3. 要求执行任意代码只会打开更多安全问题和可能的代码注入。

答案 1 :(得分:0)

我认为您可能正在寻找的是eval(),它接受​​一个字符串并将其作为PHP代码执行。

使用它时要非常小心,并注意警告:

  

eval()语言构造非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已经仔细验证除了使用此构造之外没有其他选择,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它。

因此,例如,你可以这样做:

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

eval($var);

答案 2 :(得分:0)

如果你没有解释你试图用这个来实现什么,我就不会说什么了。但是,既然你说你想要实现的目的是读取存储在文件中的密码(出于某种原因在函数内部),我强烈建议你检查你的攻击方法。

我将引导您了解parse_in_file() http://www.php.net/manual/en/function.parse-ini-file.php

的好处

如果可能的话,不要存储一个简单定义变量的函数 - 有更好的方法可以做到这一点,并且使用ini文件是一个非常好/更好的选择。如果您想让信息更容易访问,您甚至可以使用define()密码。

答案 3 :(得分:0)

尝试 create_function()。然后打电话给它。如果失败,则返回NULL或FALSE或smth。