계: Input Validation and Representation

입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "Buffer Overflows", "Cross-Site Scripting" 공격, "SQL Injection", 그 외 여러 가지가 있습니다.

JSON Injection

Abstract
메서드는 확인되지 않은 입력을 JSON에 작성합니다. 이 호출로 공격자는 JSON 엔터티에 임의의 요소나 속성을 삽입할 수 있습니다.
Explanation
JSON injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.


2. JSON 스트림에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 JSON을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터 저장에 사용될 때 JSON은 주로 캐시된 데이터와 같이 취급되며 민감한 정보를 포함할 수 있습니다. 메시지 전송에 사용될 때 JSON은 주로 RESTful 서비스와 함께 사용되며 인증 자격 증명과 같은 민감한 정보를 전송하는 데 사용될 수 있습니다.

JSON 문서와 메시지의 의미는 응용 프로그램이 확인되지 않은 입력에서 JSON을 구성하는 경우 변경될 수 있습니다. 상대적으로 양호한 경우 공격자는 JSON 문서 또는 요청을 구문 분석하는 동안 응용 프로그램이 예외 사항을 발생시키도록 하는 관련 없는 요소를 삽입할 수도 있습니다. 좀 더 심각한 경우 JSON Injection과 관련된 것과 같이 공격자는 JSON 문서 또는 요청 내에서 주요 비즈니스 값의 예측 가능한 조작을 허용하는 관련 없는 요소를 삽입할 수도 있습니다. JSON Injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1: 다음 C# 코드는 JSON.NET을 사용하여 사용자 제어 입력 변수 usernamepassword에서 C:\user_info.json에 있는 JSON 파일로 권한 없는 사용자("관리자" 역할이 있는 권한 사용자와 반대로 "기본" 역할이 있는 사용자)에 대한 사용자 계정 인증 정보를 직렬화합니다.


...

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);

using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;

writer.WriteStartObject();

writer.WritePropertyName("role");
writer.WriteRawValue("\"default\"");

writer.WritePropertyName("username");
writer.WriteRawValue("\"" + username + "\"");

writer.WritePropertyName("password");
writer.WriteRawValue("\"" + password + "\"");

writer.WriteEndObject();
}

File.WriteAllText(@"C:\user_info.json", sb.ToString());


하지만 JSON 직렬화는 JsonWriter.WriteRawValue()를 사용하여 수행되므로 usernamepassword에서 신뢰하지 않는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 인증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입하여 직렬화된 JSON 구조를 변경할 수 있습니다. 이 예제에서 암호 Evil123!를 사용하는 권한 없는 사용자 malloryusername 변수 값을 설정하는 프롬프트에 입력 시 ","role":"admin을 사용자 이름에 추가한 경우 C:\user_info.json에 저장된 결과 JSON은 다음과 같습니다.


{
"role":"default",
"username":"mallory",
"role":"admin",
"password":"Evil123!"
}


이 직렬화된 JSON 파일이 JsonConvert.DeserializeObject()Dictionary 개체에 병렬화된 경우 다음과 같습니다.


String jsonString = File.ReadAllText(@"C:\user_info.json");

Dictionary<string, string> userInfo = JsonConvert.DeserializeObject<Dictionary<string, strin>>(jsonString);
Dictionary 개체에 있는 username, passwordrole 키의 결과 값은 각각 mallory, Evil123!admin입니다. 병렬화된 JSON 값이 유효하다는 추가 확인이 없으면 응용 프로그램이 사용자 mallory "관리자" 권한을 잘못 할당합니다.
desc.dataflow.dotnet.json_injection
Abstract
메서드는 확인되지 않은 입력을 JSON에 작성합니다. 그러면 공격자가 JSON 엔터티에 임의의 요소나 속성을 삽입할 수 있습니다.
Explanation
JSON injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스의 데이터가 프로그램에 입력됩니다.


2. JSON 스트림에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 JSON을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터 저장에 사용될 때 JSON은 주로 캐시된 데이터와 같이 취급되며 중요한 정보를 포함할 수 있습니다. 메시지 전송에 사용될 때 JSON은 주로 RESTful 서비스와 함께 사용되며 인증 자격 증명과 같은 중요한 정보를 전송할 수 있습니다.

