是什么阻止了恶意用户包括我的 DB Connect 脚本并制作脚本来更新他们服务器上的数据库?

What prevents an evil user including my DB Connect script and making a script to update my database on their server?

提问人:Ben 提问时间:4/16/2023 最后编辑:Ben 更新时间:4/17/2023 访问量:58

问:

像大多数PHP开发人员一样,我在每个页面上都包含一个需要连接到MySQL数据库的脚本。该脚本包含 mysqli_connect 函数,该函数包含数据库用户名和密码。

是什么阻止某人在他们的服务器上上传需要/包含该脚本的脚本(例如include'www.anothersite.com/DB/connect.php'?然后,黑客可以制作一个脚本来更新/删除/插入我的数据库中的等内容。答案是将文件上传到公共域之前的目录中吗?

对不起,这么一个菜鸟的问题。我相当擅长编码,但在安全方面我不是太擅长,所以我需要一些时间来学习。

PHP 数据库 安全 MySQLI 连接

评论

3赞 ADyson 4/16/2023
请参阅 stackoverflow.com/questions/1158348/...。此外,即使 thar 已打开,也不应将数据库设置为允许远程访问
1赞 M. Eriksson 4/16/2023
不仅如此,我建议将所有敏感代码/文件/配置等保留在文档根目录之外。如果不太可能的问题发生在 Web 服务器上,使其返回源代码而不是解析 PHP 代码,那么无论如何都没有人能够访问它。
1赞 Dharman 4/17/2023
"像大多数PHP开发人员一样,“我认为大多数开发人员不会这样做。您不应在 PHP 脚本中包含您的凭据。
1赞 ADyson 4/17/2023
为了详细说明上述内容,理想情况下,凭据放在配置文件中,而不是硬编码到脚本中
1赞 CBroe 4/17/2023
“是什么阻止某人在他们的服务器上上传需要/包含该脚本的脚本(例如include'www.anothersite.com/DB/connect.php'?” - 没有什么能阻止他们这样做,但他们实际上会通过它实现什么?假设带有后缀的文件的解析当前在服务器上没有失败,他们只会看到脚本生成的任何输出。他们将无法访问任何变量的值 - 就像我不会一样,如果我只是通过浏览器请求您的。.phpwww.anothersite.com/DB/connect.php

答:

1赞 Dharman 4/17/2023 #1

这是大多数开发人员不将凭据存储在 PHP 脚本文件中的原因之一。数据库凭据不应成为代码的一部分,主要有两个原因:它们因环境而异,并且您不希望在版本控制系统中公开它们。数据库凭证和任何其他环境变量应存储在文档根目录之外的配置文件中。它们应该无法从互联网访问。

您描述的问题是利用远程文件包含。当包含远程文件时(顺便说一下,该功能已被弃用),PHP文件将由远程服务器执行,输出将包含在PHP脚本中。因此,除非您有一个在服务器上生成有效 PHP 文件的脚本,否则您不必担心有人能够劫持它。正如PHP手册中所说:

严格来说,这与包含文件并让它继承父文件的变量作用域不是一回事;该脚本实际上正在远程服务器上运行,然后将结果包含在本地脚本中。

您需要编写这样的代码才能远程包含它:

<?php echo '<?php $thisVariableIsAvailableRemotely = 42;';

但是像“connect.php”这样的文件不应该从互联网上访问,因为用户没有用处执行它们。将它们排除在文档根目录之外!

此外,如果使用 或 本地网络连接,则必须确保无法从本地网络外部访问服务器。如果您的网站连接到远程MySQL数据库,则应使用带有SSL的强密码,并保持凭据非常安全。localhost

最后,我想补充一点,在你的项目中有像“connect.php”这样的文件是一种代码气味,也是一个相当糟糕的设计。请考虑学习良好的设计模式,例如 MVC、前端控制器和依赖注入。不要写人们 20 年前写的意大利面条代码。