繁体   English   中英

当密码为空时,Windows上的PDO会忽略主机名和用户名

[英]PDO on Windows ignores host name and username when password is empty

我不确定我的设置是否有问题,或者这是Windows上的PDO中的错误:

<?php 

$dsn = 'mysql:host=127.0.0.1;dbname=mydb;charset=UTF8';
$username = 'myuser';
$password = '';
$pdo = new PDO($dsn, $username, $password);

对我来说错误:

致命错误:未捕获异常'PDOException',消息'SQLSTATE [42000] [1044]用户''localhost'拒绝访问数据库'mydb''在C:\\ Ampps \\ www \\ test.php中:6堆栈跟踪: #0 C:\\ Ampps \\ www \\ test.php(6):PDO - > __ construct('mysql:host = 127 ....','myuser','')#1 {main}抛出C:\\第6行的Ampps \\ www \\ test.php

我已经能够在我的所有3台Windows开发机器上重现这一点,但是在所有的Linux服务器上都没有。

任何人都可以确认,或指出可能是什么问题?

谢谢!

编辑:使用空密码正确设置权限。

EDIT2:有报道说这个问题在运行MAMP 3.0.3的Mac上是可重现的

编辑3:之前有几个报告,但看起来还没有修复:

https://bugs.php.net/bug.php?id=43493

https://bugs.php.net/bug.php?id=46457

我的报告: https//bugs.php.net/bug.php?id = 67026

EDIT4:当权限被赋予'myuser'@'localhost'时它会起作用,但是在没有密码的情况下给'myuser'@'%'的权限时出现问题 - 在linux上也是如此

我想证实这一点。

在测试之前请确保满足条件:

  1. 确保nonexistent_user不是数据库中的用户。
  2. 确保root设置了密码。
  3. 确保单独运行这些测试。
  4. 确保在Windows(或任何受影响的计算机)上运行这些测试。

我加粗了有问题的用户名。

测试#1

不存在的用户+空密码=错误消息的空用户名

$mysqli = new Mysqli('localhost', 'nonexistent_user', '', 'database');
$pdo    = new PDO('mysql:host=localhost;dbname=database;charset=UTF8', 'nonexistent_user', '');

警告:mysqli :: mysqli():( HY000 / 1044):用户''@ localhost'拒绝访问test.php中的数据库'database'

致命错误:未捕获异常'PDOException',消息'SQLSTATE [HY000] [1044]用户''localhost'拒绝访问test.php中的数据库'database''堆栈跟踪:#0 test.php():PDO - > __ construct('mysql:host = loca ...','nonexistent_use ...','')test.php中抛出#1 {main}

测试#2

存在的用户+空密码=为错误消息设置的用户名

$mysqli = new Mysqli('localhost', 'root', '', 'database');
$pdo    = new PDO('mysql:host=localhost;dbname=database;charset=UTF8', 'root', '');

警告:mysqli :: mysqli():( HY000 / 1045):test.php中的用户'root'@'localhost' (使用密码:NO)拒绝访问

致命错误:带有消息'SQLSTATE [HY000]的未捕获异常'PDOException'[1045] test.php中用户'root'@'localhost' (使用密码:NO)'的访问被拒绝堆栈跟踪:#0 test.php() :PDO - > __ construct('mysql:host = loca ...','root','')在test.php中抛出#1 {main}

测试#3

不存在的用户+设置密码=为错误消息设置的用户名

$mysqli = new Mysqli('localhost', 'nonexistent_user', 'password', 'database');
$pdo    = new PDO('mysql:host=localhost;dbname=database;charset=UTF8', 'nonexistent_user', 'password');

警告:mysqli :: mysqli():( HY000 / 1045):test.php中用户'nonexistent_user'@'localhost' (使用密码:YES)拒绝访问

致命错误:带有消息'SQLSTATE [HY000]的未捕获异常'PDOException'[1045]对test.php中用户'nonexistent_user'@'localhost' (使用密码:YES)'的访问被拒绝堆栈跟踪:#0 test.php() :PDO - > __ construct('mysql:host = loca ...','nonexistent_use ...','password')test.php中抛出#1 {main}

当用户不存在并且提供了空密码时,错误消息将显示空白用户名。

我觉得这会带来安全风险,因为攻击者可以通过发送带有空密码的测试用户名来测试哪些用户有效,并查看用户名的错误响应是否为空。

问题不在于PHP或PDO,我能够直接用MySQL重现问题。

如果有''@ localhost'用户,可以使用任何没有密码的用户名登录,并且登录时将忽略任何用户@'%'。

复制步骤: https//gist.github.com/sellvana/9989227

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM