4

関数を適用するオブジェクトインスタンスを最初に作成せずに、(real_escape_stringを使用して)文字列をエスケープできるかどうか疑問に思っていますか?

つまり、これを行うことができます:

$database = new mysqli(DB_HOST,DB_USER,DB_PASS,DB_NAME);
$database->real_escape_string($query);
$database->query($query)

ただし、アプリケーション内で一貫性を保つために私がやろうとしているのは、MySQLiクラスの拡張であるほとんど静的なデータベースクラスを用意してdatabase::real_escape_string($query)、静的メソッドを呼び出すことができるようにすることです。

MySQLを使わずに手動で文字列をエスケープする関数を作成できることを実感しています。

4

2 に答える 2

8

簡単な答えは:いいえ。

長い答えは次のとおりです。単純な理由から、お勧めしません。特定の種類のSQLインジェクション手法では、一般的なフィルターをバイパスするために文字エンコードを使用および悪用するため、MySQLiの実際のエスケープでは文字エンコードが考慮されます。これには、元の(PHP)文字セットと受信(MySQL)の文字セット構成の両方を知っているコードが必要です。これが、静的に呼び出すことができない(そしてサーバーへの有効なリンクが得られるまで呼び出すことができない)理由です!

また、手続き型バージョンは避けたいと思います。これは、接続した最後のサーバーを効果的に取得することで、内部で「文字セット」ビットを実行するだけなので、複数のデータベースを処理していると楽しいものになる可能性があります。同時に接続します。

于 2012-11-17T22:11:40.553 に答える
1

mysql_real_escape_string()が役立つ場合がありますが、両方のバージョンで接続を確立する必要があります。これは、アプリケーションがデータベースの文字列をエスケープする方法を知らないためです。データベースに接続すると、関数はデータベースにエスケープ方法とエスケープ対象を尋ねます。

于 2012-11-17T22:10:55.970 に答える