PHP mysql_real_escape_string():拒绝访问用户'www-data'@'localhost'

时间:2013-08-22 11:21:35

标签: php mysql apache function warnings

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

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();
}

我真的不知道发生了什么事,因为我的本地dev 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用户。所以我刚刚添加了用户www-data,没有密码,也没有mysql的权限,这个工作正常。我将在未来尝试使用PDO引用,正如许多人提到的那样。 谢谢大家试图帮助我。

5 个答案:

答案 0 :(得分:11)

您要么使用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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

我在尝试修改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;
  }
}

答案 3 :(得分:1)

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

并重新启动apache,您的问题现在已解决..享受

答案 4 :(得分:-14)

  

请注意,这个答案非常糟糕,可以让您了解安全漏洞。这是错误的解决方案。不要这样做。请进一步了解问题的实际解决方案。这个答案被接受的事实只是意味着两个的人不知道他们在做什么。

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

您可以通过phpmyadmin添加www-data用户并为该用户提供无权限,并且应该可以正常工作