SQLコマンドを作成するために文字列連結を使用しているコードをリファクタリングしようとしています(SQLインジェクションで脆弱になります)。基本的に私がしようとしているのは、すべてのstring sqlToExecute = String.Format(..)
ステートメントをSQLコマンドとOleDBパラメータのリストに置き換えることです。複雑なOleDBクエリをパラメータ化する方法は?
これは、String.Format("Select * from myTable where id = {0}", id)
のような単純なケースでどのように行うことができるかを理解しています。しかし、私はより複雑なSQLクエリの良い例を見つけることができませんでした。ここで
は私がパラメータ化することができます正確にどのようにわからないクエリの一部です:
1.パラメータは、列名と別名の両方に使用されています。パラメータは、2つの変数で構成されています
selQueryBldr.AppendFormat("SELECT * FROM {0} {1}
INNER JOIN ColChange CC ON CC.TableRecordID = {1}.{2} and CC.EntityID='{3}'",
entity.StageTableName, stageTableAlias, entity.PrimaryKey, entity.EntityID);
2.同じパラメータが句
SQLクエリで複数のSQLで使用されます。
SELECT A.TablePrefix ...
FROM Entity E
INNER JOIN App A
ON A.AppID = E.AppID
WHERE E.AppID in (#APPIDS#)
UNION
SELECT A.TablePrefix ...
FROM EntityB EB
INNER JOIN App A
ON A.AppID = EB.AppID
WHERE EB.AppID in (#APPIDS#)
現在のパラメータをすることで、コードに追加されますString.Replace()メソッドを使用して:
sqlQuery = sqlQuery.Replace("#APPIDS#",idList);
パラメータ名およびパラメータ値として変数を使用
3:
StringBuilder dataQuery = new StringBuilder("Select * from {0} WHERE {1}='{2}'",
tableName, primaryKey[0], changeRow["TableRecordID"]);
4変数は、Unicodeパラメータの一部を使用する:また
sSQL = string.Format("SELECT name FROM sysobjects WHERE id = object_id(N'[dbo].[{0}]')",
sSPName);
、これらの例はすべてOleDbクラス(OleDbConnection/OleDbCommandなど)を使用しています。したがって、名前付きパラメータが理解できない限り、b eはここで使用されます。
IN節のすべてのパラメータをindividaulyに渡すと、シナリオ#2が動作するように見えます: '...どこのEB.AppIDが(?、?、?)' –