Передать параметры в ExecuteSql () - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь передать имя таблицы в качестве параметра методу ExecuteSql().

Вот что я пробовал:

        var viewName = "search_view";

        using (var db = dbFactory.Open())
        {
            db.ExecuteSql("REFRESH MATERIALIZED VIEW @viewName;", new { viewName });
        }

Не работает, создается исключение с сообщением:

Npgsql.PostgresException

42601: синтаксическая ошибка на уровне или около $ 1

Я включил ведение журнала, чтобы попытаться увидеть, какой SQL генерируется, но я думаю, что из-за исключения запрос не регистрируется.

Запрос выполняется нормально, когда он весь текст, что я делаю неправильно, передавая имя таблицы в качестве параметра?

1 Ответ

0 голосов
/ 01 сентября 2018

Вы можете использовать параметры БД только для замены параметров , т. Е. Вы не можете использовать их как замену свободного текста для генерации шаблона 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.

...