php - 如何防止包含来自另一个客户端的数据库 config.php?
问题描述
我们有这个 config.php 文件:
<?php
$host = "host";
$dbname = "db";
$user = "user";
$pass = "pass";
try {
$conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die("Error");
}
?>
而这个结构
/www/
index.php
config.php
索引文件可通过 访问www.example.com/index.php
,但 config.php 文件也可访问(通过 www.example.com/config.php
)。
其他人可以只包含www.example.com/config.php
在那里的php文件并用我的执行代码$conn
吗?如何防止这种情况?
解决方案
确实,如果您将文件保留在 Web 根目录中,Web 服务器将在匹配的请求 URI 到达时执行它们。
但是,请了解源代码(通常)不被客户查看。例如,当有人请求 时/index.php
,他们看不到 PHP 源代码。他们只看到它的输出。同样,如果有人提出请求/config.php
,给定示例代码您的问题,他们应该得到的只是一个空的响应。所以,回答你的问题...
其他人可以在 php 文件中包含 www.example.com/config.php 并使用我的 $conn 执行代码吗?
不,他们不能。
要执行代码,它们需要在您的服务器上运行代码。
config.php
现在,将您的和任何其他包含从 Web 根目录中取出仍然是一个好习惯。这样做的原因是为了防止在您的 Web 服务器上禁用 PHP 时暴露代码。尝试升级您的 Web 服务器或其他东西、破坏配置、意外禁用实时服务器上的 PHP,现在每个人都可以看到您的所有源代码,这并不少见。如果该源代码不在 Web 根目录中,则他们无法请求任何内容。
此外,您的 Web 根目录中的文件通常有更多的打开权限。因此,在可能的情况下将事情排除在外只是一个好习惯……但不是直接出于您担心的原因。
推荐阅读
- javascript - 为什么我的 jQuery .off() 方法没有触发?
- python - Scrapy 根据类中的特定模式提取文本
- react-native - 如何使用 React Native 上的按钮在选项卡之间导航
- amazon-web-services - Amazon Connect 服务域
- sql - 动态 SQL 查询包含额外的行
- python - 如何计算多个数据框中的重叠行?
- flutter - 使用提供程序包 FLUTTER 关闭应用程序后保存状态
- c - 尝试在 Raspberry Pi 上编译 Paho MQTT C 示例
- azure - 构建和推送 IoT Edge 模型时没有任何反应
- python - 如何产生不同类型的迭代?