XML API
XML API는 요청 객체 또는 ParameterValue 속성에서 getAsXmlContent()를 호출한 후에 사용할 수 있습니다.
- 요청 객체 또는 ParameterValue 속성에서 getAsXmlContent()를 호출합니다. 이것은 XMLContent 하부 클래스의 이터러블 객체를 반환합니다.
- XMLContent 객체에서 getIterator() 또는 getIterator(String xPath)를 호출합니다. 그러면 XML 요소를 반복하는 데 사용할 수 있는 XMLElementIterator 개체가 반환됩니다.
- XMLElementIterator 객체에서 hasNext() 메서드를 호출하여 다른 요소를 사용할 수 있는지 여부를 확인합니다.
- 다음 XML 요소를 반환하려면 XMLElementIterator 객체에서 next()를 호출합니다. hasNext()를 먼저 호출하지 않고는 next()를 호출할 수 없습니다.
- XML 요소에서 valueFor(String tableName, String fieldName) 를 호출합니다. 이 메서드는 이 요소의 값이 지정된 테이블의 지정된 필드에 매핑됨을 프록시에 알려 줍니다. 그런 다음 프록시는 필드를 암호화해야 하는지 확인합니다.주: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 태그 내의 태그가 table 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);
}
}
}필터 속성 값이 true이면 규칙은 프록시 서버에 인코딩된 쿼리의 값을 암호화하도록 요청합니다. false인 경우 규칙은 프록시에 필드를 암호화해야 하는지 여부를 확인하도록 요청합니다.