System.Data.SQLite: «параметры не разрешены», как защититься от внедрения SQL? - PullRequest
0 голосов
/ 19 февраля 2019

Я пишу приложение C # с бэкэндом базы данных SQLite, используя System.Data.SQLite для взаимодействия с базой данных.

При попытке создать представление с использованием параметра я получил следующую ошибку:

Ошибка логики SQL

параметры не разрешены в представлениях

Как защитить код от внедрения SQL, если параметры не разрешены?

1 Ответ

0 голосов
/ 19 февраля 2019

Невозможно поместить параметры в определение представления:

CREATE TEMP VIEW mylog AS SELECT * FROM log WHERE user_id = ?; -- WRONG

Параметр должен быть фиксированной константой в SQL перед анализом SQL:

CREATE TEMP VIEW mylog AS SELECT * FROM log WHERE user_id = 1234; -- OK

Если вы это сделаетеэто зависит от вас, чтобы убедиться, что фиксированное значение является безопасным.В случае целого числа это довольно просто, просто приведите переменную как целое число, прежде чем форматировать ее в свой оператор SQL.Простое целое число не может вводить контент, вызывающий внедрение SQL.

int userid = 1234;

string s = String.Format(@"CREATE TEMP VIEW mylog AS 
    SELECT * FROM log WHERE user_id = {0}", userid);

Если перед синтаксическим анализом отформатировать целочисленное значение как числовой литерал в SQL, это не параметр, и он должен устранить полученную ошибку..

Кроме того, вы можете опустить условия в определении представления и заставить клиента указывать условия при запросе представления:

CREATE TEMP VIEW mylog AS SELECT * FROM log; -- OK

SELECT * FROM mylog WHERE user_id = ?; -- OK
...