4

本番サーバーに Web サイトをアップロードしたところ、次のエラーが表示されました。

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 config のいずれかで見逃したものはありますか?

編集 ここに私のフォルダの権利があります:

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の引用を使用しようとします。みんな助けてくれてありがとう。

4

5 に答える 5

11

PDO を使用するか、mysql 拡張機能を使用します。両方を同時に使用しないでください。mysql_real_escape_stringmysql 拡張機能の機能です。機能するには、データベースへの接続が必要です。これを呼び出すと、以前に を使用して接続を確立していない場合はmysql_connect、必要なログイン資格情報を推測して接続を確立しようとします。ローカル マシンでは、明らかにパスワード保護がなく、MySQL ユーザーのアカウント名は Web サーバーが実行されている名前と同じであるため、幸運にも機能します。本番システムでは資格情報が異なり、接続を確立できません。

mysql_real_escape_stringPDO での使用を停止します。PDO の文字列引用関数を使用するか、準備済みのパラメーター化されたクエリとbind値を使用することをお勧めします。

于 2013-08-22T12:44:27.017 に答える
3

mysql_real_escape_string有効なリンク識別子 ( によって返される) が必要です。http://php.net/manual/en/function.mysql-real-escape-string.phpmysql_connect()を参照してください。

link_identifier: MySQL 接続。リンク識別子が指定されていない場合は、によって開かれた最後のリンクmysql_connect()が想定されます。そのようなリンクが見つからない場合mysql_connect()は、引数なしで呼び出されたかのようにリンクを作成しようとします。接続が見つからない、または確立されていない場合は、E_WARNING レベルのエラーが生成されます。

接続は PDO によって開かれているため、 の有効なリンク識別子がありませんmysql_real_escape_string

使ってみてPDO::quote

于 2013-08-22T12:30:48.337 に答える
1

この問題は通常、データベース接続が mysqli に設定されている場合に発生します。この問題を解決するには、mysqli が設定されている場合でも mysql_real_escape_string() を使用します。php.ini に移動して、mysql.default_user パラメータを見つけ、値をデフォルト ユーザーに設定します (例: mysql.default_user = root)。

Apacheを再起動すると、問題は解決しました..お楽しみください

于 2016-07-21T09:11:36.257 に答える
1

Wordpress バックエンドでユーザー検索を変更しようとしたときに同じ問題が発生し、不足しているのは適切な db 接続でした (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;
  }
}
于 2015-02-25T17:59:11.800 に答える
-14

この回答はひどいものであり、セキュリティの脆弱性につながることに注意してください。それは間違った解決策です。こんなことしないで。問題の実際の解決策については、さらに下を参照してください。この回答が受け入れられたという事実は、2人が自分のしていることを知らなかったことを意味します。

これは、mysql データベースに www-data がないためです!

phpmyadmin を使用して www-data ユーザーを追加し、そのユーザーに権限を付与しないと、機能するはずです

于 2013-09-11T13:56:01.453 に答える