11

I'm trying to work a bit of security and sanitization into my databases application (for a class). to start off with, i'm trying to use mysql_real_escape_string, but whenever i use it, it always returns an empty string!

Here's the connection code:

include_once ("./connect.php");
$db_connection = new mysqli($SERVER, $USERNAME, $PASSWORD, $DATABASE);
if (mysqli_connect_errno()) {
    echo("Can't connect to MySQL Server. Error code: " . mysqli_connect_error());
    return null;
}
$field = mysql_real_escape_string($_GET['value']);
$upc = $_GET['upc'];
$type = $_GET['field_type'];
echo $field;
echo $upc;
echo $type;

When the php actually gets executed, the $upc and $type gets printed, but NOTHING for $field. Ive tried using an intermediate string, but i get the same result. I'm seriously at a loss as to what it is thats going wrong here.

Also, I've done a var_dump on $field, and it claims mysql_real_escape_string returns FALSE, which is supposed to happen when there isn't a connection(?), but there is one.

4

6 に答える 6

18

mysqlではなくmysqliを使用して接続しているため、必要ですmysqli_real_escape_string

mysqli で準備済みステートメントを簡単に使用できますが、どちらも必要ありません...

于 2012-04-26T20:17:53.527 に答える
8

PHP ドキュメントhttp://php.net/manual/en/function.mysql-real-escape-string.phpを参照してください。

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

つまり、この機能を使用するにはアクティブな接続が必要です

エラーが表示されない場合は、試してください

error_reporting(E_ALL);
ini_set('display_errors','On');

mysql_real_escape_string

使用する

  $escaped = htmlspecialchars($_GET['value'], ENT_QUOTES, "ISO-8859-1");

また

   $escaped = filter_var($_GET['value'], FILTER_SANITIZE_STRING);     
于 2012-04-26T19:49:40.343 に答える
6

関数は 2 つのパラメーターを受け取るため、空の文字列を取得しています。データベースへの実際の接続、次に文字列。これを使って:

$sanitizedField = mysqli_real_escape_string($connection, $field);
于 2013-12-05T20:53:10.117 に答える
2

「この拡張機能は PHP 5.5.0 で非推奨になり、将来的に削除される予定です。代わりに、MySQLi または PDO_MySQL 拡張機能を使用する必要があります。」http://php.net/manual/en/function.mysql-real-escape-string.phpから

関数名に「i」を追加するだけでは解決しません。リンク識別子パラメーターがオプションではなくなったことに注意してください http://www.php.net/manual/en/mysqli.real-escape-string.php

PS:反対票に関しては、私は自分の答えを支持します。問題の関数は PHP から削除される予定です。これは大したことであり、他の誰も言及していないので、指摘する必要があると感じました。同意しませんか?元の質問の詳細は重要ですが、多くの人 (私を含む) が mysql_real_escape_string() に関する情報を探してここに来ました。システム管理者は遅かれ早かれ PHP をアップグレードする必要があり、多くのアプリケーションがまだこの非推奨の機能を使用していることは間違いありません。

于 2013-07-08T20:20:34.750 に答える
0

私たちも同じ問題に直面しました。mysql_real_escape_string は、開発用 Linux システムでは機能していましたが、テスト ベッドでは機能していませんでした。すべてのphp rpmが同じバージョンであるにもかかわらず、テストベッドではなくシステムで動作するのはなぜだろうと思っていました. PHP ドキュメントを参照した後、mysql_real_escape_string を呼び出す前に MySQL へのアクティブな接続が必須であることがわかりました。アクティブな接続がない場合、PHP は内部的にデフォルトのパラメーターを使用して MySQL に接続しようとします。PHP が内部的に開発マシンのデータベースに接続しようとしたとき、動作しましたが、テスト ベッドでは失敗し、mysql_real_escape_string への呼び出しに対して空の応答が返されました。mysql_real_escape_string() の前に mysql_connect() への呼び出しを追加した後、問題は解決しました。

以下は、mysql コマンドを実行したときのエラーで、このエラーは開発マシンでは見られず、コマンドはデータベース サーバーに正常に接続されました。エラー 1045 (28000): ユーザー 'root'@'localhost' のアクセスが拒否されました (パスワードを使用: NO)

結論として、mysql_real_escape_string を呼び出す前に明示的に mysql に接続する必要があります。PHP によるデータベースへの内部接続試行は、セキュリティ レベルまたはログイン資格情報に応じて、一部のシステムでは機能し、他の一部のシステムでは失敗する可能性があります。

于 2014-01-22T06:37:04.597 に答える
0

@ jeroen はそれを説明しているようです。ローカルサーバー上のデータベースに接続しなくても機能するはずですが(多くの場合、この方法で機能します)、mysql_reaの前にデータベースに接続しない限り、Webサーバーでは機能しません.....試してみたところ、機能しました。それが彼が私の票を獲得した理由です

于 2015-07-27T08:22:38.033 に答える