提问人:Ben 提问时间:4/16/2023 最后编辑:Ben 更新时间:4/17/2023 访问量:58
是什么阻止了恶意用户包括我的 DB Connect 脚本并制作脚本来更新他们服务器上的数据库?
What prevents an evil user including my DB Connect script and making a script to update my database on their server?
问:
像大多数PHP开发人员一样,我在每个页面上都包含一个需要连接到MySQL数据库的脚本。该脚本包含 mysqli_connect 函数,该函数包含数据库用户名和密码。
是什么阻止某人在他们的服务器上上传需要/包含该脚本的脚本(例如include'www.anothersite.com/DB/connect.php'?然后,黑客可以制作一个脚本来更新/删除/插入我的数据库中的等内容。答案是将文件上传到公共域之前的目录中吗?
对不起,这么一个菜鸟的问题。我相当擅长编码,但在安全方面我不是太擅长,所以我需要一些时间来学习。
答:
这是大多数开发人员不将凭据存储在 PHP 脚本文件中的原因之一。数据库凭据不应成为代码的一部分,主要有两个原因:它们因环境而异,并且您不希望在版本控制系统中公开它们。数据库凭证和任何其他环境变量应存储在文档根目录之外的配置文件中。它们应该无法从互联网访问。
您描述的问题是利用远程文件包含。当包含远程文件时(顺便说一下,该功能已被弃用),PHP文件将由远程服务器执行,输出将包含在PHP脚本中。因此,除非您有一个在服务器上生成有效 PHP 文件的脚本,否则您不必担心有人能够劫持它。正如PHP手册中所说:
严格来说,这与包含文件并让它继承父文件的变量作用域不是一回事;该脚本实际上正在远程服务器上运行,然后将结果包含在本地脚本中。
您需要编写这样的代码才能远程包含它:
<?php echo '<?php $thisVariableIsAvailableRemotely = 42;';
但是像“connect.php”这样的文件不应该从互联网上访问,因为用户没有用处执行它们。将它们排除在文档根目录之外!
此外,如果使用 或 本地网络连接,则必须确保无法从本地网络外部访问服务器。如果您的网站连接到远程MySQL数据库,则应使用带有SSL的强密码,并保持凭据非常安全。localhost
最后,我想补充一点,在你的项目中有像“connect.php”这样的文件是一种代码气味,也是一个相当糟糕的设计。请考虑学习良好的设计模式,例如 MVC、前端控制器和依赖注入。不要写人们 20 年前写的意大利面条代码。
评论
.php
www.anothersite.com/DB/connect.php