安全なSQL文文字列として
-
08-07-2019 - |
質問
私C#ます。純3.5.Iを生成しなければならないものT-SQLのinsertする実行後のリモートサーバーです。
例えば、配列の従業員:
new Employee[]
{
new Employee { ID = 5, Name = "Frank Grimes" },
new Employee { ID = 6, Name = "Tim O'Reilly" }
}
とい終わるstringの配列、このように:
"INSERT INTO Employees (id, name) VALUES (5, 'Frank Grimes')",
"INSERT INTO Employees (id, name) VALUES (6, 'Tim O''Reilly')"
いであるコードを作成し、挿入、発言と発言間の関係を明確に文字列になります。フォーマットな感じですね。どのように使用SqlCommand(いい このようになっがんの提供を組み合わせのコンテキストとパラメータ。
なだけで置き換えシングルクォーテーションを構築ん。
string.Format("INSERT INTO Employees (id, name) VALUES ({0}, '{1}')",
employee.ID,
replaceQuotes(employee.Name)
);
どうすれば良い関心がうか。元のデータがないために多くの前提をアップデート。
編集:しみやすく心のこもった点がこの場合においてSqlConnectionまたはその直接接続SQLサーバーです。この特定のアプリのニーズをsqlステートメントやキューにて実行されるか-その他うスタイルを使用SqlCommand.パラメータ。AddWithValue()
解決
パラメータ化されたコマンドを使用します。リモートサーバーにもパラメーターを渡し、それをSQL Serverに呼び出します。SQL自体とパラメーター値の区別は維持されます。
データをコードとして扱わない限り、大丈夫です。
他のヒント
次のようにSqlCommandオブジェクトを作成します:
SqlCommand cmd = new SqlCommand(
"INSERT INTO Employees (id, name) VALUES (@id, @name)", conn);
SqlParameter param = new SqlParameter();
param.ParameterName = "@id";
param.Value = employee.ID;
cmd.Parameters.Add(param);
param = new SqlParameter();
param.ParameterName = "@name";
param.Value = employee.Name;
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
引用符の置換関数を次のように修正します。
void string replaceQuotes(string value) {
string tmp = value;
tmp = tmp.Replace("'", "''");
return tmp;
}
乾杯!
Hmmいんするのに使用パラメータ化された問い合わせやすいです。かがい、それぞれのsql文へのリモートサーバ?しているタイプのサービスのようなwebサービスを受け入れ、任意のSqlコマンドまたはクライアントアプリにDBを直接?
場合において何らかのプロキシを利用しているただし、アクセスインターネットサニタイズのデータをクライアントがあり、ハッカーがバイパスをアプリののサービスです。その場合などのケ勧告には、データをXMLとして例えばあ形式を選択(JSON、バイナリーなど)の構築とSQL直前に実際に次のコマンドを実行します.
インジェクションを回避するには、データをリモートサーバー(おそらくXML)に送信してから、リモートサーバーで適切なデータ型に変換し直し、パラメーター化されたクエリまたはストアドプロシージャで使用する必要があります。