응용 프로그램이 확인되지 않은 입력에서 JSON을 생성하는 경우 공격자가 JSON 문서와 메시지의 의미를 변경할 수 있습니다. 상대적으로 양호한 경우 공격자는 JSON 문서 또는 요청을 구문 분석하는 동안 응용 프로그램이 예외 사항을 발생시키도록 하는 관련 없는 요소를 삽입할 수도 있습니다. JSON injection이 진행되는 등의 좀 더 심각한 경우 공격자는 JSON 문서 또는 요청 내에서 주요 비즈니스 값의 예측 가능한 조작을 허용하는 관련 없는 요소를 삽입할 수도 있습니다. JSON injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1: 다음 코드는 사용자 제어 입력 변수 usernamepassword부터 ~/user_info.json에 있는 JSON 파일까지 권한 없는 사용자("관리자" 역할이 있는 권한 사용자가 아닌 "기본" 역할이 있는 사용자)를 위한 사용자 계정 인증 정보를 직렬화합니다.


...
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
username := r.FormValue("username")
password := r.FormValue("password")
...
jsonString := `{
"username":"` + username + `",
"role":"default"
"password":"` + password + `",
}`
...
f, err := os.Create("~/user_info.json")
defer f.Close()

jsonEncoder := json.NewEncoder(f)
jsonEncoder.Encode(jsonString)
}


이 코드는 문자열 연결을 사용하여 JSON 직렬화를 수행하므로 usernamepassword에서 신뢰할 수 없는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 인증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입할 수 있으며, 그러면 직렬화된 JSON 구조가 변경될 수 있습니다. 이 예제에서 암호 Evil123!를 사용하는 권한 없는 사용자 mallory가 사용자 이름을 입력할 때 ","role":"admin을 추가하면 ~/user_info.json에 저장되는 결과 JSON은 다음과 같습니다.


{
"username":"mallory",
"role":"default",
"password":"Evil123!",
"role":"admin"
}

병렬화된 JSON 값이 유효하다는 추가 확인이 없으면 응용 프로그램이 사용자 mallory "관리자" 권한을 예기치 않게 할당합니다.
desc.dataflow.golang.json_injection
Abstract
메서드는 확인되지 않은 입력을 JSON에 작성합니다. 이 호출로 공격자는 JSON 엔터티에 임의의 요소나 속성을 삽입할 수 있습니다.
Explanation
JSON injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.


2. JSON 스트림에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 JSON을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터 저장에 사용될 때 JSON은 주로 캐시된 데이터와 같이 취급되며 민감한 정보를 포함할 수 있습니다. 메시지 전송에 사용될 때 JSON은 주로 RESTful 서비스와 함께 사용되며 인증 자격 증명과 같은 민감한 정보를 전송하는 데 사용될 수 있습니다.

JSON 문서와 메시지의 의미는 응용 프로그램이 확인되지 않은 입력에서 JSON을 구성하는 경우 변경될 수 있습니다. 상대적으로 양호한 경우 공격자는 JSON 문서 또는 요청을 구문 분석하는 동안 응용 프로그램이 예외 사항을 발생시키도록 하는 관련 없는 요소를 삽입할 수도 있습니다. 좀 더 심각한 경우 JSON Injection과 관련된 것과 같이 공격자는 JSON 문서 또는 요청 내에서 주요 비즈니스 값의 예측 가능한 조작을 허용하는 관련 없는 요소를 삽입할 수도 있습니다. JSON Injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1: 다음 Java 코드는 Jackson을 사용하여 사용자 제어 입력 변수 usernamepassword에서 ~/user_info.json에 있는 JSON 파일로 권한 없는 사용자("관리자" 역할이 있는 권한 사용자와 반대로 "기본" 역할이 있는 사용자)에 대한 사용자 계정 인증 정보를 직렬화합니다.


...

JsonFactory jfactory = new JsonFactory();

JsonGenerator jGenerator = jfactory.createJsonGenerator(new File("~/user_info.json"), JsonEncoding.UTF8);

jGenerator.writeStartObject();

jGenerator.writeFieldName("username");
jGenerator.writeRawValue("\"" + username + "\"");

jGenerator.writeFieldName("password");
jGenerator.writeRawValue("\"" + password + "\"");

jGenerator.writeFieldName("role");
jGenerator.writeRawValue("\"default\"");

jGenerator.writeEndObject();

jGenerator.close();


