해킹 등 사이버 공격의 원인인 보안취약점을 제거해 안전한 소프트웨어를 개발하는 SW 개발 기법.
conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/test",
"root", "~password~");
Connection사용시 개인의 정보가 코드에 담겨있다.
보안코딩에 위배되는 코드이므로 해당 코드는 별도의 파일로 빼내어 코드를 작성해야한다.
연결정보를 별도의 파일로 빼고, 그 파일을 사용하기 위해 Properties를 import하여 객체를 만들었다.
package pack;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
import javax.annotation.processing.SupportedSourceVersion;
public class Db2Secure {
private Connection conn; <Db연결용 interface>
private Statement stmt; <Sql문 실행>
private ResultSet rs; <select의 결과 접근>
Properties properties = new Properties(); <별도 proper를 사용하기위함>
public Db2Secure() {
try {
properties.load(new FileInputStream("/work/jsou/jpro2/src/pack/test.properties"));
Class.forName(properties.getProperty("driver"));
conn = DriverManager.getConnection(properties.getProperty("url"), properties.getProperty("user"),
properties.getProperty("passwd"));
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from sangdata order by code desc");
int cou = 0;
while (rs.next()) {
System.out.println(rs.getString("code") + " " +
rs.getString("sang") + " " +
rs.getString("su") + " " +
rs.getString("dan"));
cou += 1;
}
System.out.println("건수 : " + cou);
} catch (Exception e) {
} finally {
try {
if (rs != null)
rs.close();
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
} catch (Exception e2) {
}
}
}
public static void main(String[] args) {
new Db2Secure();
}
}
사용법,예제
앞에서 사용했던 Statement stmt는 sql문 작성 후 뒤에 받을 정보를 문자열 더하기 연산으로 완성시켜 실행했다. 이는 SQL Injection 공격에 취약하다.
<[해킹] 이러한 문법은 SQL인젝션 공격에 취약함>
sql = "select * from sangdata where code =" + bun; <!>
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
Prepared Statement의 용도는 많지만, 이러한 취약점을 대응 할 수 있는 "?"연산자를 사용할 수 있기도 하다.
sql = "select * from sangdata where code = ?"; <prepare기능 [?]연산자>
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,bun);
rs = pstmt.executeQuery();
pstmt.setString 에서 첫번째 ?에 bun을 대입하라는 문법.
reference : https://noirstar.tistory.com/264