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

时间:2014-04-05 03:20:22

标签: php mysql windows pdo sellvana

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

<?php 

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

我的错误:

  

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

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

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

谢谢!

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

EDIT2:有报道称该问题在运行MAMP 3.0.3的Mac上可以重现

EDIT3:之前有几个报道,但看起来还没有修好:

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:当权限授予&#39; myuser&#39; @host;&#39; @&#39; localhost&#39;时会出现问题,但是当权限授予&#39; myuser&#39; @&时出现问题#39;%&#39;没有密码 - 在linux上也是如此

2 个答案:

答案 0 :(得分:2)

我想确认一下。

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

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

    测试#1

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

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

    警告:mysqli :: mysqli():( HY000 / 1044):拒绝用户&#39;&#39; localhost&#39; 访问数据库&# 39;数据库&#39;在test.php中

         

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

    测试#2

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

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

    警告:mysqli :: mysqli():( HY000 / 1045):拒绝用户访问&#39; root&#39; @&#39; localhost&#39; (使用密码: NO)在test.php中

         

    致命错误:未捕获的异常&#39; PDOException&#39;消息&#39; SQLSTATE [HY000] [1045]拒绝访问用户&#39; root&#39; @&#39; localhost&#39; (使用密码:否)&#39 ; in test.php堆栈跟踪:#0 test.php():PDO-&gt; __ construct(&#39; mysql:host = loca ...&#39;,&#39; root&#39;,&#39 ;&#39;)在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):拒绝用户访问&#39; nonexistent_user&#39; @&#39; localhost&#39; (使用密码:是)在test.php中

         

    致命错误:未捕获的异常&#39; PDOException&#39;消息&#39; SQLSTATE [HY000] [1045]拒绝访问用户&#39; nonexistent_user&#39; @&#39; localhost&#39; (使用密码:是)&#39 ; in test.php堆栈跟踪:#0 test.php():PDO-&gt; __ construct(&#39; mysql:host = loca ...&#39;,&#39; nonexistent_use ...&#39; ,&#39;密码&#39;)#1 {main}抛出test.php

    如果用户不存在且提供了空密码,则错误消息将显示空白用户名。

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

答案 1 :(得分:2)

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

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

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