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 をパラメーター化すると、この種の攻撃に対する堅牢性を高めることができます。