7

さまざまな言語の.NET、Java、およびその他の高レベルのデータベースAPIは、プレーンテキストコマンドをデータベースサーバーに送信するのではなく、プリペアドステートメントおよびパラメータバインディングと呼ばれる手法を提供することがよくあります。私が知りたいのは、次のようなステートメントを実行するとどうなるかです。

SqlCommand cmd = new SqlCommand("GetMemberByID");
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter("@ID", memberID);
para.DbType = DbType.Integer;
cmd.Parameters.Add(param);

これがベストプラクティスであることを私は知っています。SQLインジェクション攻撃はこの方法で最小限に抑えられます。しかし、これらのステートメントを実行すると、内部で正確に何が起こりますか?最終結果はまだSQLセーフ文字列ですか?そうでない場合、最終結果はどうなりますか?そして、これはSQLインジェクション攻撃を防ぐのに十分ですか?

4

3 に答える 3

5

プリペアドステートメントに関するMySQLのマニュアルページには、多くの情報が記載されています(他のRDBMSにも適用されます)。

基本的に、ステートメントは事前に解析および処理され、パラメーターはSQLコードと一緒に処理されるのではなく、個別に送信されます。これにより、パラメータが設定される前にSQLが解析されるため、SQLインジェクション攻撃が排除されます。

于 2008-08-18T17:18:50.310 に答える
0

MS SQL を使用している場合は、プロファイラーをロードすると、パラメーター化されたクエリを使用したときに生成される SQL ステートメントが表示されます。SQL Server 2005 に対する例を次に示します (私は Enterprise Libary 3.1 を使用していますが、SqlParameters を直接使用しても結果は同じです)。

string sql = "SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did";
Database db = DatabaseFactory.CreateDatabase();
using(DbCommand cmd = db.GetSqlStringCommand(sql))
{
  db.AddInParameter(cmd, "DomName", DbType.String, "xxxxx.net");
  db.AddInParameter(cmd, "Did", DbType.Int32, 500204);

  DataSet ds = db.ExecuteDataSet(cmd);
}

これにより、次が生成されます。

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(9),
  @Did int',
  @DomName=N'xxxxx.net',
  @Did=500204

ここでも、引用符がパラメーターとして渡された場合、それに応じてエスケープされることがわかります。

db.AddInParameter(cmd, "DomName", DbType.String, "'xxxxx.net");

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(10),
  @Did int',
  @DomName=N'''xxxxx.net',
  @Did=500204
于 2008-08-18T17:48:04.900 に答える
0

簡単に言えば、準備されたステートメントが送信された場合、DBはプランが利用可能であればそれを使用します。このクエリが送信されるたびにプランを再作成する必要はありませんが、パラメーターの値のみが変更されました。これは procs の仕組みと非常によく似ています。procs の追加の利点は、procs を介してのみ権限を付与でき、基になるテーブルにはまったく付与できないことです。

于 2008-08-18T17:53:15.030 に答える