为什么 mysqli_connect() 必须在没有加密的情况下接收密码参数?

法兰

我创建了一个用户来使用我的数据库

CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'my_pass';
GRANT ALL PRIVILEGES ON * . * TO 'my_user'@'localhost';
FLUSH PRIVILEGES;

通行证以加密模式存储在mysql.user表中。

但是当我使用 mysqli_connect() 方法时,我发现当我将 pass 作为参数提供时,如果我不想得到著名的“连接失败”,我必须提供我在查询中使用的未加密的原始值:用户'my_user'@'localhost'的访问被拒绝(使用密码:是)”。

但这实际上是存储在数据库中的字符串值(加密版本)。

如何?如果有人访问我建立连接的 .PHP 文件,将加密版本作为参数提供会不会更安全?为什么 mysqli_connection 不接受它?有没有办法做到这一点?

格莱兹托尔

作为用户,您不知道密码是如何加密的(实际上根本没有加密,而是经过哈希处理)。

您只需传递密码,MySQL 就可以执行与原始密码相同的散列运算,并将其与存储的内容进行比较。如果传递散列版本,散列的全部好处就消失了:如果有人从服务器获取散列,他们就可以像使用普通密码一样使用这些来登录。散列然后成为密码。

额外的好处是 MySQL,因为它有原始密码,可以用更好的算法重新散列它,添加一点盐并存储改进的版本。如果它永远不会得到原件,那是做不到的。PHP 的密码函数也支持这一点。您可以检查password_needs_rehash散列密码是否仍然正确散列,如果不是,则更新您的数据库。

因此,为了安全起见,您将需要采取其他措施。这些至少是:

  • 将密码存储在文档根目录之外的包含文件中。这样,没有人可以直接打开该文件。
  • 您可以防止在未包含的情况下打开包含文件(例如,通过检查在 index.php 中设置的定义)。这很好,但是如果 PHP 由于配置错误而失败,人们只能浏览文件的源代码,因此请坚持之前的规则。
  • 始终创建一个特殊的数据库用户。不要使用root. 给这个用户足够的权限来操作数据库,但不能更多。例如,没有删除表的权利。
  • 始终为该用户提供唯一的密码。您不必记住此密码。只需生成带有大量字符的随机垃圾。
  • 定期更改密码。也许您甚至可以编写脚本并将更新的密码存储在配置中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

警告:mysqli_connect():(HY000 / 1045):用户'@'localhost'的访问被拒绝(使用密码:NO)

使用mysqli_connect从PHP进行无密码的mysql连接

为什么connect()给EADDRNOTAVAIL?

警告:mysqli_connect():(HY000 / 1045):用户'username'@'localhost'的访问被拒绝(使用密码:是)

为什么MySQLi库本身不支持命名参数?

如何捕获mysqli_connect()的警告

带有Apache和MySQL的Docker PHP 5.6.23 mysqli_connect不是添加扩展名的函数

为什么mysqli_connect不尊重MYSQLI_OPT_CONNECT_TIMEOUT?

为什么mysqli_connect不尊重MYSQLI_OPT_CONNECT_TIMEOUT?

为什么我的API调用应该在随机的情况下接收重复数据?

为什么Dart隔离中的流在没有接收端口的情况下无法工作

为什么我必须在开始时引用组件,但是在没有空的情况下声明变量?

为什么mysqli参数绑定会给出错误?

为什么我不能使用mysqli_connect和PHP 7.4连接到MySQL 5.3.36共享服务器,但是在php 7.1下可以使用?

Mysqli_Connect是未定义的函数

为什么函数在没有参数的情况下运行?

为什么此版本的mysqli结果有效?

警告:mysqli_connect()期望参数5长,字符串在

Cerber-为什么某些文件没有加密?

无法通过mysqli_connect存储数据

为什么在没有密码的情况下无法登录我的加密帐户?

带有mysqli_connect而不是PDO的Azure Web应用

mysqli_connect()中的第四个参数是什么?

警告:mysqli_connect():(28000/1045):用户'mobileto'@'localhost'的访问被拒绝(使用密码:NO)

mysqli_connect不起作用

mysqli_connect(): (28000/1045): 用户 'username'@'localhost' 访问被拒绝(使用密码:YES)

在 mysqli_connect 中使用数组值

mysqli_connect 错误 2002“没有这样的文件或目录”Mac OS 10.13.2

为什么我必须在这种情况下使用 GroovyMock?