我客户的数据库安全性

时间:2014-05-04 15:33:36

标签: php mysql database security

我要向我的客户端提供PHP应用程序,但我不想与他共享数据库凭据。我只希望通过我的应用程序访问数据库,而不是其他可能的方法。 但是,如果我提交PHP代码,他们可以在数据库连接脚本中查看数据库凭据,并从脚本外部访问数据库。 我怎么可能阻止他们拥有数据库用户名和密码,因为他们没有“编译”代码?

编辑:应用程序和数据库位于两个不同的服务器上。即app使用远程数据库连接,并且在客户端的服务器数据库上运行在我自己的服务器上。

2 个答案:

答案 0 :(得分:3)

  

我不想与他分享数据库凭据。

如果他们有权访问连接到数据库的客户端,则您必须。否则,根据定义,无法进行凭证访问。

然而,您混淆了连接阶段,一旦建立连接,任何有权访问源代码的人都可能会劫持它/他想要的。我认为即使加密整个建模类也不够。

使用已弃用的MySQL函数尤为明显:一旦建立连接,代码的任何其他部分可以发出查询并在连接的上下文中执行不再需要知道凭证。但除非你非常谨慎地做事(而且,我怀疑,根据攻击者的能力,即使你做),mysqliPDO也是如此,等等。

可以做的是:

  • 将数据库的权限限制在最小可能的范围内。这应该总是这样做,顺便说一句,因为你永远不知道某些代码中的漏洞可能是什么,你的或其他人与你的连接(库,插件,......),以及可能从中获益访问该应用程序。

  • 将连接IP限制为客户端的IP。你应该随时做的另一件事:没有理由不这样做。

  • 移动任何可能进入存储过程和函数的内容。

如果你想(并且确实需要)更多的控制,你需要更多的工作:

  • 而不是使用准备好的语句(而且,顺便说一下,你现在必须有“静态”语句 - 你将无法prepare,比如SELECT {$field} FROM table WHERE id = ?并将其绑定到{{ 1}}),移动语句本身 到数据库服务器上的一个薄层,通过(例如)JSON。
  • 传递参​​数

那是什么,比方说,

id

可以变得非常容易

SQLExec("SELECT * FROM users WHERE userid = ?", "1")

但现在,在服务器上(您需要一台HTTP服务器),脚本将验证所请求的查询确实在批准的查询中;并且只有这样,执行它并返回结果。根据几个因素,您甚至可以将其作为“性能改进”。另一方面,“数据库”服务器现在负载更多。

现在客户无法发出“DROP TABLE Students”。声明,因为此声明不在批准的声明列表中。

要生成批准的语句列表,您可以指示服务器批准所有内容并存储它收到的查询;然后,您可以对所有Web应用程序进行详尽的审核,以便至少触发一次所有查询(您可能已经有一个已经执行此操作的测试集成脚本,并验证结果是否正常);完成后,刚刚收到的所有查询以及,将被视为“有效”。

有人更改了客户端代码中的一个查询中的逗号 - 服务器将拒绝该查询为未经授权。

这最终相当于将相关应用程序代码移动(或复制)到您的服务器上,因此可能存在问题:实际上,您不再向客户端提供完整应用程序

(此时你甚至可以用他们的MD5哈希替换客户端代码中的所有查询。服务器并不真正执行客户端发送的SQL,它执行好的副本现在的服务器端用于比较目的。因此发送查询或其MD5签名完全相同。)

答案 1 :(得分:0)

您可以将存储数据库连接信息的配置文件进行离心复制。您可以免费上传单个文件。

http://www.ioncube.com/online_encoder.php