7

如何避免 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 注入查询的标准示例。到目前为止,我还没有找到一种方法来参数化查询。

4

2 回答 2

10

更新:

很高兴地说,截至 2015 年 1 月 14 日 - DocumentDB确实支持 SQL 参数化。已在 .NET、Java、Node.js 和 Python SDK 以及 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 参数化……所以您需要清理输入以避免无意中暴露数据(例如,对于多租户应用程序)。

话虽如此...... DocumentDB SQL 注入攻击面相当有限 - 因为 DocumentDB SQL 仅支持只读查询。换句话说,您不必担心 DocumentDB 和 SQL 注入上下文中的无意写入/更新/删除。

于 2014-11-24T21:57:59.757 回答
4

要回答适用于存储过程 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){}
   );
}
于 2019-03-17T15:40:04.267 回答