입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "Buffer Overflows", "Cross-Site Scripting" 공격, "SQL Injection", 그 외 여러 가지가 있습니다.
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String query = "FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
List items = sess.createQuery(query).list();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
에 작은따옴표가 들어 있지 않은 경우에만 정확하게 동작합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name' OR 'a'='a
"를 입력하면 쿼리는 다음과 같이 생성됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
조건을 추가하면 where 절이 항상 true로 평가하기 때문에 쿼리는 훨씬 간단한 다음 쿼리와 논리적으로 동일하게 됩니다.
SELECT * FROM items;
items
테이블에 저장된 모든 항목을 반환합니다.Example 1
에서 생성하여 수행한 쿼리에 또 다른 악성 값이 전달될 때의 결과를 검토합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name'; DELETE FROM items; --
"를 입력하면 쿼리는 다음과 같은 두 개의 쿼리가 됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
에서 본 것과 유사한 속임수를 사용하면 대부분의 공격이 효과를 거둘 수 있습니다. 공격자가 문자열 "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
"를 입력하여 다음 세 가지 유효한 문을 만드는 경우입니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
#
문자를 사용하여 정의됩니다.
<select id="getItems" parameterClass="MyClass" resultClass="items">
SELECT * FROM items WHERE owner = #userName#
</select>
#
문자는 iBatis가 userName
변수를 사용하여 매개 변수화된 쿼리를 만드는 것을 나타냅니다. 그뿐만 아니라 iBatis는 $
문자를 사용하여 변수를 SQL 문에 직접 연결하는 것도 허용함으로써 SQL Injection의 기회를 제공합니다.
<select id="getItems" parameterClass="MyClass" resultClass="items">
SELECT * FROM items WHERE owner = #userName# AND itemname = '$itemName$'
</select>
itemName
에 작은따옴표가 들어 있지 않은 경우에만 정확하게 동작합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 name' OR 'a'='a
를 입력하면 쿼리는 다음과 같이 생성됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
조건을 추가하면 where 절이 항상 true로 평가되기 때문에 쿼리는 훨씬 단순한 다음 쿼리와 논리적으로 동일하게 됩니다.
SELECT * FROM items;
items
테이블에 저장된 모든 항목을 반환합니다.Example 1
에서 생성하여 수행한 쿼리에 또 다른 악성 값이 전달될 때의 결과를 검토합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name'; DELETE FROM items; --
"를 입력하면 쿼리는 다음과 같은 두 개의 쿼리가 됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
에서 본 것과 유사한 속임수를 사용하면 대부분의 공격이 효과를 거둘 수 있습니다. 공격자가 문자열 "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
"를 입력하여 다음 세 가지 유효한 문을 만드는 경우입니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String sql = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
Query query = pm.newQuery(Query.SQL, sql);
query.setClass(Person.class);
List people = (List)query.execute();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
에 작은따옴표가 들어 있지 않은 경우에만 정확하게 동작합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name' OR 'a'='a
"를 입력하면 쿼리는 다음과 같이 생성됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
조건을 추가하면 where 절이 항상 true로 평가하기 때문에 쿼리는 훨씬 간단한 다음 쿼리와 논리적으로 동일하게 됩니다.
SELECT * FROM items;
items
테이블에 저장된 모든 항목을 반환합니다.Example 1
에서 생성하여 수행한 쿼리에 또 다른 악성 값이 전달될 때의 결과를 검토합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name'; DELETE FROM items; --
"를 입력하면 쿼리는 다음과 같은 두 개의 쿼리가 됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
에서 본 것과 유사한 속임수를 사용하면 대부분의 공격이 효과를 거둘 수 있습니다. 공격자가 문자열 "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
"를 입력하여 다음 세 가지 유효한 문을 만드는 경우입니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
가 일치하는 항목만 표시하도록 제한합니다.
...
string userName = ctx.getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
var items = dataContext.ExecuteCommand<Item>(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
에 작은따옴표가 들어 있지 않은 경우에만 정확하게 동작합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name' OR 'a'='a
"를 입력하면 쿼리는 다음과 같이 생성됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
조건을 추가하면 where 절이 항상 true로 평가하기 때문에 쿼리는 훨씬 간단한 다음 쿼리와 논리적으로 동일하게 됩니다.
SELECT * FROM items;
items
테이블에 저장된 모든 항목을 반환합니다.Example 1
에서 생성하여 수행한 쿼리에 또 다른 악성 값이 전달될 때의 결과를 검토합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name'); DELETE FROM items; --
"를 입력하면 쿼리는 다음과 같은 두 개의 쿼리가 됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
에서 본 것과 유사한 속임수를 사용하면 대부분의 공격이 효과를 거둘 수 있습니다. 공격자가 문자열 "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
"를 입력하여 다음 세 가지 유효한 문을 만드는 경우입니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
#
문자를 사용하여 정의됩니다.
<select id="getItems" parameterType="domain.company.MyParamClass" resultType="MyResultMap">
SELECT *
FROM items
WHERE owner = #{userName}
</select>
#
문자는 MyBatis가 userName
변수를 사용하여 매개 변수화된 쿼리를 만드는 것을 나타냅니다. 뿐만 아니라 MyBatis는 $
문자를 사용하여 변수를 SQL 문에 직접 연결하는 것도 허용함으로써 SQL Injection의 기회를 제공합니다.
<select id="getItems" parameterType="domain.company.MyParamClass" resultType="MyResultMap">
SELECT *
FROM items
WHERE owner = #{userName}
AND itemname = ${itemName}
</select>
itemName
에 작은따옴표가 들어 있지 않은 경우에만 정확하게 동작합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 name' OR 'a'='a
를 입력하면 쿼리는 다음과 같이 생성됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
조건을 추가하면 WHERE
절이 항상 true로 평가되기 때문에 쿼리는 훨씬 단순한 다음 쿼리와 논리적으로 동일하게 됩니다.
SELECT * FROM items;
items
테이블에 저장된 모든 항목을 반환합니다.Example 1
에서 생성하여 수행한 쿼리에 또 다른 악성 값이 전달될 때의 결과를 검토합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name'; DELETE FROM items; --
"를 입력하면 쿼리는 다음과 같은 두 개의 쿼리가 됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
에서 본 것과 유사한 속임수를 사용하면 대부분의 공격이 효과를 거둘 수 있습니다. 공격자가 문자열 "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
"를 입력하여 다음 세 가지 유효한 문을 만드는 경우입니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
가 일치하는 항목만 표시하도록 제한합니다.
...
string userName = ctx.GetAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
List items = sess.CreateSQLQuery(query).List();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
ItemName
에 작은따옴표가 들어 있지 않은 경우에만 정확하게 동작합니다. 사용자 이름이 wiley
인 공격자가 ItemName
에 문자열 "name' OR 'a'='a
"를 입력하면 쿼리는 다음과 같이 생성됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
조건을 추가하면 where 절이 항상 true로 평가하기 때문에 쿼리는 훨씬 간단한 다음 쿼리와 논리적으로 동일하게 됩니다.
SELECT * FROM items;
items
테이블에 저장된 모든 항목을 반환합니다.Example 1
에서 생성하여 수행한 쿼리에 또 다른 악성 값이 전달될 때의 결과를 검토합니다. 사용자 이름이 wiley
인 공격자가 ItemName
에 문자열 "name'; DELETE FROM items; --
"를 입력하면 쿼리는 다음과 같은 두 개의 쿼리가 됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
에서 본 것과 유사한 속임수를 사용하면 대부분의 공격이 효과를 거둘 수 있습니다. 공격자가 문자열 "name'; DELETE FROM items; SELECT * FROM items WHERE 'a'='a
"를 입력하여 다음 세 가지 유효한 문을 만드는 경우입니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
가 현재 인증된 사용자의 이름과 일치하는 항목으로 제한합니다.
...
string userName = identity.User;
string itemName = apiGatewayProxyRequest.QueryStringParameters['item'];
string statement = $"SELECT * FROM items WHERE owner = '{userName}' AND itemname = '{itemName}'";
var executeStatementRequest = new ExecuteStatementRequest();
executeStatementRequest.Statement = statement;
var executeStatementResponse = await dynamoDBClient.ExecuteStatementAsync(executeStatementRequest);
return displayResults(executeStatementResponse.Items);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
에 작은따옴표가 들어 있지 않은 경우에만 정확하게 동작합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 name' OR 'a'='a
를 입력하면 쿼리는 다음과 같이 생성됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
조건을 추가하면 where 절이 항상 true로 평가되기 때문에 쿼리는 훨씬 단순한 다음 쿼리와 논리적으로 동일하게 됩니다.owner
가 현재 인증된 사용자의 이름과 일치하는 항목으로 제한합니다.
...
String userName = identity.getUser();
String itemName = apiGatewayProxyRequest.getQueryStringParameters('item');
String statement = String.format("SELECT * FROM items WHERE owner = '%s' AND itemname = '%s'", userName, itemName);
ExecuteStatementRequest executeStatementRequest = new ExecuteStatementRequest();
executeStatementRequest.setStatement(statement);
ExecuteStatementResponse executeStatementResponse = dynamoDBClient.executeStatement(executeStatementRequest);
return displayResults(executeStatementResponse.items());
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
에 작은따옴표가 들어 있지 않은 경우에만 정확하게 동작합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 name' OR 'a'='a
를 입력하면 쿼리는 다음과 같이 생성됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
조건을 추가하면 where 절이 항상 true로 평가되기 때문에 쿼리는 훨씬 단순한 다음 쿼리와 논리적으로 동일하게 됩니다.
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
ResultSet rs = stmt.execute(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
에 작은따옴표가 들어 있지 않은 경우에만 정확하게 동작합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name' OR 'a'='a
"를 입력하면 쿼리는 다음과 같이 생성됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
조건을 추가하면 where 절이 항상 true로 평가하기 때문에 쿼리는 훨씬 간단한 다음 쿼리와 논리적으로 동일하게 됩니다.
SELECT * FROM items;
items
테이블에 저장된 모든 항목을 반환합니다.Example 1
에서 생성하여 수행한 쿼리에 또 다른 악성 값이 전달될 때의 결과를 검토합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name'; DELETE FROM items; --
"를 입력하면 쿼리는 다음과 같은 두 개의 쿼리가 됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
에서 사용된 것과 유사한 속임수를 사용하면 대부분의 공격이 효과를 거둘 수 있습니다. 공격자가 문자열 "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
"를 입력하여 다음 세 가지 유효한 문을 만드는 경우입니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
Example 1
을 Android 플랫폼에 맞게 조정합니다.
...
PasswordAuthentication pa = authenticator.getPasswordAuthentication();
String userName = pa.getUserName();
String itemName = this.getIntent().getExtras().getString("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
SQLiteDatabase db = this.openOrCreateDatabase("DB", MODE_PRIVATE, null);
Cursor c = db.rawQuery(query, null);
...
mysql_real_escape_string()
같은 인코딩 함수를 사용하면 일부 SQL Injection 취약점이 방지되지만 전부 방지되지는 않습니다. 이러한 인코딩 함수를 사용하는 것은 약한 거부 목록을 사용하여 SQL Injection을 차단하는 것과 동일하며 공격자가 문의 의미를 수정하거나 임의의 SQL 명령을 실행하는 것이 가능할 수 있습니다. 동적으로 해석되는 코드의 지정된 섹션 내에서 입력이 표시되는 위치를 정적으로 확인하는 것이 항상 가능하지는 않으므로 Fortify Secure Coding Rulepacks는 해당 컨텍스트 내에서 검증을 통해 충분히 SQL Injection을 차단할 수 있는 경우에도 검증된 동적 SQL 데이터를 "SQL Injection: Poor Validation" 이슈로 표시할 수 있습니다.mysqli_real_escape_string()
의 동작을 보여줍니다. SQL 모드가 "NO_BACKSLASH_ESCAPES"로 설정된 경우 백슬래시 문자가 이스케이프 문자[5]가 아닌 일반 문자로 처리됩니다. mysqli_real_escape_string()
은 이를 고려하므로 다음 쿼리는 SQL Injection에 취약해집니다. 데이터베이스 구성으로 인해 "
가 더 이상 \"
로 이스케이프 처리되지 않기 때문입니다.
mysqli_query($mysqli, 'SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
...
$userName = mysqli_real_escape_string($mysqli, $_POST['userName']);
$pass = mysqli_real_escape_string($mysqli, $_POST['pass']);
$query = 'SELECT * FROM users WHERE userName="' . $userName . '"AND pass="' . $pass. '";';
$result = mysqli_query($mysqli, $query);
...
password
필드를 비워 두고 " OR 1=1;--
을 userName
으로 입력하면 따옴표가 이스케이프 처리되지 않고 다음과 같은 쿼리가 생성됩니다.
SELECT * FROM users
WHERE userName = ""
OR 1=1;
-- "AND pass="";
OR 1=1
로 인해 where 절이 항상 true로 평가되고 하이픈 두 개로 인해 나머지 문이 주석으로 처리되므로 이 쿼리는 훨씬 더 단순한 쿼리와 논리적으로 동일해집니다.
SELECT * FROM users;
owner
가 일치하는 항목만 표시하도록 제한합니다.
...
string userName = ctx.getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
IDataReader responseReader = new InlineQuery().ExecuteReader(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
에 작은따옴표가 들어 있지 않은 경우에만 정확하게 동작합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name' OR 'a'='a
"를 입력하면 쿼리는 다음과 같이 생성됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
조건을 추가하면 where 절이 항상 true로 평가하기 때문에 쿼리는 훨씬 간단한 다음 쿼리와 논리적으로 동일하게 됩니다.
SELECT * FROM items;
items
테이블에 저장된 모든 항목을 반환합니다.Example 1
에서 생성하여 수행한 쿼리에 또 다른 악성 값이 전달될 때의 결과를 검토합니다. 사용자 이름이 wiley
인 공격자가 itemName
에 문자열 "name'); DELETE FROM items; --
"를 입력하면 쿼리는 다음과 같은 두 개의 쿼리가 됩니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
에서 본 것과 유사한 속임수를 사용하면 대부분의 공격이 효과를 거둘 수 있습니다. 공격자가 문자열 "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
"를 입력하여 다음 세 가지 유효한 문을 만드는 경우입니다.
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
cfgfile
에서 읽어 strcpy()
를 사용하여 입력을 inputbuf
에 복사합니다. 코드는 inputbuf
에 항상 null 종결자가 있다고 잘못 가정합니다.
#define MAXLEN 1024
...
char *pathbuf[MAXLEN];
...
read(cfgfile,inputbuf,MAXLEN); //does not null-terminate
strcpy(pathbuf,inputbuf); //requires null-terminated input
...
Example 1
의 코드는 cfgfile
에서 읽은 데이터가 예상대로 디스크에서 null로 끝나면 정확하게 동작합니다. 하지만 공격자가 이 입력을 예상하는 null
문자를 포함하지 않도록 수정할 수 있다면 strcpy()
호출은 임의의 null
문자를 만날 때까지 계속 메모리에서 복사합니다. 이는 대상 버퍼에 오버플로를 일으킬 가능성이 크며, 공격자가 inputbuf
바로 다음의 메모리 내용을 제어할 수 있게 되면 응용 프로그램이 buffer overflow 공격에 취약해질 수 있습니다.readlink()
는 버퍼 path
에 저장된 심볼 링크의 이름을 확장하여 심볼 링크에서 참조하는 파일의 절대 경로가 버퍼 buf
에 포함되도록 합니다. 그런 다음, 결과 값의 길이를 strlen()
을 사용하여 계산합니다.
...
char buf[MAXPATH];
...
readlink(path, buf, MAXPATH);
int length = strlen(buf);
...
Example 2
의 코드는 readlink()
를 통해 buf
로 읽은 값이 null로 끝나지 않기 때문에 올바로 동작하지 않습니다. 테스트에서 buf
및 버퍼 바로 다음 메모리의 사용되지 않는 내용이 null
일 수 있기 때문에 이런 취약점을 발견하지 못할 수 있으므로 strlen()
이 올바로 동작하는 것처럼 보입니다. 하지만, 실제 상황에서는 strlen()
이 스택에서 임의의 null
문자를 발견할 때까지 계속 메모리를 탐색하기 때문에 결국 buf
의 크기보다 훨씬 큰 length
값이 발생하고 이후에 이 값을 사용하면 buffer overflow가 발생할 수 있습니다.snprintf()
를 사용하여 사용자 입력 문자열을 복사하고 여러 출력 문자열에 넣습니다. sprintf()
와 비교하여 추가 가드레일, 특히 최대 출력 크기의 지정을 제공함에도 불구하고 snprintf()
함수는 지정된 출력 크기가 예상 입력보다 큰 경우 여전히 문자열 종료 오류가 발생할 수 있습니다. 문자열 종료 오류는 메모리 누수 또는 buffer overflow와 같은 다운스트림 문제로 이어질 수 있습니다.
...
char no_null_term[5] = getUserInput();
char output_1[20];
snprintf(output_1, 20, "%s", no_null_term);
char output_2[20];
snprintf(output_2, 20, "%s", no_null_term);
printf("%s\n", output_1);
printf("%s\n", output_2);
...
Example 3
의 코드는 메모리 누수를 보여줍니다. output_2
가 no_null_term
으로 채워진 경우 snprintf()
는 null 문자가 나타나거나 지정된 크기 제한에 도달할 때까지 no_null_term
위치에서 읽어야 합니다. no_null_term
에서 종료 문자가 없으므로 snprintf
는 결국 snprintf()
의 첫 번째 호출에서 제공되는 null로 종료되는 문자에 도달하는 output_1
의 데이터를 계속해서 읽습니다. 메모리 누수는 output_2
의 printf()
에서 보여 주며, 여기에는 no_null_term
의 문자 시퀀스가 두 번 포함됩니다.null
문자로 끝나는 데이터를 포함한 메모리의 한 부분으로 표현합니다. 이전 문자열 처리 메서드는 자주 이 null
문자를 사용하여 문자열 길이를 결정합니다. null 종결자가 없는 버퍼가 이 함수 중 하나로 전달될 경우, 해당 함수는 버퍼의 끝을 지나 계속 읽습니다.ActionClass-validation.xml
에 둘 이상 있습니다. 이름이 같은 검증 정의가 중복되어 있으면 예기치 않은 동작이 발생할 수 있습니다.
<field name="emailField">
<field-validator type="email" short-circuit="true">
<message>You must enter a value for email.</message>
</field-validator>
<field-validator type="email" short-circuit="true">
<message>Not a valid email.</message>
</field-validator>
</field>
validators.xml
에서 둘 이상의 유효성 검사기 정의가 발견되었습니다. 이름이 같은 검증 정의가 여러 개 있으면 예기치 않은 동작이 발생할 수 있습니다.validators.xml
에서 정의할 것을 요구합니다. 유효성 검사기 참조가 누락되어 있으면 검증이 최신 상태가 아님을 나타냅니다.validators.xml
에서 정의되지 않았습니다.
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
</validators>
<form-validation>
<formset>
<form name="ProjectForm">
...
</form>
<form name="ProjectForm">
...
</form>
</formset>
</form-validation>