Secure coding

kangjuju·2023년 1월 25일
0

Acorn

목록 보기
8/15

Secure coding 가이드라인

해킹 등 사이버 공격의 원인인 보안취약점을 제거해 안전한 소프트웨어를 개발하는 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();
	}
}

Prepared Statement

  • SQL문장이 미리 컴파일되고, 실행 시간동안 인수 값을 위한 공간을 확보할 수 있다는 점에서 Statement 객체와 다르다.
  • Statement 객체의 SQL은 실행될 때, 매번 서버에서 분석해야하는 반면
    PreparedStatement 객체는 한 번 분석되면 재사용이 용이하다.
  • 각각 인수에 대해 위치홀더(placeholder)를 사용하여 SQL문장을 정의할 수 있게 해준다.
    위치 홀더는 ? 로 표현된다.
  • 동일한 SQL문을 특정 값만 바꾸어서 여러번 실행해야 할 때, 인수가 많아서 SQL 문을 정리해야 될 필요가 있을 때 사용하면 유용하다.

사용법,예제

앞에서 사용했던 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

0개의 댓글