하지만 JSON 직렬화는 JsonGenerator.writeRawValue()를 사용하여 수행되므로 usernamepassword에서 신뢰하지 않는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 인증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입하여 직렬화된 JSON 구조를 변경할 수 있습니다. 이 예제에서 암호 Evil123!를 사용하는 권한 없는 사용자 malloryusername 변수 값을 설정하는 프롬프트에 입력 시 ","role":"admin을 사용자 이름에 추가한 경우 ~/user_info.json에 저장된 결과 JSON은 다음과 같습니다.


{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}


이 직렬화된 JSON 파일이 Jackson의 JsonParserHashMap 개체에 병렬화된 경우 다음과 같습니다.


JsonParser jParser = jfactory.createJsonParser(new File("~/user_info.json"));

while (jParser.nextToken() != JsonToken.END_OBJECT) {

String fieldname = jParser.getCurrentName();

if ("username".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}

if ("password".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}

if ("role".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}

if (userInfo.size() == 3)
break;
}

jParser.close();
HashMap 개체에 있는 username, passwordrole 키의 결과 값은 각각 mallory, Evil123!admin입니다. 병렬화된 JSON 값이 유효하다는 추가 확인이 없으면 응용 프로그램이 사용자 mallory "관리자" 권한을 잘못 할당합니다.
desc.dataflow.java.json_injection
Abstract
메서드는 확인되지 않은 입력을 JSON에 작성합니다. 이 호출로 공격자는 JSON 엔터티에 임의의 요소나 속성을 삽입할 수 있습니다.
Explanation
JSON injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.


2. JSON 스트림에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 JSON을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터 저장에 사용될 때 JSON은 주로 캐시된 데이터와 같이 취급되며 민감한 정보를 포함할 수 있습니다. 메시지 전송에 사용될 때 JSON은 주로 RESTful 서비스와 함께 사용되며 인증 자격 증명과 같은 민감한 정보를 전송하는 데 사용될 수 있습니다.

JSON 문서와 메시지의 의미는 응용 프로그램이 확인되지 않은 입력에서 JSON을 구성하는 경우 변경될 수 있습니다. 상대적으로 양호한 경우 공격자는 JSON 문서 또는 요청을 구문 분석하는 동안 응용 프로그램이 예외 사항을 발생시키도록 하는 관련 없는 요소를 삽입할 수도 있습니다. 좀 더 심각한 경우 JSON Injection과 관련된 것과 같이 공격자는 JSON 문서 또는 요청 내에서 주요 비즈니스 값의 예측 가능한 조작을 허용하는 관련 없는 요소를 삽입할 수도 있습니다. JSON Injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1: 다음 JavaScript 코드는 jQuery를 사용하여 값을 URL에서 가져오는 JSON을 구문 분석합니다.


var str = document.URL;
var url_check = str.indexOf('name=');
var name = null;
if (url_check > -1) {
name = decodeURIComponent(str.substring((url_check+5), str.length));
}

$(document).ready(function(){
if (name !== null){
var obj = jQuery.parseJSON('{"role": "user", "name" : "' + name + '"}');
...
}
...
});


여기서 name의 신뢰할 수 없는 데이터는 JSON 관련 특수 문자를 이스케이프하도록 검증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입하여 직렬화된 JSON 구조를 변경할 수 있습니다. 이 예제에서 권한 없는 사용자 mallory가 URL의 이름 매개 변수에 ","role":"admin를 추가한 경우 JSON은 다음이 됩니다.


{
"role":"user",
"username":"mallory",
"role":"admin"
}


이는 jQuery.parseJSON()에 의해 구문 분석되고 일반 개체로 설정됩니다. 이는 obj.role이 이제 "user" 대신 "admin"를 반환함을 의미합니다.
desc.dataflow.javascript.json_injection
Abstract
메서드는 확인되지 않은 입력을 JSON에 작성합니다. 이 호출로 공격자는 JSON 엔터티에 임의의 요소나 속성을 삽입할 수 있습니다.
Explanation
JSON injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.


2. JSON 스트림에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 JSON을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터 저장에 사용될 때 JSON은 주로 캐시된 데이터와 같이 취급되며 민감한 정보를 포함할 수 있습니다. 메시지 전송에 사용될 때 JSON은 주로 RESTful 서비스와 함께 사용되며 인증 자격 증명과 같은 민감한 정보를 전송하는 데 사용될 수 있습니다.

