Initial commit
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
= SQL Injection
|
||||
|
||||
== 개요
|
||||
표준개발라이브러리에서는 MyBatis의 PreparedStatement 를 사용한 value injection을 원칙으로 사용하기 때문에 java 혹은 jsp에서 sql을 만들지 않는다면 근본적으로 sql injection이 발생하지 않는다.
|
||||
단, ${} 매핑을 사용 할 경우 SDLComparator를 사용해야 한다.
|
||||
|
||||
=== SQL Injeciton 공격 예
|
||||
MyBatis에서는 #{}, ${} 두 변수 형태를 제공한다. #{}의 경우엔 SQL Injection 공격이 불가하지만 ${}는 값이 직접 매핑되기 때문에 SQL Injeciton에 노출되어 있다.
|
||||
|
||||
${}에 매핑될 값은 사용자가 입력값(파라미터를 변조할수 있는)을 사용할 경우 보안 취약점에 노출되게 된다.
|
||||
|
||||
[source,xml]
|
||||
----
|
||||
<select id="getPerson" parameterType="string" resultType="org.application.vo.Person">
|
||||
SELECT * FROM PERSON WHERE NAME = #{name} AND PHONE LIKE '${phone}';
|
||||
</select>
|
||||
----
|
||||
|
||||
위의 경우
|
||||
|
||||
[source,xml]
|
||||
----
|
||||
SELECT * FROM PERSON WHERE NAME = ? and PHONE LIKE 'A%'; DELETE FROM PERSON; --'
|
||||
----
|
||||
|
||||
실행이 가능하다.
|
||||
|
||||
따라서, ${}에 매핑될 값은 조작이 불가능 하도록 사용자 입력값을 코드로 입력 할 수 있도록 하고, 서버에서 코드에 맞는 스트링을 조합해서 실행 할 수 있도록 해야한다.
|
||||
|
||||
=== SDLComparator 적용
|
||||
SDL에서는 개발자의 시큐어 코딩 실수로 인한 SQL Injection 실행 방지를 위해 MyBatis에서 변수 매핑 전에 허용된 문자만 사용 할 수 있도록 함수를 제공하고 있다.
|
||||
|
||||
.사용방법
|
||||
[source,xml]
|
||||
----
|
||||
<if test="@com.samsung.SdlComparator@isNotEmptyForDynamicSql(orderBy)">
|
||||
ORDER BY ${orderBy}
|
||||
</if>
|
||||
----
|
||||
Reference in New Issue
Block a user