1

したがって、mysql_real_escape_string を使用すると、この警告が表示されます

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'username'@'localhost' (using password: NO) in /home/path/php/functions.php on line 11

サイトの残りの部分は正常に動作し、DB などに接続しますが、この関数を使用するとエラーが発生します。

私のローカルホスト テスト サーバーでは問題なく動作します。

何か案は?

前述の関数を自作の文字列サニテーション関数で使用します。

function sani($string){     
  $string = strip_tags($string); 
  $string = htmlspecialchars($string); 
  $string = trim(rtrim(ltrim($string))); 
  $string = mysql_real_escape_string($string);
  return $string;
}

そして、クエリを実行するたびにこの関数を使用します...

function mm_mysqlquery($query) {
 if (MM_DEBUG == true) { echo "Query: $query <br>"; mm_log("Query: $query"); } //print query if MM_DEBUG
 $link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ("mysql_error: " . mysql_error());
 $db_selected = mysql_select_db(DB_NAME);
 return mysql_query($query, $link);
}

よろしくお願いします!

4

2 に答える 2

8

最初のポイント: からエラーが発生しmysql_real_escape_string()た場合は、データベースに接続する前に関数を呼び出しているためです。

クエリを実行する直前にデータベースに接続しているようです。mm_mysqlquery()したがって、関数を呼び出す前に何をしても接続されません。

関数はデータベースへのmysql_real_escape_string()ライブ接続を必要とするため、接続の文字セットに関して適切な種類のエスケープを行うことができます。したがって、エスケープする前に接続する必要があります。

1 つの PHP リクエストの過程で複数のクエリを作成する場合、1 回接続してすべてのクエリに同じ接続を使用する方がオーバーヘッドが少ないため、とにかくそうする方がよいでしょう。

第二に、使用の提案を受け入れないでください。addslashes()これは と同じことを行いませんmysql_real_escape_string()。この 2 つは交換可能ではありません。を使用する習慣を身につける必要がありますmysql_real_escape_string()

第三に、あなたのsani()関数はよくある誤解を示しています。

function sani($string){     
  $string = strip_tags($string); 
  $string = htmlspecialchars($string); 
  $string = trim(rtrim(ltrim($string))); 
  $string = mysql_real_escape_string($string);
  return $string;
}

よくある誤解は、SQL ステートメントで文字列を安全にするには、これらすべての関数が必要であるというものです。あなたはそうしない。のみmysql_real_escape_string()が必要です。この例の他のすべての関数は、SQL インジェクションから保護するために何もしません。

これらの関数は、HTML プレゼンテーションで文字列を出力し、XSS 攻撃のリスクを軽減したい場合に役立ちますが、その場合mysql_real_escape_string()は無関係です。

適切なコンテキストで各タイプのサニタイズ方法を使用します。

于 2010-10-12T04:25:09.553 に答える
0

文字列 mysql_real_escape_string (文字列 $unescaped_string [, リソース $link_identifier ] )

$unescaped_string は文字列で、$link_identifier は db リソースです。

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

PHP.NET mysql_real_escape_string リソース

于 2010-10-12T14:24:41.453 に答える