JSON 문서와 메시지의 의미는 응용 프로그램이 확인되지 않은 입력에서 JSON을 구성하는 경우 변경될 수 있습니다. 상대적으로 양호한 경우 공격자는 JSON 문서 또는 요청을 구문 분석하는 동안 응용 프로그램이 예외 사항을 발생시키도록 하는 관련 없는 요소를 삽입할 수도 있습니다. 좀 더 심각한 경우 JSON Injection과 관련된 것과 같이 공격자는 JSON 문서 또는 요청 내에서 주요 비즈니스 값의 예측 가능한 조작을 허용하는 관련 없는 요소를 삽입할 수도 있습니다. JSON Injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1: 다음 Objective-C 코드는 사용자 제어 가능 필드 _usernameField_passwordField에서 JSON으로 권한 없는 사용자("관리자" 역할이 있는 권한 사용자와 반대로 "기본" 역할이 있는 사용자)에 대한 사용자 계정 인증 정보를 직렬화합니다.


...

NSString * const jsonString = [NSString stringWithFormat: @"{\"username\":\"%@\",\"password\":\"%@\",\"role\":\"default\"}" _usernameField.text, _passwordField.text];


하지만 JSON 직렬화는 NSString.stringWithFormat:를 사용하여 수행되므로 _usernameField_passwordField에서 신뢰하지 않는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 인증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입하여 직렬화된 JSON 구조를 변경할 수 있습니다. 이 예제에서 암호 Evil123!를 사용하는 권한 없는 사용자 mallory_usernameField 필드에 입력 시 ","role":"admin을 사용자 이름에 추가한 경우 그 결과 JSON은 다음과 같습니다.


{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}


이 직렬화된 JSON 문자열이 NSJSONSerialization.JSONObjectWithData:NSDictionary 개체에 병렬화된 경우 다음과 같습니다.


NSError *error;
NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];
NSDictionary 개체에 있는 username, passwordrole의 결과 값은 각각 mallory, Evil123!admin입니다. 병렬화된 JSON 값이 유효하다는 추가 확인이 없으면 응용 프로그램이 사용자 mallory "관리자" 권한을 잘못 할당합니다.
desc.dataflow.objc.json_injection
Abstract
이 메서드는 확인되지 않은 입력을 JSON에 작성합니다. 이 호출로 공격자는 JSON 엔티티에 임의의 요소나 속성을 삽입할 수 있습니다.
Explanation
JSON injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스의 데이터가 프로그램에 입력됩니다.


2. JSON 스트림에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 JSON을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터 저장에 사용될 때 JSON은 주로 캐시된 데이터와 같이 취급되며 중요한 정보를 포함할 수 있습니다. 메시지 전송에 사용될 때 JSON은 주로 RESTful 서비스와 함께 사용되며 인증 자격 증명과 같은 중요한 정보를 전송할 수 있습니다.

응용 프로그램이 확인되지 않은 입력에서 JSON을 생성하는 경우, JSON 문서 및 메시지의 의미를 변경할 수 있습니다. 상대적으로 양호한 경우 공격자는 JSON 문서 또는 요청을 구문 분석하는 동안 응용 프로그램이 예외를 발생시키도록 하는 관련 없는 요소를 삽입할 수도 있습니다. JSON 삽입이 진행되는 등의 좀 더 심각한 경우 공격자는 JSON 문서 또는 요청 내에서 주요 비즈니스 값의 예측 가능한 조작을 허용하는 관련 없는 요소를 삽입할 수도 있습니다. JSON 삽입이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제: 다음 Python 코드는 URL에서 가져온 신뢰할 수 없는 값으로 json 파일을 업데이트합니다.


import json
import requests
from urllib.parse import urlparse
from urllib.parse import parse_qs

url = 'https://www.example.com/some_path?name=some_value'
parsed_url = urlparse(url)
untrusted_values = parse_qs(parsed_url.query)['name'][0]

with open('data.json', 'r') as json_File:
data = json.load(json_File)

data['name']= untrusted_values

with open('data.json', 'w') as json_File:
json.dump(data, json_File)

...


여기서 name의 신뢰할 수 없는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 검증되지 않습니다. 따라서 사용자는 JSON 키를 임의로 삽입할 수 있으며 결과적으로 직렬화된 JSON의 구조가 변경될 수 있습니다. 이 예에서 권한이 없는 사용자 mallory가 URL의 name 매개 변수에 ","role":"admin을 추가하면 JSON은 다음과 같습니다.


{
"role":"user",
"username":"mallory",
"role":"admin"
}

