簡體   English   中英

PHP mysql_real_escape_string():用戶'www-data'@'localhost'的訪問被拒絕

[英]PHP mysql_real_escape_string(): Access denied for user 'www-data'@'localhost'

我剛剛將網站上傳到生產服務器上,但出現錯誤:

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產品服務器上使用虛擬主機。 不知道發生了什么...在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引用。 謝謝大家嘗試幫助我。

您可以使用PDO,也可以使用mysql擴展,不要同時使用兩者。 mysql_real_escape_string是mysql擴展的功能。 它需要與數據庫的連接才能起作用。 調用它時,如果您以前未使用mysql_connect建立連接,它將嘗試建立連接,對所需的登錄憑據進行賓語估計。 在您的本地計算機上,您顯然沒有密碼保護,並且MySQL用戶的帳戶名與Web服務器運行時使用的名稱相同,因此很幸運。 在生產系統上,憑據不同,並且無法建立連接。

停止在PDO中使用mysql_real_escape_string 要么使用PDO的字符串引用函數,要么更好地使用准備好的和參數化的查詢並bind您的值

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

嘗試在Wordpress后端修改用戶搜索時遇到相同的問題,缺少的是正確的數據庫連接(不建議使用mysql_real_escape_string())。 全局變量在wp-config.php中定義。

這是工作功能。 注意$ con變量。 更多說明在這里

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

通常,將數據庫連接設置為mysqli時會出現此問題,以解決此問題並使用mysql_real_escape_string()(即使已設置mysqli)。 只需轉到php.ini並找到:mysql.default_user參數並將值設置為默認用戶,例如:mysql.default_user = root

並重新啟動apache,您的問題現在已經解決了。

請注意,這個答案很糟糕,使您容易受到安全漏洞的攻擊。 這是錯誤的解決方案。 不要這樣做。 有關該問題的實際解決方案,請參閱下文。 這個答案被接受的事實意味着兩個人不知道他們在做什么。

這是因為您的mysql數據庫中沒有www數據!

您可以通過phpmyadmin添加www-data用戶,並且不賦予該用戶特權,並且該用戶應該可以使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM