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

标签 php eval

这不是关于如何加密和解密的问题。我想知道从文本文件检索并解密函数后是否可以运行该函数。

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

然后我有一个函数将数据库密码定义为加密的不可读的困惑。

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

这和我刚刚这样做是一样的:

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

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

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

谢谢

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

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 方法知道它在哪里,所以我想这对我来说只是教育。

最佳答案

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

  1. 能够获取加密密码代码的攻击者很可能也可以获得解密密码的代码并自行解密密码。一无所获。
  2. 为什么必须用代码来设置密码?只需对密码本身进行加密即可。然后,当您解密它时,您将获得字符串形式的密码,并且这个问题变得无关紧要。我认为要求需要执行的代码没有任何优势。
  3. 要求执行任意代码只会导致更多安全问题以及可能的代码注入(inject)。

关于php 解密加密函数并运行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10003723/

相关文章:

php - 使用 (int) 和 (double) 一起截断小数时出错

PHP session 困惑

php - 有关 GMT 伊朗的问题?

javascript - 如何卸载 windows.eval() 加载和解释的 Javascript?

php - 如何构建 PHP/MySQL 查询以从一系列复选框输入数据

php - 如何从反向地理编码 JSON 结果中获取格式化地址?

java - 异常:"attempt to access org.rosuda.REngine.REXPGenericVector as String"

Lua 中的 Python eval()

javascript - 通过单击 LinkBut​​ton 将 BoundField 的值传递给 Javascript 函数

javascript - 替换私有(private)范围变量中的 eval