이제 JSON 파일은 악성 데이터로 변조되었으며 사용자는 "user" 대신 "admin" 액세스 권한을 가집니다.
desc.dataflow.python.json_injection
Abstract
메서드는 확인되지 않은 입력을 JSON에 작성합니다. 이 호출로 공격자는 JSON 엔터티에 임의의 요소나 속성을 삽입할 수 있습니다.
Explanation
JSON injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.


2. JSON 스트림에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 JSON을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터 저장에 사용될 때 JSON은 주로 캐시된 데이터와 같이 취급되며 중요한 정보를 포함할 수 있습니다. 메시지 전송에 사용될 때 JSON은 주로 RESTful 서비스와 함께 사용되며 인증 자격 증명과 같은 중요한 정보를 전송하는 데 사용될 수 있습니다.

JSON 문서와 메시지의 의미는 응용 프로그램이 확인되지 않은 입력에서 JSON을 구성하는 경우 변경될 수 있습니다. 상대적으로 양호한 경우 공격자는 JSON 문서 또는 요청을 구문 분석하는 동안 응용 프로그램이 예외 사항을 발생시키도록 하는 관련 없는 요소를 삽입할 수도 있습니다. 좀 더 심각한 경우 JSON Injection과 관련된 것과 같이 공격자는 JSON 문서 또는 요청 내에서 주요 비즈니스 값의 예측 가능한 조작을 허용하는 관련 없는 요소를 삽입할 수도 있습니다. JSON Injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.
desc.dataflow.scala.json_injection
Abstract
메서드는 확인되지 않은 입력을 JSON에 작성합니다. 이 호출로 공격자는 JSON 엔터티에 임의의 요소나 속성을 삽입할 수 있습니다.
Explanation
JSON injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.


2. JSON 스트림에 데이터가 작성됩니다.

일반적으로 응용 프로그램은 JSON을 사용하여 데이터를 저장하거나 메시지를 전송합니다. 데이터 저장에 사용될 때 JSON은 주로 캐시된 데이터와 같이 취급되며 민감한 정보를 포함할 수 있습니다. 메시지 전송에 사용될 때 JSON은 주로 RESTful 서비스와 함께 사용되며 인증 자격 증명과 같은 민감한 정보를 전송하는 데 사용될 수 있습니다.

JSON 문서와 메시지의 의미는 응용 프로그램이 확인되지 않은 입력에서 JSON을 구성하는 경우 변경될 수 있습니다. 상대적으로 양호한 경우 공격자는 JSON 문서 또는 요청을 구문 분석하는 동안 응용 프로그램이 예외 사항을 발생시키도록 하는 관련 없는 요소를 삽입할 수도 있습니다. 좀 더 심각한 경우 JSON Injection과 관련된 것과 같이 공격자는 JSON 문서 또는 요청 내에서 주요 비즈니스 값의 예측 가능한 조작을 허용하는 관련 없는 요소를 삽입할 수도 있습니다. JSON Injection이 Cross-Site Scripting 또는 Dynamic Code Evaluation을 유발하는 경우도 있습니다.

예제 1: 다음 Swift 코드는 사용자 제어 가능 필드 usernameFieldpasswordField에서 권한 없는 사용자("관리자" 역할이 있는 권한 사용자와 반대로 "기본" 역할이 있는 사용자)에 대한 사용자 계정 인증 정보를 JSON으로 직렬화합니다.


...
let jsonString : String = "{\"username\":\"\(usernameField.text)\",\"password\":\"\(passwordField.text)\",\"role\":\"default\"}"


하지만 JSON 직렬화는 문자열 보간을 사용하여 수행되므로 usernameFieldpasswordField에서 신뢰할 수 없는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 검증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입하여 직렬화된 JSON 구조를 변경할 수 있습니다. 이 예제에서 암호 Evil123!를 사용하는 권한 없는 사용자 malloryusernameField 필드에 입력 시 ","role":"admin을 사용자 이름에 추가한 경우 그 결과 JSON은 다음과 같습니다.


{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}


이 직렬화된 JSON 문자열이 NSJSONSerialization.JSONObjectWithData:NSDictionary 개체에 병렬화된 경우 다음과 같습니다.


var error: NSError?
var jsonData : NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonString.dataUsingEncoding(NSUTF8StringEncoding), options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
NSDictionary 개체에 있는 username, passwordrole의 결과 값은 각각 mallory, Evil123!admin입니다. 병렬화된 JSON 값이 유효하다는 추가 확인이 없으면 응용 프로그램이 사용자 mallory "관리자" 권한을 잘못 할당합니다.
desc.dataflow.swift.json_injection