FOR XML のセキュリティに関する問題 (SQLXML 4.0)
FOR XML AUTO モードでは、XML 階層が生成され、要素名はテーブル名に、属性名は列名にマップされます。この場合、データベースのテーブルと列の情報が公開されます。AUTO モード (サーバー側の書式設定) を使用する場合は、テーブルと列の別名をクエリで指定することで、データベース情報を隠すことができます。これらの別名は、結果の XML ドキュメント内に要素名および属性名として返されます。
たとえば、次のクエリでは AUTO モードを指定しており、XML の書式設定はサーバーで実行されます。
SELECT C.FirstName as F,C.LastName as L
FROM Person.Contact C
FOR XML AUTO
結果の XML ドキュメントでは、要素名と属性名に別名が使用されます。
<?xml version="1.0" encoding="utf-8" ?>
<root>
<C F="Nancy" L="Fuller" />
<CE F="Andrew" L="Peacock" />
<C F="Janet" L="Leverling" />
...
</root>
NESTED モード (クライアント側の書式設定) を使用する場合、結果の XML ドキュメントでは、別名が属性にのみ返され、ベース テーブルの名前が常に要素名として返されます。たとえば、次のクエリでは NESTED モードを指定しています。
SELECT C.FirstName as F,C.LastName as L
FROM Person.Contact C
FOR XML AUTO
結果の XML ドキュメントでは、ベース テーブルの名前が要素名として返され、テーブルの別名は使用されません。
<?xml version="1.0" encoding="utf-8" ?>
<root>
<Person.Contact F="Nancy" L="Fuller" />
<Person.Contact F="Andrew" L="Peacock" />
<Person.Contact F="Janet" L="Leverling" />
...
</root>