gpt4 book ai didi

mysql - 保护 MySQL 的 PDO 连接字符串

转载 作者:行者123 更新时间:2023-11-29 01:58:12 25 4
gpt4 key购买 nike

我刚刚学习 PDO,需要知道这个连接(有效)是否真的安全。我将我的连接放在根目录之外的一个无法访问的文件夹中。

这个格式是否正确,或者我可以改进它吗?

我需要 $conn->setAttribute...EXCEPTION 吗?

$user = 'JoeUser';
$pass = 'JoesPassword';

try {
$conn = new PDO("mysql:host=myWebHost.com;dbname=MydataBase", $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}

最佳答案

if this connection (it works) is really secure.

不完全是。

您正在向全世界揭示数据库错误。它可能包含一些敏感的细节,例如数据库结构。人们可以将其称为安全之外的任何名称。

Do I need the $conn->setAttribute...EXCEPTION?

是的,但这有点无关紧要。

can I improve it?

您仅将用户名和密码分配给变量。数据库呢?其他可配置的东西?

但首先你真的应该避免回显数据库错误信息。通常,您不应该捕获此级别的错误。它应该只会让你的应用程序死掉。然而,在这种数据库连接错误的特殊情况下,堆栈跟踪将包含数据库凭据,您甚至不想在错误日志中看到它们,至少在屏幕上显示。因此,您必须捕获此错误,然后抛出一个全新的异常,该异常将仅包含消息但不包含堆栈跟踪。

$user    = 'JoeUser';
$pass = 'JoesPassword';
$host = 'myWebHost.com';
$db = 'MydataBase';
$charset = 'utf8mb4';

try {
$conn = new PDO("mysql:host=$host;dbname=$db;charset=$charset", $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

这样,在连接错误的情况下,我们将有一个适当的异常,但没有任何敏感细节,如数据库密码。反过来,这个异常将根据站点范围的配置进行处理——要么显示在屏幕上、记录下来,要么由专门的错误处理程序处理。

对于配置选项,它们可以分离并存储在一些配置文件中。

关于mysql - 保护 MySQL 的 PDO 连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22291063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com