【问题标题】:PHP mysql_real_escape_string(): Access denied for user 'www-data'@'localhost'PHP mysql_real_escape_string():用户'www-data'@'localhost'的访问被拒绝
【发布时间】:2013-08-25 02:19:45
【问题描述】:

我刚刚将我的网站上传到生产服务器上,但出现错误:

Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in file.php on line 106

Warning: mysql_real_escape_string(): A link to the server could not be established in file.php on line 106

函数的代码是

include('./../inc/conn.php');
if(isset($_GET['query']))$q = clean($_GET['query']);
function clean($var){
    return(mysql_real_escape_string($var));
}   

inc/conn.php 的代码:

try {
  $dns = 'mysql:host=localhost;dbname=mydatabase';
  $user = 'root';
  $pw = 'rootpw';

  $options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND    => "SET NAMES utf8",
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  );

  $db = new PDO( $dns, $user, $pw, $options );
} catch ( Exception $e ) {
    echo "Connection error : ", $e->getMessage();
    die();
}

我真的不知道发生了什么,因为我在本地开发 ubuntu 服务器上没有问题。 mysql、apache和php版本是一样的。唯一的事情是我在 apache prod 服务器上使用虚拟主机。不知道发生了什么...我在 apache 或 php 配置之一中遗漏了什么?

编辑 这是我的文件夹的权利:

sudo ls -l /home/user/public/domain.com/www/
total 28
drwxrwxr-x 13 user www-data 4096 Aug 22 12:30 adodb5
drwxrwxr-x  2 user www-data 4096 Aug 22 12:30 ajax
drwxrwxr-x  2 user www-data 4096 Aug 22 12:31 css
drwxrwxr-x  9 user www-data 4096 Aug 22 12:33 gfx
drwxrwxr-x  2 user www-data 4096 Aug 22 12:33 inc
drwxrwxr-x  2 user www-data 4096 Aug 22 12:34 js

我的 apache 虚拟主机配置

<VirtualHost *:80>
  # Admin email, Server Name (domain name), and any aliases
  ServerAdmin contact@domain.com
  ServerName  www.domain.com
  ServerAlias domain.com

  # Index file and Document Root (where the public files are located)
  DirectoryIndex index.html index.php
  DocumentRoot /home/user/public/domain.com/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /home/user/public/domain.com/www>
                Options FollowSymLinks
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Order allow,deny
            Allow from all
    </Directory>

  # Log file locations
  LogLevel warn
  ErrorLog  /home/user/public/domain.com/log/error.log
  CustomLog /home/user/public/domain.com/log/access.log combined
</VirtualHost>

编辑 2

好的,问题是我在 mysql 服务器上没有任何 www-data 用户。所以我只是在mysql中添加了没有密码且没有权限的用户www-data,这工作正常。我将在未来尝试使用许多提到的 PDO 引用。 感谢所有试图帮助我的人。

【问题讨论】:

  • 你为什么将mysql_real_escape_stringPDO一起使用?
  • 在生产服务器中使用root,嗯?
  • 您应该可以访问生产服务器环境。如果您是特权用户,请询问管理员。
  • @CathedralZealot 我不知道这是我第一次自己配置服务器。我必须创建一个具有较少权限的新 mysql 用户?
  • @YogeshSuthar 好吧,我听说最好使用此功能来摆脱 sql 注入。我应该更好地使用 htmlspecialchars 吗?以为只是一个 php 函数,但现在我发现它需要 mysql 连接

标签: php mysql apache function warnings


【解决方案1】:

您要么使用 PDO,要么使用 mysql 扩展,不要同时使用两者。 mysql_real_escape_string 是 mysql 扩展的一个函数。它需要连接到数据库才能运行。调用它时,如果您之前没有使用mysql_connect 建立连接,它会尝试建立连接,并猜测所需的登录凭据。在您的本地计算机上,您显然没有密码保护,并且 MySQL 用户的帐户名称与运行 Web 服务器的名称相同,因此幸运的是它可以工作。在生产系统上,凭据不同,无法建立连接。

