XML API
XML API は、request オブジェクトか ParameterValue プロパティのどちらかで getAsXmlContent() を呼び出した後に使用できます。
- getAsXmlContent() は、request オブジェクトまたは ParameterValue プロパティで呼び出します。これは、XMLContent 基底クラスの反復可能なオブジェクトを返します。
- getIterator() または getIterator(String xPath) は、XMLContent オブジェクトで呼び出します。これは、XML 要素の反復処理に使用できる XMLElementIterator オブジェクトを返します。
- hasNext() メソッドは、XMLElementIterator オブジェクトで別の要素が使用可能かどうかを判断するために呼び出します。
- next() は、XMLElementIterator オブジェクトで次の XML 要素を返すために呼び出します。next() を呼び出すには先に hasNext() を呼び出す必要があります。
- valueFor(String tableName, String fieldName) は、XML 要素で呼び出します。このメソッドは、この要素の値が指定したテーブルの指定したフィールドにマップされることをプロキシに通知します。プロキシは、フィールドを暗号化する必要があるかどうかを確認します。注:XML 要素で valueFor(String tableName, String fieldName) を呼び出す必要があるかどうかを判断するために、getName() メソッドを使用して要素の名前を返すことができます。
インスタンス上の既知のテーブルフィールドへのマッピング
この例では、インスタンス上で XML ペイロードが処理され、インシデント テーブルにレコードが挿入されます。説明フィールドには、インシデントの short_description が設定されます。
<data>
<record>
<name>'Test Record 1'</name>
<description>'Test Record 1 Description'</description>
<tag>critical</tag>
</record>
<record>
<name>'Test Record 2'</name>
<description>'Test Record 2 Description'</description>
<tag>security</tag>
</record>
</data>暗号化ルールの次のアクションを適用できます。
function sampleXmlAction1() {
var xmlContent = request.getAsXmlContent();
// This loop iterates over all description tags that match the given path
var xmlElementIterator = xmlContent.getIterator('data/record/description');
while (xmlElementIterator.hasNext()) {
var xmlElement = xmlElementIterator.next();
xmlElement.valueFor('incident', 'short_decription');
}
}このアクションは、description タグを反復処理し、値を暗号化してインスタンスの incident.short_description に挿入するようプロキシサーバーに指示します。
インスタンス上の未知のテーブルフィールドへのマッピング
この例では、ルールは record タグを反復処理しますが、record タグの中でどのようなタグが存在するのかはわかりません。わかっているのは、record タグ内のタグが、テーブルの URL パラメーターで指定された列の名前と一致する、ということだけです。
また、テーブルがインシデントの場合、ルールは description タグのデータを暗号化し、インスタンスの short_description フィールドに格納します。
function sampleXmlAction2() {
var xmlContent = request.getAsXmlContent();
var tableName = request.urlParam.table;
// This first iterator will iterate over all record elements
var xmlElementIterator = xmlContent.getIterator('data/record');
while (xmlElementIterator.hasNext()) {
encryptFieldsInRecord(xmlElementIterator.next());
}
}
function encryptFieldsInRecord(xmlElement) {
//Then, iterate over all tags representing fields in the table
var fieldIterator = xmlElement.getIteratorOverAllChildren();
while (fieldIterator.hasNext()) {
var field = fieldIterator.next();
var fieldName = childElement.getName();
//if table is incident, then description is encrypted for the short_description field
if (tableName == 'incident' && fieldName == 'description') {
field.valueFor(tableName, 'short_description');
} else {
//if table is not incident, ask the proxy to check if the given field is encrypted for the given table
field.valueFor(tableName, fieldName);
}
}
}encryptFieldsInRecord() 関数では、要求に基づいて動的に割り当てられるテーブルおよびフィールドで valueFor() メソッドを呼び出します。テーブル名とフィールド名は変化する可能性がありますが、その場合でもルールは、定義された暗号化設定に基づいてテーブル内のフィールドを暗号化する必要があるかどうかを確認するようプロキシに指示します。
フィールドが暗号化対象として設定されていない場合、またはタグがテーブルのフィールドと一致しない場合、プロキシはそのタグをスキップします。タグが暗号化対象としてマークされたフィールドに一致する場合、エッジ暗号化 プロキシサーバーは値を暗号化します。
エンコードされたクエリーの使用
この例では、すべてのタグに filter 属性があります。この属性は、エンコードされたクエリーがタグに含まれているかどうかを示します。
<data>
<record>
<name filter="false">'Test Record 1'</name>
<description filter="false">'Test Record 1 Description'</description>
<query filter="true">category=1^name=edge</query>
</record>
<record>
<name filter="false">'Test Record 2'</name>
<description filter="false">'Test Record 2 Description'</description>
<query filter="true">category=2^severity=3</query>
</record>
</data>暗号化ルールの次のアクションを適用できます。
function sampleXmlAction3() {
var xmlContent = request.getAsXmlContent();
var tableName = request.urlParam.table;
// This first iterator will iterate over all record elements
var xmlElementIterator = xmlContent.getIterator('data/record');
while (xmlElementIterator.hasNext()) {
encryptFieldsInRecord(xmlElementIterator.next());
}
}
function encryptFieldsInRecord(xmlElement) {
//this time we want to iterate over all tags representing fields in the table
var fieldIterator = xmlElement.getIteratorOverAllChildren();
while (fieldIterator.hasNext()) {
var field = fieldIterator.next();
var fieldname = childElement.getName();
//let's look at the filter attribute, if true, then encrypt as encoded query
if (field.getAttributeValue('filter') == 'true') {
field.encodedQueryFor(tableName);
} else {
//if it is false then check if the field should be encrypted
field.valueFor(tableName, fieldName);
}
}
}filter 属性の値が True の場合、ルールは、エンコードされたクエリーの値を暗号化するようプロキシサーバーに指示します。False の場合、ルールは、フィールドを暗号化する必要があるかどうかを確認するようプロキシに指示します。