Имя столбца в SQL-запросе из запроса - PullRequest
0 голосов
/ 21 ноября 2018

Мне было дано задание переписать старый веб-API.

Этот API-интерфейс считывает запросы SQL из базы данных.

В буквальном смысле есть представление "Запросы" в имени, которое содержит "SqlText "column.

SELECT SqlText FROM Queries WHERE QueryID = 123

" SqlText "содержит только простые SQL-запросы в формате SELECT [columns] FROM [table] по соглашению.

Запрос изменяется в зависимости от параметров URL-адреса в запросе.Результат этого запроса затем отображается как результат.

string parsedColumns = ParseColumns(queryRow); //contains "Column1, Column2";
string parsedTable = ParseTable(queryRow); //contains "SomeTable"

string requestColumns = HttpContext.Request["columns"];
string sqlColumns = requestColumns ?? parsedColumns;

string col1Condition = HttpContext.Request["Column1"]
string col2Condition = HttpContext.Request["Column2"]

string sqlQuery = "SELECT " + sqlColumns 
                  + " FROM " + parsedTable 
                  + " WHERE Column1 = " + col1Condition 
                  + " AND Column2 = " + col2Condition;

Это очевидная проблема внедрения SQL, поэтому я начал переписывать его.

Теперь есть еще три проблемы.

  • Я не могу изменить структуру базы данных или соглашение
  • База данных - Oracle или SQL Server
  • Я не знаю, как правильно работать с URL-адресом столбцовпараметр, чтобы избежать внедрения SQL.

Параметры URL в предложении WHERE легко преобразовать в параметры SQL как для SQL Server, так и для Oracle.

SQL Server

var sqlCommand = new SqlCommand("SELECT * FROM SomeTable WHERE Condition1 = @con1 AND Condition2 = @con2");

Oracle

var oracleCommand = new OracleCommand("SELECT * FROM SomeTable WHERE Condition1 = :con1 AND Condition2 = :con2");

Идентификаторы столбцов

Проблема с HttpContext.Request["columns"].Мне все еще нужно как-то изменить строку SQL-запроса с параметрами URL, которые мне совсем не нравятся.

Чтобы упростить проблему, давайте рассмотрим один столбец из запроса URL.

string column = HttpContext.Request["column"];
var cmd = new SqlCommand($"SELECT {column} FROM ...");

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

string column = HttpContext.Request["column"];
column = column.Replace("[", "").Replace("]", "");
column = $"[{column}]";
var cmd = new SqlCommand($"SELECT {column} FROM ...");

Oracle использует кавычки.

string column = HttpContext.Request["column"];
column = column.Replace("\"", "");
column = $"\"{column}\"";
var cmd = new OracleCommand($"SELECT {column} FROM ...");

Вопрос

  • Достаточно ли безопасен этот sql-впрыск?
  • Или этот вариант использования по своей сути небезопасен для sql-впрыска?

1 Ответ

0 голосов
/ 21 ноября 2018

Поскольку вы работаете с базовым дизайном программы, вы не можете ничего изменить, просто пытаясь добавить изменения во входные данные для поиска элементов инъекции.Например, если вход является именем столбца, он должен иметь максимальную длину 30 (до 12.x) символов и не должен содержать точку с запятой или строки «ИЛИ» или «И» в них.Хотя это и не идеальное решение, это должно быть практическим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...