停止使用带有 PDO 的 mysql_real_escape_string。要么使用 PDO 的字符串引用函数,要么使用 use prepared and parameterized queries and bind your values 更好。

【讨论】:

  • 你很棒。我有同样的问题,为mysql_real_escape_string添加到mysql的连接解决了我的问题。只需在正常连接后的配置文件中添加mysql_connect('localhost', 'mysql_user', 'mysql_password');。或者我将在不久的将来转换所有mysql_real_escape_string´ to ´PDO::quote´ or bind`
  • 请注意,这肯定不是解决方案!如果您正在使用 PDO,请不要使用 mysql_real_escape_string!期间!
【解决方案2】:

mysql_real_escape_string 需要一个有效的链接标识符(由mysql_connect() 返回),参见http://php.net/manual/en/function.mysql-real-escape-string.php

link_identifier:MySQL 连接。如果未指定链接标识符,则假定为mysql_connect() 打开的最后一个链接。如果没有找到这样的链接,它将尝试创建一个,就好像在没有参数的情况下调用了 mysql_connect()。如果未找到或建立连接,则会生成 E_WARNING 级别错误。

您的连接由 PDO 打开,因此您没有任何有效的mysql_real_escape_string 链接标识符。

尝试使用PDO::quote

【讨论】:

  • 检查您的本地用户名,它是否作为您的 mysql 开发服务器的用户存在?您的产品服务器上是否有一个名为 www-data 且没有密码的用户?
  • 不,它不存在。我认为这就是它不起作用的原因。该用户必须拥有什么样的权限?
  • 这是 www-data 用户丢失!现在它正在工作。所以看起来 PDO 使用 mysql_connect ?
  • PDO::quote() 是实例方法,不能静态调用。 Fatal error: Non-static method PDO::quote() cannot be called statically
【解决方案3】:

我在尝试在 Wordpress 后端修改用户搜索时遇到了同样的问题,缺少的是正确的数据库连接(也不推荐使用 mysql_real_escape_string())。 全局变量在 wp-config.php 中定义。

这是工作功能。注意 $con 变量。 更多解释可用here

if(is_admin()) {


add_action( 'pre_user_query', 'user_search_by_email' );
  function user_search_by_email($wp_user_query) {
    if(false === strpos($wp_user_query->query_where, '@') && !empty($_GET["s"])) {
      $con = mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);
      $wp_user_query->query_where = str_replace(
              "user_nicename LIKE '%".mysqli_real_escape_string($con, $_GET["s"])."%'",
              "user_nicename LIKE '%".mysqli_real_escape_string($con, $_GET["s"])."%' OR user_email LIKE '%".mysqli_real_escape_string($con, $_GET["s"])."%'",
              $wp_user_query->query_where);
      mysqli_close($con);

    }
    return $wp_user_query;
  }
}

【讨论】:

    【解决方案4】:

    这个问题通常出现在数据库连接设置为 mysqli 时, 解决此问题并使用 mysql_real_escape_string() 即使设置了 mysqli。只需转到 php.ini 并找到: mysql.default_user 参数并将值设置为您的默认用户 例如:mysql.default_user = root

    然后重新启动 apache,你的问题现在已经解决了.. 享受

    【讨论】:

      【解决方案5】:

      请注意,这个答案很糟糕,并且会给您带来安全漏洞。这是错误的解决方案。不要这样做。进一步查看问题的实际解决方案。这个答案被接受的事实只是意味着 两个 人不知道他们在做什么。

      这是因为你的 mysql 数据库中没有 www-data!

      您可以通过 phpmyadmin 添加 www-data 用户,并且不授予该用户任何权限,它应该可以工作

      【讨论】:

      • 最糟糕的答案。它对这个问题一无所知,并提倡一种具有负面安全影响的糟糕解决方案。当然,它被接受了。 掌心
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2023-03-20
      相关资源
      最近更新 更多