2

実行するSQLをログに記録しようとしています。

データベースにデータを保存するために挿入プロセスを実行する関数呼び出し LogGenerateReport(String Sql) があります。

私が直面している問題は、SQl '' に関するものです。

例えば:

INSERT INTO TABLE(Sql)
VALUE('SELECT * FROM Sales WHERE SalesID = 'ABC123';')

そのエラーが返され、見積もりの​​ために何が起こったのかがわかります。データベース内でもう一度試して、新しいクエリを開き、SQLの上に貼り付けて、次のように変更しました。

INSERT INTO TABLE(Sql)
VALUE('SELECT * FROM Sales WHERE SalesID = ''' + 'ABC123' + ''';')

期待どおりの結果が返ってきました。

 Output:
|Sql                                          |
|SELECT * FROM Sales WHERE SalesID = 'ABC123';|

しかし、私の .aspx.cs ページに戻ると、実行されたクエリを格納する文字列ビルダーがあり、実行する前にまずクエリを保存する必要があります。

For example:

System.Text.StringBuilder str = new System.Text.StringBuilder();
str.append("SELECT * FROM Sales WHERE SalesID = 'ABC123';");

api.LogGenerateReport(Convert.tostring(str));

引用のため、上記のようなエラーが返されます。

私はこれを克服するためにそれを理解しようとしています、そして私の考えは

String TempSql = Convert.tostring(str);
TempSql.Replace("'","+'''");

+記号が別の位置にあるため、機能しません。

これを克服する方法はありますか?

4

4 に答える 4

3

内容に関係なく、すべての SQL クエリを正常にログに記録するには、次の方法でパラメーター化されたコマンドを適用する必要があります。

using(var command = new SqlCommand(someSqlConnection))
{
   command.CommandText = "INSERT INTO TABLE(Sql) VALUE(@Sql)";
   command.Parameters.AddWithValue("@Sql", "<any string>");
   command.ExecuteNonQuery();
}

そうすれば、NON-STANDARDメソッドによるエスケープを回避し、SQL インジェクション攻撃からコードを保護できます。

于 2013-01-18T04:49:40.780 に答える
3
cmd.CommandType = CommandType.Text;
cmd.CommandText = @"SELECT * FROM Sales WHERE SalesID = @Param";
cmd.Parameters.Add("@Param", SqlDbType.Varchar).Value = 'ABC';

これを試して、パラメータ化されたものを使用することを強くお勧めします.SQLインジェクションやこれらの種類の問題をある程度処理します

于 2013-01-18T04:39:17.710 に答える
0

ステートメント内のすべての一重引用符を二重一重引用符で置き換えることができないのはなぜですか?このリクエストは正常に機能します。

INSERT INTO TABLE(Sql)
VALUE('SELECT * FROM Sales WHERE SalesID = ''ABC123'';')

そしてコード:

String TempSql = Convert.tostring(str);
TempSql.Replace("'","''");
于 2013-01-18T04:43:45.217 に答える
0

私の推測では、データベースに行を挿入するときにapi.LogGenerateReportが一重引用符をエスケープしていません。パラメータを使用して挿入ステートメントを修正する必要があります。

そのまま「機能」させるには、一重引用符を2つの一重引用符でエスケープする必要があります。変更してみてください:

"SELECT * FROM Sales WHERE SalesID = 'ABC123';"

"SELECT * FROM Sales WHERE SalesID = ''ABC123'';" <-- these are 2 single quotes, no double quotes

幸運を。

于 2013-01-18T04:43:54.280 に答える