Share via


DocumentDB で SQL のパラメーター化が可能に

このポストは、1 月 14 日に投稿された Announcing SQL Parameterization in DocumentDB の翻訳です。

このたび、Azure DocumentDB の REST API と SDK において、パラメーター化された SQL クエリがサポートされました。この機能により、ユーザーはパラメーター化された SQL クエリを利用できるようになります。SQL をパラメーター化すると、処理の信頼性が向上すると共にユーザーによる入力が不要になるため、「SQL インジェクション」による意図しないデータ漏洩を予防することができます*。

では、.NET SDK を使用したサンプルを見ていきましょう。単純な SQL 文字列と LINQ 式のほかに、新しい SqlQuerySpec クラスを付け加えています。このクラスを使用してパラメーター化されたクエリを作成します。
次のサンプルは、ユーザー指定のパラメーターが 1 つ存在する、“Books” コレクションに対するクエリのサンプルです。パラメーターで著者名を指定しています。

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

次の点にご注目ください。

  • DocumentDB の SQL パラメーターでは、T-SQL と同様の @ を使用する表記法が採用されています。
  • パラメーターの値には有効な任意の JSON 値 (文字列、数値、ブール値、null 値、配列、ネスト形式の JSON など) を使用できます。
  • DocumentDB ではスキーマを使用しないため、パラメーターは何らかの型として検証されることはありません。
  • SqlParameterCollection に SqlParameters を追加するだけで簡単にパラメーターを追加できます。

また、DocumentDB REST API ではネイティブにパラメーター化もサポートされます。次に示す .NET のサンプルでは、後続の REST API 呼び出しを変換しています。パラメーター化されたクエリを使用するには、次の例のように Content-Type Header を application/query+json と指定し、クエリを JSON の本文に記述します。

 POST https://contosomarketing.documents.azure.com/dbs/XP0mAA==/colls/XP0mAJ3H-AA=/docs
HTTP/1.1 x-ms-documentdb-isquery: True 
x-ms-date: Mon, 18 Aug 2014 13:05:49 GMT 
authorization: type%3dmaster%26ver%3d1.0%26sig%3dkOU%2bBn2vkvIlHypfE8AA5fulpn8zKjLwdrxBqyg0YGQ%3d 
x-ms-version: 2014-08-21 
Accept: application/json 
Content-Type: application/query+json 
Host: contosomarketing.documents.azure.com 
Content-Length: 50 
{      
    "query": "SELECT * FROM books b WHERE (b.Author.Name = @name)",     
    "parameters": [          
        {"name": "@name", "value": "Herman Melville"}         
    ] 
}

上記の方法を使用すると、ドキュメント コレクション以外に Databases、DocumentCollections、Attachments などのシステム メタデータ コレクションに対してもクエリを発行できます。この機能をお試しになる場合は、各プラットフォーム (.NET、Java、Node.js、JavaScript、Python) をサポートする最新バージョンの DocumentDB SDK をダウンロードしてください。

*DocumentDB では、クエリを厳密に読み取り専用として扱うため、「権限昇格」を引き起こすインジェクション攻撃については、ほとんどの場合影響を受けません。ただし、不正な SQL クエリが作成されると、同一コレクション内のアクセスが禁止されているデータにアクセスされる可能性があります。しかし、SQL をパラメーター化すると、この種の攻撃に対する堅牢性を高めることができます。