Вы можете использовать параметры БД только для замены параметров , т. Е. Вы не можете использовать их как замену свободного текста для генерации шаблона SQL, как пытаетесь это сделать.
Вам нужно будет включить в свой SQL viewName
, например:
db.ExecuteSql($"REFRESH MATERIALIZED VIEW {viewName};");
Хотя, если пользователь предоставил viewName
, вам нужно было бы защитить его от возможного внедрения SQL. Моя рекомендация - сверяться с белым списком разрешенных viewNames, например:
if (!AllowedViewNames.Contains(viewName))
throw new Exception("Invalid View");
В OrmLite вы можете экранировать строку с помощью GetQuotedValue()
API, например:
var quotedViewName = db.GetDialectProvider().GetQuotedValue(viewName);
Чтобы обнаружить недопустимые имена для символов, таких как имена представлений, вы можете использовать RegEx, чтобы разрешить только допустимые символы, например:
if (!new Regex(@"[^A-Za-z0-9_]").IsMatch(viewName))
throw new Exception("Invalid View");
Хотя метод расширения SqlVerifyFragment()
от OrmLite позволяет обнаруживать потенциально недопустимые инъекции SQL, если вы хотите принять фрагмент SQL, например:
db.ExecuteSql($"SELECT * FROM User WHERE {userSql.SqlVerifyFragment()}");
Где OrmLite выбросит ArgumentException
, если обнаружит потенциальное незаконное нарушение SQL.