SPに動的SQLが含まれる場合、Linqベースのストアドプロシージャコールでアポストロフィをエスケープする
-
06-07-2019 - |
質問
次のことに気付きました:
開発中のASP.NET MVC WebサイトにSQLエラー" Unclosed quote mark ..."が表示される動的SQLを含むストアドプロシージャに対してLINQ呼び出しを行うとき。
例:
SP GetEmployeesがパラメーター[filter_name]で呼び出され、値[n'for]がこのエラーをスローします
このように.replace(" '&quot ;,"' '")を実行することで問題を修正できます:
[Function(Name = "dbo.GetEmployees")]
public ISingleResult<EmployeeRow> GetEmployees(
[Parameter(DbType = "NVarChar(MAX)")] string filter_name)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), filter_name.Replace("'", "''"));
return ((ISingleResult<EmployeeRow>)(result.ReturnValue));
}
今、すべてのSPを行き来して、これを手動で行う気はありません。 これを現在のすべてのLinq SP呼び出しに適用する必要がある一般的なルールにする方法はありますか?
また、SQLインジェクション攻撃を防ぐために他に逃げるべきものはありますか?
編集:
追加された質問:これにより、動的SQLを含まないSPで問題が発生しますか? つまり、データベースにその名前を追加すると、[n''for]として保存されますか? これがおそらくそうだと気付いたので、とにかく手動でやらなければならない
解決 2
ここで、自分の質問に対して(可能性のある)回答をします。 (同意があればコメントで知らせてください)
これはSP内で処理されるべきであると思われます。 特定のSPに動的SQLが含まれているかどうかをアプリケーションで心配する必要はありません。
他のヒント
これが問題の原因であるため、動的SQLから離れることをお勧めします。 (しかし、これは他の多くの問題を引き起こす可能性があり、不可能かもしれないことを知っています。)
構築している動的SQLが安全であることを保証できない限り(したがって、ユーザーから何も渡されずにこのロジックを内部的に制御する)、それは問題になります。
filter_nameに\ 'または-が含まれているとどうなりますか?