JSON API
JSON API は、request オブジェクトか ParameterValue プロパティのどちらかで getAsJsonContent() を呼び出した後に使用できます。
- getAsJsonContent() は、request オブジェクトで呼び出します。これは、JsonNode 基底クラスの反復可能なオブジェクトを返します。
- iterator() または getIterator(String xPath) は、JsonNode オブジェクトで呼び出します。これは、JSON オブジェクトのノードの反復処理に使用できる JsonNodeIterator オブジェクトを返します。
- hasNext() メソッドは、JsonNodeIterator オブジェクトで別の要素が使用可能かどうかを判断するために呼び出します。
- next() は、JsonNodeIterator オブジェクトで次の JSON 要素を返すために呼び出します。next() を呼び出すには先に hasNext() を呼び出す必要があります。
- valueFor(String tableName, String fieldName) は、JSON 要素で呼び出します。このメソッドは、この要素の値が指定したテーブルの指定したフィールドにマップされることをプロキシに通知します。プロキシは、フィールドを暗号化する必要があるかどうかを確認します。注:JSON 要素で valueFor(String tableName, String fieldName) を呼び出す必要があるかどうかを判断するために、getName() メソッドを使用して要素の名前を返すことができます。
インスタンス上の既知のテーブルフィールドへのマッピング
この例では、インスタンス上で JSON ペイロードが処理され、インシデント テーブルにレコードが挿入されます。説明フィールドには、インシデントの short_description が設定されます。
{
data: {
records: [
{
"name": "Test Record 1",
"description": "Test Record 1 Description",
"tag": "security"
},
{
"name": "Test Record 1",
"description": "Test Record 1 Description",
"tag": "security"
}],
"query": "assigned_to=3D4860165813e63a00d00abd322244b092^category=vulnerability"
},
"source": "10.11.13.14"
}次のルールを適用できます。
function sampleJsonAction1() {
var jsonContent = request.getAsJsonContent();
// This loop iterates over all description elements in the records array
var jsonNodeIterator = jsonContent.getIterator(’/data/records/description’);
while (jsonNodeIterator.hasNext()) {
var jsonNode = jsonNodeIterator.next();
jsonNode.valueFor('incident', 'short_decription');
}
}
このアクションは、description ノードを反復処理し、値を暗号化してインスタンスの incident.short_description に挿入するようプロキシサーバーに指示します。
インスタンス上の未知のテーブルフィールドへのマッピング
この例では、ルールは records を反復処理しますが、どのノードを想定するかはわかりません。わかっているのは、records 内の各オブジェクトについて、ノードがテーブルの URL パラメーターで指定された列の名前と一致する、ということだけです。
また、テーブルがインシデントの場合、ルールは description ノードのデータを暗号化し、インスタンスの short_description フィールドに格納します。
function sampleJsonAction2() {
var jsonContent = request.getAsJsonContent();
var tableName = request.urlParam.table;
// This first iterator will iterate over all record elements
var jsonNodeIterator = jsonContent.getIterator('data/records');
while (jsonNodeIterator.hasNext()) {
encryptFieldsInRecord(jsonNodeIterator.next());
}
}
function encryptFieldsInRecord(jsonNode) {
//this time we want to iterate over all nodes
var fieldIterator = jsonNode.iterator();
while (fieldIterator.hasNext()) {
var field = fieldIterator.next();
var fieldname = childElement.getName();
if (fieldName == 'description') {
field.valueFor(tableName, 'short_description');
} else {
field.valueFor(tableName, fieldName);
}
}
}encryptFieldsInRecord() 関数では、要求に基づいて動的に割り当てられるテーブルおよびフィールドで valueFor() メソッドを呼び出します。テーブル名とフィールド名は変化する可能性がありますが、その場合でもルールは、定義された暗号化設定に基づいてテーブル内のフィールドを暗号化する必要があるかどうかを確認するようプロキシに指示します。
フィールドが暗号化対象として設定されていない場合、またはノードがテーブルのフィールドと一致しない場合、プロキシはそのノードをスキップします。ノード名が暗号化対象としてマークされたフィールドに一致する場合、プロキシは値を暗号化します。
エンコードされたクエリーの使用
function sampleJsonAction3() {
var jsonContent = request.getAsJsonContent();
var tableName = request.urlParam.table;
// This first iterator will iterate over all record elements
var jsonNodeIterator = jsonContent.getIterator('data');
while (jsonNodeIterator.hasNext()) {
var jsonNode = jsonNodeIterator.next();
if (jsonNode.getName() == 'records')
encryptRecors(jsonNodeIterator.next());
else if (jsonNode.getName() == 'query')
jsonNode.encodedQueryFor(tableName);
}
}
function encryptRecords(jsonNode) {
//we iterate over all fields in the node
var recordIterator = jsonNode.iterator();
while (recordIterator.hasNext()) {
encryptFieldsInRecord(recordIterator.next());
}
}
function encryptFieldsInRecord(jsonNode) {
//this time we want to iterate over all nodes
var fieldIterator = jsonNode.iterator();
while (fieldIterator.hasNext()) {
var field = fieldIterator.next();
var fieldname = childElement.getName();
field.valueFor(tableName, fieldName);
}
}この例では、ルールは data を反復処理します。records を見つけるたびに、ルールは、2 つ目の例と同じロジックを実行して、各ノードのフィールドを反復処理します。query ノードを見つけると、encodedQueryFor() を呼び出して、クエリーで暗号化する必要がある値を暗号化します。