Предотвращение внедрения SQL в хранимые процедуры Azure DocumentDB

Как избежать sql-инъекции хранимых процедур Azure DocumentDB?

Помимо дезинфекции ввода (символы из белого списка), что здесь лучше всего?

Возьмем, к примеру, следующую хранимую процедуру, адаптированную из примера MSDN:

function simple_sp(s1) {
   var context = getContext();
   var collection = context.getCollection();
   var response = context.getResponse();

   collection.queryDocuments(collection.getSelfLink(), 
      'SELECT * FROM Families f where f.id  = "' + s1 + '"', {}, 
      function(res){}
   );
}

Этот параметр s1 является стандартным примером внедрения sql в запрос. Пока я также не нашел способа параметризовать запрос.


person Alex Duggleby    schedule 23.11.2014    source источник


Ответы (2)


Обновление:

Рад сообщить, что по состоянию на 14 января 2015 года DocumentDB действительно поддерживает параметризацию SQL. Добавлена ​​поддержка в SDK для .NET, Java, Node.js и Python, а также в REST API. Наслаждайтесь =)

Вот пример использования .NET SDK:

IQueryable<Book> queryable = client.CreateDocumentQuery<Book>(collectionSelfLink, new SqlQuerySpec { 
                    QueryText = "SELECT * FROM books b WHERE (b.Author.Name = @name)", 
                    Parameters = new SqlParameterCollection()  { 
                          new SqlParameter("@name", "Herman Melville") 
                     } 
});

Исходный ответ

DocumentDB пока не поддерживает параметризацию SQL... поэтому вам нужно очистить свои входные данные, чтобы избежать непреднамеренного раскрытия данных при чтении (например, для мультитенантных приложений).

При этом... область атаки SQL-инъекций DocumentDB довольно ограничена, поскольку DocumentDB SQL поддерживает только запросы только для чтения. Другими словами, вам не нужно беспокоиться о непреднамеренной записи/обновлении/удалении в контексте DocumentDB и внедрения SQL.

person Andrew Liu    schedule 24.11.2014

Чтобы ответить на вопрос, относящийся к файлу JavaScript хранимой процедуры:

function simple_sp(s1) {
   var context = getContext();
   var collection = context.getCollection();
   var response = context.getResponse();

   var query = { query: "select * from Families f where f.id = @id", parameters: [{ name: "@id", value: id }] };

   collection.queryDocuments(collection.getSelfLink(), 
      query, {}, 
      function(res){}
   );
}
person Jazaret    schedule 17.03.2019